2016-07-05 4 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私は永続的なデータパスにdata[0]とファイルを持っていますされ、ここでシナリオ 2からジャンプ降伏事の後に予想されるとして、それは今ではすべてが素晴らしい仕事

Problem

+1

まさにここで問題とは何ですか?すべてが期待通りに機能すれば...なぜあなたは助けを求めていますか? –

+2

ループ構造が複雑すぎるようです。あなたが実際にやりたいことがあれば、条件が成立して途中で結果を出すまで反復しないのはなぜですか?それ以外にも、実際に何を求めているのかははっきりしておらず、あなたのコードは実際に問題にならないあらゆる種類の状態を参照しています。おそらく[SSCCE](http://sscce.org/)これは、アプリケーションのこのスニペットをポストするのではなく、問題を示しています。 –

+1

これはあなたの問題です: 'APD = new string [loadNum + = 1]'だが、あなたには 'loadNum + = 1;'もあります。さて、配列宣言の中で変数を代入できるのかどうかはわかりませんでしたが、テストしたところで動作しています。 @LasseV。 – Quantic

答えて

1

が までそれをループすることにより、最大数に達した私のフォルダ内のすべてのファイルをロードすることです。

コードがうまく見えません。ロットのメモリ割り当てと不要なコルーチン関数コールの繰り返し。 System.IO.Directory.GetFiles()を使用してディレクトリ内のファイルのすべてのパスを取得し、それを配列に格納するだけです。

APDはあなたが何をしているのか分からないので、forループの前に返されたアイテム数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; 
    } 
} 

あなただけの代わりに、フォルダ内のすべてのファイルの拡張子.octanumOfSaveFile_O1からファイルを読み込みたい場合は、その後、以下のコードはどのように見えるかです。これはあなたのファイルが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];

関連する問題