2016-06-28 7 views
0

長いテキストファイルから取り出した配列の保存に取り組んでいます。私はforeachループを使って配列を取得しましたが、ここからどこに行くのかが少し分かりません。私は[シリアル化されたフィールド]を使用してインスペクタの座標X、Y、Zを表示できますが、ループからデータを保存する方法を理解する必要があります。正しい方向に私を得るためのアドバイスは素晴らしいでしょう!
ありがとうございます。ここに私のコードはあります:テキストファイルから検査官に配列をシリアライズする(Unity 5 with c#)

using UnityEngine; 
using System; 
using System.Collections; 
using System.Collections.Generic; 

[Serializable] 
public class MultiArrayList : MonoBehaviour { 

public TextAsset datafile; 
private int i; 
//private float[,] coordinates; 
[SerializeField] private float[] coordX; 
[SerializeField] private float[] coordY; 
[SerializeField] private float[] coordZ; 
[SerializeField] private float[] intensity; 
//private Vector3 verts; 

// Use this for initialization 
void Start() { 

    string[] dataLines = datafile.text.Split ('\n'); 
    string[] lineValues; 
    //print (dataLines.Length); 
    i=0; 

    //float[,] coordinates = new float[6853, 3]; 
    float[] coordX = new float[6853]; 
    float[] coordY = new float[6853]; 
    float[] coordZ = new float[6853]; 
    float[] intensity = new float[6853]; 
    foreach (string line in dataLines) { 

     lineValues = line.Split (' '); 
     float coordinateX = float.Parse (lineValues [0]); 
     float coordinateY = float.Parse (lineValues [1]); 
     float coordinateZ = float.Parse (lineValues [2]); 
     float intens = float.Parse (lineValues [3]); 

     coordX [i] = coordinateX; 
     coordY [i] = coordinateY; 
     coordZ [i] = coordinateZ; 

     //coordinates [i, 0] = coordinateX; 
     //coordinates [i, 1] = coordinateY; 
     //coordinates [i, 2] = coordinateZ; 

     intensity [i] = intens; 

     //print (coordX [i]); 

     i++; 

     //Vector3 coordinates = new Vector3 (coordinateX,coordinateY,coordinateZ); 
     //print (coordinates); 

    } 


} 

void OnGUI() 
{ 
    Display (coordX [i]); 
} 

} 
+0

なぜドン」クラスフィールド配列を使用しますが、 'start'メソッドで同じ名前の新しいものを作成しますか? –

答えて

1

ここに提案があります。 XML-Serializationを使用すると、与えられたデータセットを持つクラス全体をXMLファイルに保存できます。以下の例では、データの保存と検索のための2つのメソッドが含まれています。 出力を表示できるように、配列を少し小さくしました。しかし、大きな配列でもうまく動作するはずです:) 重要なことは1つです。配列をpublicとして宣言する必要があります。さもなければ、彼らはファイルに終わることはありません。

public class MultiArrayList 
{ 

    private int i = 0; 
    //private float[,] coordinates; 
    public int MyProperty { get; set; } 
    public float[] coordX { get; set; } 
    public float[] coordY { get; set; } 
    public float[] coordZ { get; set; } 
    public float[] intensity { get; set; } 
    //private Vector3 verts; 

    // Use this for initialization 
    public void Start() 
    { 
     string test = "1 2 3 99\n4 5 6 99\n7 89 90 99"; 
     string[] dataLines = test.Split('\n'); 
     string[] lineValues; 
     //print (dataLines.Length); 
     i = 0; 

     //float[,] coordinates = new float[6853, 3]; 
     coordX = new float[4]; 
     coordY = new float[4]; 
     coordZ = new float[4]; 
     intensity = new float[4]; 
     foreach (string line in dataLines) 
     { 

      lineValues = line.Split(' '); 
      float coordinateX = float.Parse(lineValues[0]); 
      float coordinateY = float.Parse(lineValues[1]); 
      float coordinateZ = float.Parse(lineValues[2]); 
      float intens = float.Parse(lineValues[3]); 

      coordX[i] = coordinateX; 
      coordY[i] = coordinateY; 
      coordZ[i] = coordinateZ; 


      intensity[i] = intens; 

      i++; 

     } 

     // save the entire class with the results. 
     save("test.xml"); 

    } 


    public void save(string fileName) 
    { 
     using (var writer = new StreamWriter(fileName)) 
     { 
      // EDIT: got lost during copy paste 
      var serializer = new XmlSerializer(this.GetType()); 

      serializer.Serialize(writer, this); 

      writer.Flush(); 
     } 
    } 


    public static MultiArrayList Load(string FileName) 
    { 
     MultiArrayList t = new MultiArrayList(); 

     using (var stream = File.OpenRead(FileName))  
     { 
      var serializer = new XmlSerializer(typeof(MultiArrayList)); 
      t = serializer.Deserialize(stream) as MultiArrayList; 

     } 

     return t; 
    } 

} 

これは、あなたが得る出力されます:

<?xml version="1.0" encoding="utf-8"?> 
<MultiArrayList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <MyProperty>0</MyProperty> 
    <coordX> 
    <float>1</float> 
    <float>4</float> 
    <float>7</float> 
    <float>0</float> 
    </coordX> 
    <coordY> 
    <float>2</float> 
    <float>5</float> 
    <float>89</float> 
    <float>0</float> 
    </coordY> 
    <coordZ> 
    <float>3</float> 
    <float>6</float> 
    <float>90</float> 
    <float>0</float> 
    </coordZ> 
    <intensity> 
    <float>99</float> 
    <float>99</float> 
    <float>99</float> 
    <float>0</float> 
    </intensity> 
</MultiArrayList> 

あなたはloadメソッドを使用すると、あなたの配列内のすべての値を持つオブジェクトを取得します。 希望これは

EDIT助けることができます:XmlSerializer名前空間を含める必要が使用する

using System.IO; 

StreamWriter名前空間を含める必要が使用する を

using System.Xml.Serialization; 
+0

ありがとうございました!私はこれを見てみましょう! – jrogers12

+0

また、私はストリームリーダ/ライタに慣れていません。私のスクリプトでこれを動作させるには、どのアセンブリリファレンスが必要ですか?ありがとうございました! – jrogers12

+0

@ jrogers12申し訳ありません。私はあなたが含まなければならない名前空間を編集しました。 –

関連する問題