如何一次将数据写入文本文件?以及如何读回并分配?

时间:2018-08-13 19:28:01

标签: c# unity3d

if (GUILayout.Button("Copy settings"))
        {
            var selection = Selection.gameObjects.ToList();

            for (int i = selection.Count - 1; i >= 0; --i)
            {
                var selected = selection[i];

                WriteDataToFile("Transform " + i.ToString() + "  Name ==> " + selected.name);
                WriteDataToFile("************************" +
                    "********************");
                if (selected.transform.parent != null)
                    WriteDataToFile(selected.transform.parent.ToString());
                WriteDataToFile("local position " + selected.transform.localPosition.ToString());
                WriteDataToFile("local rotation " + selected.transform.localRotation.ToString());
                WriteDataToFile("local scale " + selected.transform.localScale.ToString());
                WriteDataToFile("************************" +
                    "********************");
                WriteDataToFile(" ");
            }
        }

和WriteDataToFile:

private void WriteDataToFile(string line)
    {
        string path = "Assets/Resources/test.txt";

        StreamWriter writer = new StreamWriter(path, true);
        writer.WriteLine(line);
        writer.Close();
    }

首先,我要检查是否单击更多然后在按钮上单击一次,并且它是相同的数据:名称位置旋转比例不再写。

第二个如何读取数据行并将其分配给对象?还有名字。因此,如果原始对象是父级位置旋转和缩放,则将以相同的父级名称创建一个新对象。

这就是我现在的阅读方式:

void ReadString()
{
    string path = "Assets/Resources/test.txt";

    StreamReader reader = new StreamReader(path); 
    Debug.Log(reader.ReadToEnd());
    reader.Close();
}

1 个答案:

答案 0 :(得分:1)

要将新数据添加到尚不存在的文件中:

private void WriteDataToFile(string line)
{
    string path = "Assets/Resources/test.txt";
    string[] text = new string[];
    if(File.Exists(path))
    {
       text = File.ReadAllLines(path);
       if(!text.Contains(line))
          File.AppendAllText(path, Line);
    }

}

如果您不限于使用文本文件来存储和检索数据,那么我建议您找到一种写入所有这些数据的方法:

WriteDataToFile("Transform " + i.ToString() + "  Name ==> " + selected.name);
            WriteDataToFile("************************" +
                "********************");
            if (selected.transform.parent != null)
                WriteDataToFile(selected.transform.parent.ToString());
            WriteDataToFile("local position " + selected.transform.localPosition.ToString());
            WriteDataToFile("local rotation " + selected.transform.localRotation.ToString());
            WriteDataToFile("local scale " + selected.transform.localScale.ToString());
            WriteDataToFile("************************" +
                "********************");
            WriteDataToFile(" ");

减少写入次数,因为打开和关闭文件可能会很昂贵。也许是这样的:

var selected = selection[i].transform;
string toWrite = $"{parent}:{localPosition}:{localRotation}:{localScale}";
WriteDataToFile(toWrite);

这意味着检索将很简单-(不确定类型)

private gameObject GetObjectFromFile(Path, Id)
{
   string[] text = new string[];
   if(File.Exists(path))
   {
   text = File.ReadAllLines(path);
   foreach(string s in text)
   {
      if(s.Split(':')[0] == Id.ToString())
      {
         text = s.Split(':');
         break;
      }
   }
   var Id = Convert.ToInt32(text[0]);
   var localPosition = Convert.ToInt32(text[1]);
   var localRotation = Convert.ToInt32(text[2]);
   var localScale = Convert.ToInt32(text[3]);
   return new gameObject(Id, localPosition, localRotation, localScale);
}