【发布时间】:2019-11-11 01:21:03
【问题描述】:
我想使用DontDestroyOnLoad 对象在我的 2D 游戏进行时保存我的游戏数据。
我有一个 GameData 类/脚本,它存储诸如健康、magicType 等值,一个 SaveLoad 类/脚本,它将 GameData 类中的当前值保存到 Json 和一个名为 PlayerData 的空游戏对象以上两个脚本。
目前,我正在使用按钮单击事件在一个场景中保存值。我附加到按钮的对象是PlayerData 对象,我在点击事件上使用GameData 脚本更改值。
但这仅适用于第一个场景 - 我无法附加 PlayerData 对象并存储其 GameData 值,因为编辑器中没有 PlayerData 对象。
那么我怎样才能附加这个在不同场景中的对象呢?还是我做错了?
这是我当前项目的照片。
另外,当我保存一个布尔值,然后打开我的 Json 文件时,该文件是空的。这是正常的吗?这是我的保存和加载代码:
加载:
private string _filePath;
private static DataService _instance;
public DataService Instance
{
get { return _instance; }
}
public GameData _gameData;
private void Awake()
{
DontDestroyOnLoad(gameObject);
}
public void LoadGameData()
{
_filePath = Path.Combine(Application.persistentDataPath, "GameData1.json");
string json;
if (File.Exists(_filePath))
{
json = File.ReadAllText(_filePath);
JsonUtility.FromJsonOverwrite(json, _gameData);
}
else
{
Debug.Log("File missing.");
}
}
保存:
public void SaveGameData1()
{
string json = JsonUtility.ToJson(_gameData);
_filePath = Path.Combine(Application.persistentDataPath, "GameData1.json");
if (File.Exists(_filePath))
{
File.Create(_filePath).Dispose();
}
File.WriteAllText(_filePath,json);
}
编辑:这是我的 GameData 类的代码:
[Serializable]
public class GameData : MonoBehavior
{
public float Health { get; set; }
}
【问题讨论】:
-
根据tagging help,请不要在问题标题中添加标签。
-
我建议使用播放器偏好而不是 json 文件来将数据保存在 Unity 中。 docs.unity3d.com/ScriptReference/PlayerPrefs.html
-
我在网上看到 playerprefs 不是很安全,而 Json 是要走的路……
-
@Brandon PlayerPrefs 用于保存用户偏好,如音乐音量,而不是用于存储游戏进度,因为它会在每次应用更新时重置,并且对用户可见和可编辑。 Json 是一个很好的小步骤,但无论如何你应该另外使用一些加密;)
-
可以添加
GameData的代码吗?你确定这两个脚本都需要MonoBehaviour吗?