Unity 3D 2018.1 - 保存

时间:2018-05-20 10:36:03

标签: c# unity3d save system

我在一周前开始做这个简单的构建游戏,现在我想要一个“Save-System”。问题是,无论我到目前为止做了什么,我都做不到。具体来说,我不知道它是否会起作用,因为它必须存储100x100大小的地面,加上树木,石头和建筑物。 游戏在每次运行开始时随机生成世界。

知道我该怎么办?

1 个答案:

答案 0 :(得分:0)

PlayerPrefs和json序列化将成为您相对简单的保存系统的朋友。但是为了做到这一点,你需要确保你只使用支持的PlayerPrefs类型:int,float或string。这并没有提供很大的摆动空间,所以利用这些的最好方法是使用json,因为json表示为字符串。有关如何使用Unity内置的json序列化程序,请阅读here

您对此设置有何期待?好吧,我们采取以下设置:

using System;
using UnityEngine;

[Serializable]
public class PlayerStats
{
    public int Health;
    public int Energy;
    public Vector3 Position;

    public static string Serialize(PlayerStats playerStats)
    {
        if (playerStats == null)
            return "";

        return JsonUtility.ToJson(playerStats);
    }

    public static PlayerStats Deserialize(string json)
    {
        if (string.IsNullOrEmpty(json))
            return new PlayerStats();

        return JsonUtility.FromJson<PlayerStats>(json);
    }
}

public static class GameManager
{
    public const string PLAYER_STATS_SAVE_KEY = "PLAYER_STATS";

    public static PlayerStats Player;

    public static void Save()
    {
        string json = PlayerStats.Serialize(Player);
        PlayerPrefs.SetString(PLAYER_STATS_SAVE_KEY, json);
    }

    public static void Load()
    {
        if (!PlayerPrefs.HasKey(PLAYER_STATS_SAVE_KEY))
        {
            Player = new PlayerStats();
        }
        else
        {
            string json = PlayerPrefs.GetString(PLAYER_STATS_SAVE_KEY);
            Player = PlayerStats.Deserialize(json);
        }
    }
}

这里有2个类 - PlayerStats和GameManager。 PlayerStats将充当您要序列化(以及稍后保存和加载)的数据的容器。所以你抛出[Serializable]属性。添加要保存的数据的字段:健康,能量和位置。然后创建一些静态方法,用于将PlayerStats实例序列化和反序列化为Json字符串。当我们在类上运行Serialize()方法时,我们可能会得到一个如下所示的字符串:

{
  "Health": 10,
  "Energy": 10,
  "Position": {
    "x": 1,
    "y": 1,
    "z": 1
  }
}

这意味着我们现在可以将它保存在PlayerPrefs中,因为我们已经将所有数据转换为字符串。这就是GameManager类所在的位置。让我们假设您将PlayerStats存储在此类的静态字段中。当玩家点击保存按钮时,您只需运行GameManager.Save(),它将使用PlayerStats.Serialize()方法获取当前PlayerStats的json。然后使用PlayerPrefs,它会将该字符串存储在特定键中。下次你想要加载那些玩家统计数据时,你可以只调用GameManager.Load(),它将从PlayerPrefs中检索保存的json,将其反序列化为PlayerStats实例并将其分配给你的全局PlayerStats字段。

至于你的世界一代,我强烈建议切换到种子随机发生器。这将允许您生成随机种子,该种子可以保存并可靠地用于重新生成相同的随机数据。这可以使用System.Random(int32)docs here)类来完成。因此,您只需保存种子并使用它来重新生成世界,而不是保存所有世界数据。