2016-07-05 72 views
0

我可能有点麻烦我假设只是一个简单的 错误,但我找不到解决方案,甚至更糟糕的错误, 现在我想要做的是通过循环加载我的文件夹中的所有文件直到最大数达到Unity3D中的循环功能(0 + 1 = 2)?

IEnumerator loadData() 
{ 
    Debug.Log (loadNum); 
    if (File.Exists (Application.persistentDataPath + "/data[" + loadNum + "].octa")) { 
     BinaryFormatter loadData = new BinaryFormatter(); 
     FileStream dataFile = File.Open (Application.persistentDataPath + "/data[" + loadNum + "].octa", FileMode.Open); 
     playerData pData = (playerData)loadData.Deserialize (dataFile); 
     dataFile.Close(); 

     name_O = pData.name; 
     job_O = pData.job; 
     difficulty_O = pData.difficulty; 

     rawAPD = name_O + "/" + job_O.ToString() + "/" + difficulty_O.ToString(); 
     APD = new string[loadNum += 1]; 

     for (var i = 0; i <= loadNum && i < loadNum; i++) 
     { 
      if (APD [i] == null) 
      { 
       APD [i] = rawAPD; 
      } 

      break; 
     } 

     yield return new WaitForSeconds (1); 
     if (loadNum != numOfSaveFile_O) 
     { 
      Debug.Log ("meh"); 
      loadNum += 1; 
      reLoop(); 
     } 
    } 
    else 
    { 
     if (loadNum != numOfSaveFile_O) 
     { 
      loadNum += 1; 
      reLoop(); 
     } 
    } 
} 

void reLoop() 
{ 
    StartCoroutine (loadData()); 
} 

现在一切工作的伟大产量事情 数量从0到2 这里我有data[0]和文件在我的持久性数据路径的情况下跳后如预期

Problem

+1

到底是什么问题吗?如果一切按预期工作......你为什么要求帮助? –

+2

你的循环结构似乎...太复杂。为什么你不迭代,直到一个条件为真,并且一路上产生结果,如果这就是你真正想要做的事情?除此之外,你实际要问的东西还不清楚,你的代码引用了实际上并不存在的各种状态 - 你应该考虑创建一个[SSCCE](http://sscce.org/)这表明问题,而不是张贴您的应用程序的这个片段。 –

+1

很确定这是你的问题:'APD = new string [loadNum + = 1]',但你也有'loadNum + = 1;'。顺便说一句,我不知道你可以在数组声明中分配变量,但我只是测试它,它的工作原理。 – Quantic

回答

1

我试图做的是通过循环它加载我的文件夹中的所有文件,直到 最大数量达到了。

您的代码看起来不太好。 Lot的内存分配和不必要的重复协程函数调用。只需使用System.IO.Directory.GetFiles()即可获取目录中文件的所有路径,然后将其存储在数组中。

我不知道APD是从你在做什么,你必须初始化的大小与012循环之前返回的项目数System.IO.Directory.GetFiles()

然后,您可以使用for循环遍历数组并读取文件。只需调用一次下面的函数即可。

IEnumerator loadData() 
{ 
    string fileDir = Application.persistentDataPath; 

    //Get All Files Path in in the Directory 
    string[] filePath = System.IO.Directory.GetFiles(fileDir); 

    //Initialize APD with the number of items in filePath 
    APD = new string[filePath.Length]; 

    //Loop through them and read what's in there 
    for (int i = 0; i < filePath.Length; i++) 
    { 
     if ((i + 1) % 5 == 0) 
     { 
      yield return null;// Wait every after 5 file read 
     } 

     BinaryFormatter loadData = new BinaryFormatter(); 
     FileStream dataFile = File.Open(filePath[i], FileMode.Open); //Open File 
     playerData pData = (playerData)loadData.Deserialize(dataFile); 
     dataFile.Close(); 

     name_O = pData.name; 
     job_O = pData.job; 
     difficulty_O = pData.difficulty; 

     rawAPD = name_O + "/" + job_O.ToString() + "/" + difficulty_O.ToString(); 
     APD[i] = rawAPD; 
    } 
} 

如果你只想从1.octa延伸,而不是在文件夹中的所有文件读取文件numOfSaveFile_O,然后下面是你的代码应该是什么样子。这是假设你的文件被命名为喜欢data[0].octadata[1].octadata[2].octadata[3].octa ....

IEnumerator loadData2() 
{ 
    string fileDir = Application.persistentDataPath; 
    int APDIndex = 0; //Only incremented if file exist 

    APD = new string[numOfSaveFile_O]; 
    loadNum = 0; //File starts at 0 

    while (loadNum < numOfSaveFile_O) 
    { 
     string filePath = fileDir + "/data[" + loadNum + "].octa"; 

     if (File.Exists(filePath)) 
     { 
      Debug.Log(loadNum); 

      BinaryFormatter loadData = new BinaryFormatter(); 
      FileStream dataFile = File.Open(filePath, FileMode.Open); //Open File 
      playerData pData = (playerData)loadData.Deserialize(dataFile); 
      dataFile.Close(); 

      name_O = pData.name; 
      job_O = pData.job; 
      difficulty_O = pData.difficulty; 

      rawAPD = name_O + "/" + job_O.ToString() + "/" + difficulty_O.ToString(); 
      APD[APDIndex] = rawAPD; 
      APDIndex++; 
     } 
     loadNum++; 
     yield return null; //Don't freeze Unity 
    } 
} 
0

从评论看来,这是你所需要的;更改此设置:

APD = new string[loadNum += 1];

这样:

APD = new string[loadNum + 1];