您将如何存储这些数据

时间:2019-05-10 03:29:17

标签: c# json unity3d save load

我有一个游戏,我需要存储以下数据:

  • 国家
  • 城市
  • 级别

有5个国家/地区,每个国家5个城市,每个城市x个级别。

存储这些数据的最佳方法是什么,我希望存储关卡详细信息,例如完成,花费的时间等

然后我要通过Leveldata [countryindex,cityindex]访问级别数据。

我想到了多维列表或字典,但想知道你们认为最佳实践是什么吗?

我还需要将此数据保存为JSON。

谢谢

2 个答案:

答案 0 :(得分:1)

基里尔·波兰丘克(Kirill Polishchuk)提到的类的结构,标记为可序列化,但是带有一些数组运算符的重载将满足您的需求。

然后,您可以使用Unity内置的JsonUtility序列化为json并写入磁盘(或PlayerPrefs作为字符串)。在下面的代码中,我将一个Save and Load方法添加到为您执行此操作的LevelData类中。

tail -f <logfile>

您可能需要添加用于创建国家和城市对象的设置器。或者,如果您将LevelData作为公共变量添加到脚本中,则该结构将在Unity编辑器中可见。

并添加和保存级别:

[System.Serializable]
public class Level
{
    public int Score;
    // ...
}

[System.Serializable]
public class City
{
    public List<Level> Levels = new List<Level>();
}

[System.Serializable]
public class Country
{
    public List<City> Cities = new List<City>();

    public City this[int cityIndex]
    {
        get
        {
            if (cityIndex < 0 || cityIndex >= Cities.Count)
            {
                return null;
            }
            else
            {
                return Cities[cityIndex];
            }
        }
    }
}

[System.Serializable]
public class LevelData
{
    public List<Country> Countries = new List<Country>();

    public List<Level> this[int countryIndex, int cityIndex]
    {
        get
        {
            if (countryIndex < 0 || countryIndex >= Countries.Count)
            {
                return null;
            }
            else
            {
                City city = Countries[countryIndex][cityIndex];
                if (city != null)
                {
                    return city.Levels;
                }
                else
                {
                    return null;
                }
            }

        }
    }

    public void Save(string path)
    {
        string json = JsonUtility.ToJson(this);

        // Note: add IO exception handling here!
        System.IO.File.WriteAllText(path, json);
    }

    public static LevelData Load(string path)
    {
        // Note: add check that the path exists, and also a try/catch for parse errors
        LevelData data = JsonUtility.FromJson<LevelData>(path);

        if (data != null)
        {
            return data;
        }
        else
        {
            return new LevelData();
        }
    }

答案 1 :(得分:0)

创建适当的数据模型,例如:

public class Level
{
    public TimeSpan TimeTaken { get; set; }
    // level specific data
}

public class City
{
    public IList<Level> Levels { get; set; }
}

public class Country
{
    public IList<City> Cities { get; set; }
}

然后,您可以简单地使用JSON.NET对JSON进行序列化/反序列化,例如:

string json = JsonConvert.SerializeObject(country);