我希望用户能够将特定父对象的子游戏对象的状态(转换数据)保存到文本文件,然后下次能够从文件中读取并在运行时重新创建游戏对象。当用户点击保存按钮时,程序会循环遍历父级的子游戏对象,并将每个对象的状态写入文件。我创建了一个名为 ItemSettings 的普通类(不是 MonoBehaviour),它是我的游戏对象类中的一个变量。我将此 ItemSettings 设为可序列化。
我将信息写入文件如下:
public void SaveProject()
{
string path = "D:/Unity/test.txt";
FileStream file;
if (File.Exists(path)) file = File.OpenWrite(path);
else file = File.Create(path);
BinaryFormatter bf = new BinaryFormatter();
foreach (Transform g in cupboard.transform)
{
CubeObject cubeObject = g.GetComponent<CubeObject>();
if (cubeObject)
{
bf.Serialize(file, cubeObject.GetSettings());
}
}
file.Close();
}
我尝试按如下方式读取文件:
public void LoadFile()
{
string destination = "D:/Unity/test.txt";
FileStream file;
if (File.Exists(destination)) file = File.OpenRead(destination);
else
{
Debug.LogError("File not found");
return;
}
BinaryFormatter bf = new BinaryFormatter();
ItemSettings data = (ItemSettings)bf.Deserialize(file);
// Wants to do the following:
// for each ItemSetting in file instantiate an ItemSettings object
file.Close();
}
但是我不确定如何从包含多个 ItemSettings 数据的文件中读取。如何循环遍历它并一次读取一个 ItemSettings 数据?或者有更好的方法吗?
首先停止使用
BinaryFormatter
!
com.unity.nuget.newtonsoft-json
),您不想将多个单独的对象序列化到一个文件流中,而是将它们全部添加到列表/数组中并序列化该对象。
=> 您可以反序列化为列表/数组,对其进行迭代并根据带有组件的游戏对象进行实例化和初始化
类似的东西(例如使用提到的 Newtonsoft Json.Net)
private readonly string path = Path.Combine(Application.persistentDataPath, "test.json");
public void SaveProject()
{
var settings = new List<YOUR_SETTINGS_TYPE>(cupboard.transform.childCount);
foreach (Transform g in cupboard.transform)
{
if(g.TryGetComponent<CubeObject>(out var cubeObject))
{
settings.Add(cubeObject.Settings)
}
}
var json = JsonConvert.SerializeObject(settings);
File.WriteAllText(path, json);
}
public void LoadFile()
{
if(!File.Exists(path))
{
Debug.LogWarning($"No settings file found at \"{path}\"");
return;
}
var json = File.ReadAllText(path);
var settings = JsonConvert.DeserializeObject<List<YOUR_SETTINGS_TYPE>>(json);
foreach(var setting in settings)
{
// Todo Instantiate (probably from prefab) and apply setting
}
}