基于JSON 的项目系统-Unity指南
Posted 游戏蛮牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于JSON 的项目系统-Unity指南相关的知识,希望对你有一定的参考价值。
在这篇文章里,我会着重介绍JSON 以及如何结合Unity使用LitJSON库。如果你还没有这个库,从页面大概一半的位置下载“dll”文件,放到你自己的资源文件夹里即可。这个实例会建一个武器系统,但是这种技术可以应用到所有类型的库以及不同的数据存储系统。 写JSON文件JSON是一种轻量级的数据交换格式,它容易理解,易于保存。然后没别的了。我给你们看看它有多好用。JSON格式是一组键和值,可以是各种数据形式,比如字符串、整型或浮点型——往下看:
从上面这段代码就能看出它创建数据有多容易了——要是想添加条目,就只需要在句尾“}”前加个“,”,并保持格式不变(确保代码全都在“[]”内)。 为了创建JSON文件,需要用编辑器建一个新的文本文件,以便选择和归类相似的内容,如上例。保存时在文件名后面加个“.json”,作为文件格式。我这个实例名字就是“Weapons.json”。建好的JSON文件放到资源文件夹里,就可以在Unity里用这些数据了。
向LitJSON请求数据 JSON数据写好以后,你需要新建一个C#脚本来读文件。这里是我自己的,你如果想复制粘贴到你自己的工程里(我已经把解释程序的注释放进去了)也没问题。
(这里是注释)确保你已经把LitJson库加进来了,如果你已经下载了链接文件,就能直接运行了,把这个文件放到你的资源文件夹里去。
这就是全部脚本了,但还需要放到你的场景里去。我建议创建一个叫“控制器”或其它类似名字的空游戏对象,把这个脚本挂载上去。
现在我们有了这个绝招,就能开始应用这些数据并且通过游戏对象来表示出来。我会用Unity的“Debug.Log”来打印数据,这样就非常简单了。所以,再建一个C#脚本来管理玩家的武器行为,并且挂载到游戏对象上去。
这回我想逐步运行脚本,不但能尽量简化过程还能避免脚本过大。首先我们得声明一些变量。
变量_weapons保存.json文件里的所有武器,并允许快速访问所有武器;变量availableWeapons确保只有玩家允许的武器可以被访问——比如限制某个玩家同时持有的武器数量。 _curWeapon和_curWeaponIndex一眼就能看出是干嘛的——_curWeapon是玩家当前装备的武器,_curWeaponIndex是_availableWeapons链表里的索引(这样脚本更清楚,因为这是用在玩家可用武器的循环里的)。
嗯,下面就是Awake() 函数了。
FindObjectOfType<JsonReader>()查找脚本中的“JsonReader ”,当然它得在场景里才行,你必须保证你能是按照我前面说的去做的。通过它,我们就能调用早前建好的GetData()函数,把作为参数的“Weapons”(我可是在.json文件里命名了的)替换为你认为合适的。 InitialiseWeaponList() 函数长这样:
我这样做主要是想把代码减少点,并优化为可复用的,但我没解释怎么做的。
第一行仅是定义_availableWeapons变量为new JsonData()类型,这个类型是刚开辟的空间,可以存储数据。接着我们又建了一个更有用的函数叫作AddWeapon(),这个函数后面会非常有用——函数名的字面意思很明显,不过我过会才会运行它。
现在我把_curWeaponIndex初值设为0,只要该索引在链表里,始终都指向_curWeapon(0在链表里始终表示第一个索引,所以我们才不把它设为1或别的)。
_curWeapon已经成了我们数据集里的第一个索引指向的对象——_availableWeapons——在下一行。我们晚些时候也要用到,所以不必担心,我们才不会建类似_curWeaponIndex这种用不上的东西。
接着是AddWeapon() 函数——我们要开始引用JSON数据了:
这个函数用一个字符串作为参数,在这个例子中表示参数的“id”。回看我的.json文件,我的两个武器都有“id”域,所以我们要找到它们。
For循环必须通过检查_weapons “id”的当前索引,遍历_weapons链表的每个数据项,把id和函数里的参数进行匹配(在InitialiseWeaponList()函数里参数是.json文件里id为“p01”和“s01”的项)
然后引用.json文件里的键,你必须使用如上的[“name”]或[“id”],或者任意其它已有的键如[“damage”] 或[“fire_rate”]。我也用[“id”]的ToString方法把数据格式化为字符串。对于整型就得用ToInt()之类的。
JSON数据用的并不多,但我觉得虽然我可以不用它但却有可能对你很有帮助。参数n可以是1或-1,可以在链表的两个方向上循环1步。对于_curWeaponIndex也很方便,防止我们超出链表范围进行循环从而导致索引值溢出,所以它的循环很流畅。
你同样能看出如何访问_curWeapon属性,如下方这个Shoot()短函数。
你可以自己找到有效方式来使用这些数据,比如把武器伤害传递到实例化的子弹上或类似的其它方式。
▶
▶
▶
本文由蛮牛译馆倾情奉献,除 合作社区 及 合作媒体 外,禁止转载。
蛮牛社区()分享最新的游戏研发和虚拟现实相关技术内容。
以上是关于基于JSON 的项目系统-Unity指南的主要内容,如果未能解决你的问题,请参考以下文章
Unity学习完全基于Ultimate Replay 2.0的UI回放系统