实际中遇到的需求
在做一款对抗类游戏,目前正在调整游戏的平衡性 所以就产生了一个需求 希望可以在Play模式时候对数据源做的更改可以在退出时候被保存下来。
举个Case, 比如 有一个炮塔 可以发射子弹, 然后有一组敌人 去攻击这个炮塔.
首先点击Play按钮 开始执行游戏逻辑
接着在Inspector中调整相应的数值,比如 射速啊,血量啊,敌人移动速度等等.
按原始的做法 就是调整以后 把所有的数据记录下来(截图或者写纸上)
点Stop进入编辑模式,所有数据回滚原始的 然后再一个一个把刚才改过的再重新填上去
一次两次还好,不过平衡性这东西 必然要经常调整 每次这样调整 非常影响工作效率,那有没有办法 可以让U3D在退出Play模式后保留对应的修改呢?
就此我还提了一个问题http://ask.unitymanual.com/question/37917 不过也没得到比较满意的答案 😦
只好自己瞎折腾了…
实现这个Case的思路
其实思路很简单, 因为 MonoBehaviour 有 void OnApplicationQuit (){} 函数 所以 在该函数内部 序列化相应的Class 然后保存到本地
当下次Awake 时候在反序列化 即可
也是就是
Awake
- 1·从本地Load
- 2·反序列化
OnApplicationQuit
- 3·序列化
- 4·保存到本地
想法很简单 不过却遇到了不少问题…
LitJson 无法序列化float类型
LitJson 用的人应该很多吧,反正我自己一直在用,序列化首先就想到它了,不过JsonMapper.ToJson (this); 直接报错
JsonException: Max allowed object depth reached while trying to export from type System.Single
问答里面一个哥们儿说他那里没问题,我就Google了一下 发现也有几个人遇到了我同样的问题,并且我把所有float都去了 一切就都ok了
网上帖子里面是建议用doulbe然后再自己转换,想想实在太麻烦. 后来又在GoogleCode搜到一个自己改过的LitJson不过也觉得不好
最后还是在GitHub上发现一个很NB的库 Full Serializer https://github.com/jacobdufault/fullserializer
代码结构很清晰 并且使用起来也很简单. 试了一下float的问题 完美Fix了. 这样第一个问题就算搞定了
MonoBehaviour 无法被New 出来
序列化的问题是解决了,不过反序列化时候就又有问题了… 写好反序列化代码 然后运行 直接报Warning
You are trying to create a MonoBehaviour using the ‘new’ keyword. This is not allowed.