Unity基于LitJson的存档系统:
描述:
最近在做自己的第一个游戏,因为之前都是随便玩玩的,所以并不是很深入。昨天看了LitJson的数据持久化,今天就试着去做了下,从早上干到现在,虽说代码可能不足,但起码功能实现了,后续再加修改不是大事。其中我也总结了一些坑。LitJson的简单使用
- 下载一个LitJson.dll,放在Assets/Plugins下
- 在脚本中using LitJson
- 创建好SL类,来保存需要存储的数据。要序列化[System.Serializable]
- SaveObjectToJson存档
private void SaveObjectToJson() {
save.scene = GameManager.getSceneIndex(); save.posX = GameManager.instance.player.transform.position.x; save.posY = GameManager.instance.player.transform.position.y; Debug.Log(save.posX); Debug.Log(save.posY); File.WriteAllText(Application.dataPath + "/Json/sl.json", JsonMapper.ToJson(save)); }
讯享网
- LoadJsonFromFile读档
讯享网 private string LoadJsonFromFile() {
return File.ReadAllText(Application.dataPath + "/Json/sl.json"); }
SL:
主界面
- Start (由Canvas中的MainMenu脚本控制,点击后buildIndex+1) - Load(由GameManager物体(在Hierarchy窗口创建的,里面搭载了GameManager和DataManager脚本)控制,点击后调用DataManager,点击后获取已保存的json文件,转化为自定义类(本篇为SL),后将SL中的数据赋值给GameManager中对应的数据,并最后进行LoadScene) public void LoadGame() {
load = JsonMapper.ToObject<SL>(LoadJsonFromFile()); GameManager.instance.scene = load.scene; GameManager.instance.pos = new Vector3((float)load.posX, (float)load.posY, 0f); GameManager.changeScene(load); }
暂停界面

- Save(由GameManager中的DataManager控制,点击后将GameManager中的相应数据赋值给新定义的SL类的变量save,最后用File.WriteAllTest函数进行保存)。
讯享网 public void SaveGame() {
SaveObjectToJson(); } private void SaveObjectToJson() {
save.scene = GameManager.getSceneIndex(); save.posX = GameManager.instance.player.transform.position.x; save.posY = GameManager.instance.player.transform.position.y; Debug.Log(save.posX); Debug.Log(save.posY); File.WriteAllText(Application.dataPath + "/Json/sl.json", JsonMapper.ToJson(save)); }
注意
这几个代码写的不太好,太繁杂,还能优化,大佬们一笑带过就行。
踩了好久的坑
1.代码太杂了,从上面也能看到脚本一堆,我自己实际做的时候也看花了,后续还要看看能不能在整合简化一下。
2.Button下的On Click拖入的最好是为预制体的带脚本的物体,因为这样不用每次加载界面都进行实例化,比如说我在主菜单的button为Hierarchy中的带GameManager的物体,在主菜单加载到场景1后又返回菜单后,主菜单的Button的On Click就为Missing状态。(发现这个问题还是不规范导致的233,我在场景1的On Click放入了为预制体的物体,后来突然想起来这一点,上文所说的问题也就解决了)
3.角色GameObject问题。第一次写脚本时出现一个问题,我将角色实例化放在LoadScene之后,Debug出来GameObject无论如何都是null,最后改了好久没改掉就重写了。重写后我是在PlayerController中在Start中将本身的GameObject赋值给GameManager,这样在加载进入场景1后就可以实例化GameManager中的GameObject,并在GameObject的Update中将角色的实时position传给GameObject中的pos(好家伙,我这是怎么想的,写完就把改了),要保存时赋值就行。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/41595.html