近日项目要求对玩家常用的麻将等玩法做本地持久化保存,以便下次玩家上线不用重新选择玩法。
做法很简单,思路是将玩家的选择在游戏退出的时候记录下来,然后在玩家打开游戏的时候再从新吧设置项赋值。不过其中还有一些小坑。下面先说一下小坑。
1.NGUI中的Toggle组件中的默认选项会在当前面板被打开时候再设置,所以如果你的面板中有各种各样的默认选项,你又在开始游戏的时候给他们的Value赋值,那么在游戏中当打开这个面板的时候这个会出现这个面板的默认选项是选着的,而玩家的配置选项也是选着,即使这两个toggle都在同一个group中。如下图
所以预知体中不要设置任何默认开启的选项,所有选项的选择都有配置项来赋值。
2.如果你设置Toggle的动画效果,如
那么你如果在游戏开始的时候将所有的Toggle重新赋值后就马上将其SetActive(false),那么当用户打开面板的时候,会播放一段残影,原因是设置Toggle的值之后会播放一段缓动的动画,但动画没播放完就隐藏了面板,动画就会暂停下次打开面板的时候,会从暂停的地方从新继续播放,就造成了残影的效果。解决的方法:可以把Smooth改选为Instant,或者先SetActive(false)面板以后再用配置项赋值,或者在读取配置项并赋值之后等1S左右再SetActive(false)面板。第二种方法应该是最合适的方法。
具体如何本地化,我们把创建房间中的所有选项存在lua中的一个table中。
然后我们遍历这个table来取到这些toggle中的value值。将这些值存在另一个table中,并将这个table转换为json。利用unity自带的PlayerPrefs.SetString()函数将json本地化储存,这样就达成了本地化玩家选择的目的,要还原的时候只要逆向这个过程便可。代码如下:
这里注意我们要有一个默认配置,如果玩家第一次安装游戏,我们要使用这个默认配置。这个默认配置,我为了简便就在游戏中打印了这个默认配置好的Json然后复制到代码中,如果在大型项目中,这样的配置文件最好做本地化文件存储。
这里主要记录了一种思路,在RPG中或者其他游戏中也可以使用同样的思路来处理一些本地化配置项的问题。
-----------------------------------2018-4-10-----------------------------------------------
近期发现前面写好的持久化玩家配置有小bug
bug时这样的,由于热更新玩法的原因我们将新的玩法热更上去之后,默认配置也一起热更了,但是玩家没有卸载原来的安装包,这就造成
这里取到的还是玩家之前的配置项(未热更的),这样就会出现bug导致新玩法第一次打开的时候什么都没有选择这样的bug。
经过思考,认为要在配置项中加一个版本号,以便分辨玩法是否有更新,如果玩法有更新就弃用玩家的配置项,使用默认配置项,如果版本号一致,就可以使用玩家配置项。
通过发现这个小bug,对于热更与版本有一定深层次的理解。
|
请发表评论