序列化数组从文本文件到检查器(Unity 5与c#)

本文关键字:Unity 检查 数组 文本 文件 序列化 | 更新日期: 2023-09-27 17:51:27

我正在努力保存从长文本文件中提取的数组。我使用foreach循环来获取数组,但我有点迷失了从这里去哪里。我可以使用[serializedfield]在检查器中显示坐标X,Y,Z,但需要弄清楚如何保存循环中的数据。任何能让我找到正确方向的建议都会很棒!
提前谢谢你。下面是我的代码:

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]);
}
}

序列化数组从文本文件到检查器(Unity 5与c#)

我有个建议。您可以使用XML-Serialization将具有给定数据集的整个类保存到xml文件中。在下面的例子中,我包含了2种保存和检索数据的方法:我把数组做得更小一些以便能显示输出。但它应该工作良好与较大的数组也:)有一件事很重要:必须将数组声明为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方法时,你会得到一个包含数组中所有值的Object。希望这对你有帮助

编辑:要使用StreamWriter,您需要包含命名空间:

using System.IO;

使用XmlSerializer需要包含命名空间:

using System.Xml.Serialization;