我在一周前开始做这个简单的构建游戏,现在我想要一个“Save-System”。问题是,无论我到目前为止做了什么,我都做不到。具体来说,我不知道它是否会起作用,因为它必须存储100x100大小的地面,加上树木,石头和建筑物。 游戏在每次运行开始时随机生成世界。
知道我该怎么办?
答案 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)类来完成。因此,您只需保存种子并使用它来重新生成世界,而不是保存所有世界数据。