保存和读取游戏对象

问题描述 投票:0回答:1

我希望用户能够将特定父对象的子游戏对象的状态(转换数据)保存到文本文件,然后下次能够从文件中读取并在运行时重新创建游戏对象。当用户点击保存按钮时,程序会循环遍历父级的子游戏对象,并将每个对象的状态写入文件。我创建了一个名为 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 数据?或者有更好的方法吗?

c# file unity-game-engine filestream
1个回答
1
投票

首先停止使用

BinaryFormatter


然后例如切换到 JSON (

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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.