2017-07-04 10 views
0

Unityで基本的な2Dプラットフォームを作成していますので、各レベルを完了するのにかかる時間を節約できますUI要素に最速の時刻を表示します。私は時間をテキストファイルに書いています(これはうまくいきます)。そして、リストからすべての行をリストに読み込みます。そこから最低の値などが見つかります。しかし、私のコードはうまくいかず、次のようになります他のスクリプトから関数を呼び出すときにエラーが発生します。私はC#の初心者ですので、誰でも私に与えることができるどんな助けにも大いに感謝します!オブジェクトの現在の状態(System.Iinq)のために操作が無効です

ありがとうございます!

フルエラーメッセージ

例外InvalidOperationException:操作によるオブジェクト System.Linq.Enumerable.Iterate [シングル、シングル](IEnumerableを1 source, Single initValue, System.Func 3セレクタ) System.Linqの現在の状態に有効ではありません(Asset/Scripts/Highscores/SaveScores.cs:73) GameManager.Update()(Assets/Scripts/GameManager.csの場合).Enumerable.Min(IEnumerable`1 source) SaveScores.ReadData(System.String LevelLoaded) 45)

C頌歌

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
using System.IO; 
using System; 
using System.Linq; 

public class SaveScores : MonoBehaviour { 

void Start() 
{ 
    //ReadData(); 
} 

public static void WriteData(float time, string LevelLoaded) 
{ 
    try 
    { 
     //Debug.Log("Saving time"); 
     StreamWriter sw = new StreamWriter(@"C:\Users\Theo\Documents\Unity Projects\V13\Platformer\Assets\Scripts\Highscores\Scores.txt", true); 
     sw.WriteLine(LevelLoaded + " " + time); 

     sw.Close(); 
    } 
    catch(Exception e) 
    { 
     Console.WriteLine("Exception: " + e.Message); 
    } 
    finally 
    { 
     Console.WriteLine("Executing final block"); 
    } 
} 

public static void ReadData(string LevelLoaded) 
{ 
    List <float> timesLevel1 = new List<float>(); 
    List <float> timesLevel2 = new List<float>(); 
    List <float> timesLevel3 = new List<float>(); 

    try 
    { 
     var lines = File.ReadAllLines(@"C:\Users\Theo\Documents\Unity Projects\V13\Platformer\Assets\Scripts\Highscores\Scores.txt"); 

     foreach (var line in lines) 
     { 
      if (line.Contains("Level1")) 
      { 
       timesLevel1.Add(Convert.ToSingle(line)); 
      } 
      else if (line.Contains("Level2")) 
      { 
       timesLevel2.Add(Convert.ToSingle(line)); 
      } 
      else if (line.Contains("Level3")) 
      { 
       timesLevel3.Add(Convert.ToSingle(line)); 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine("Exception: " + e.Message); 
    } 
    finally 
    { 
     Console.WriteLine("Executing final block"); 
    } 

    switch (LevelLoaded) 
    { 
     case "Level1": 
      UIManager.lowestTime = timesLevel1.Min(); 
      break; 
     case "Level2": 
      UIManager.lowestTime = timesLevel2.Min(); 
      break; 
     case "Level3": 
      UIManager.lowestTime = timesLevel3.Min(); 
      break; 
    } 

} 

}

答えて

1

あなたはEnumerable.Min<float>https://msdn.microsoft.com/en-us/library/bb361144(v=vs.110).aspx)のドキュメントを見ればあなたは「例外」の下で、それはInvalidOperationExceptionを一覧表示し、その理由を与えていることがわかります:「ソース要素が含まれていない」と。

あなたが探しているリストには要素が含まれていない可能性があります。

このリストに何が入っているかを見てみると、あなたがライン上にあると予想しているものに混乱があるようです。 line.Contains("Level1")のテストを行いますが、成功した場合はConvert.ToSingle(line)を呼び出します。その行に文字列データがあると失敗します(たとえば、lineにその文字列が含まれていて、変換が失敗した場合)。

したがって、あなたが読んでいるファイルの形式は、あなたのリストが空になってこのエラーにつながることになるとは思われません。

+0

ありがとう、ただ実現しました。私が全ラインで読んでいることを忘れて、私は複数のレベルの時間を節約できるように、各ラインに "LevelX"を追加しました。ですから、私はこの接頭辞を何とか除外して、リストに時間を追加する必要があります。 –

関連する問題