当前位置:   article > 正文

[独游开发210105]Unity基于LitJson的存档系统_litjson存档

litjson存档

Unity基于LitJson的存档系统:


描述:

最近在做自己的第一个游戏,因为之前都是随便玩玩的,所以并不是很深入。昨天看了LitJson的数据持久化,今天就试着去做了下,从早上干到现在,虽说代码可能不足,但起码功能实现了,后续再加修改不是大事。其中我也总结了一些坑。

LitJson的简单使用

  1. 下载一个LitJson.dll,放在Assets/Plugins下
  2. 在脚本中using LitJson
  3. 创建好SL类,来保存需要存储的数据。要序列化[System.Serializable]
  4. 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
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  1. LoadJsonFromFile读档
   private string LoadJsonFromFile()
    {
        return File.ReadAllText(Application.dataPath + "/Json/sl.json");
    }
  • 1
  • 2
  • 3
  • 4

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);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

暂停界面

  • 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
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

注意
这几个代码写的不太好,太繁杂,还能优化,大佬们一笑带过就行。


踩了好久的坑

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(好家伙,我这是怎么想的,写完就把改了),要保存时赋值就行。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/794148
推荐阅读
相关标签
  

闽ICP备14008679号