论文部分内容阅读
摘要:任务、成就以及存档读档等模块,在游戏中总是不可缺少。对于游戏而言,这不仅仅是必要元素,同时也是游戏的加分项。该文通过以Unity3D为开发平台,以开发的《通通站》项目为实例,从程序开发者的视角阐述了在游戏的程序设计中对于任务、成就、存储系统的理解,使开发者在制作游戏系统时有明确的设计思路,研究也表明开发游戏时,提前思考游戏系统间联系对制作良好的系统是很重要的。
关键词:Unity3D;存储系统;任务系统;成就系统
在完整游戏制作中,几乎不可避免地需要在游戏中加入任务系统,成就系统和保存进度的存储系统。可以说成就为玩家提供了奋斗目标,而任务为玩家提供了完成目标的途径,而这个过程就需要存储系统进行管理数据。
本文以Unity3D为开发平台,以实践的形式分析成就、任务、存储系统的构建和联系。Unity3D是一款热门的游戏引擎,据Unity官方发布,每个月有28亿活跃的终端用户接触或使用Unity解决方案制作或运营内容[1]。
实践项目《通通站》是一款基于企业App开发的嵌入式项目,该项目以地铁文化为背景,以养成宠物(通通)为主要玩法,通过完成任务、游玩小游戏、社交、完成成就等方式获取培养宠物的资源。
1分析系统
1.1任务系统
基于实践项目对任务系统的基本属性进行分析,其中包括任务名、任务完成条件、任务进度、任务奖励、任务开放等级等属性。其中任务名、任务进度、是否领取过奖励等属性,是任务系统与存储系统中是最常交互的数据。在任务UI上,需要提前准备Unity的UI显示组件,包括奖励图片(Image)和奖励个数(Text)、任务进度(Text)、任务的名字和任务详情(Text)。任务系统数据的更新,包括任务属性的进度、任务是否完成、是否领取奖励和任务UI的更新等数据。而这些数据的更新和管理需要一个完整的设计思路和运行逻辑,良好的程序思路设计可以有效地提高程序的运行效率。当玩家进入《通通站》任务界面时。简单的运行逻辑如图1:
1.2成就系统
成就系统与任务系统在程序思路设计是类似的,在属性方面几乎有任务系统的全部属性,在更新数据上逻辑和任务系统是一样的,区别的设计主要在于UI排版、美术和交互上,在实践项目中,成就的交互设计和任务相比,成就交互设计难度更大,其区别在于交互细节,成就的UI设计是在任务系统UI的基础上,增添了一个新的UI面板,而所有的任务是共用这个UI面板的,面板的数据包括任务名称、完成条件、获取的奖励以及成就的具体信息。当玩家点击成就列表中某一个成就时,会在原来的UI面板上添加新的交互UI,同时根据所点击的成就对该共用UI面板进行数据更新,UI上显示的详细的成就信息和获得奖励的记录,对玩家有一定的激励作用,良好的成就系统能调动玩家的积极性,激发玩家内心的游戏动机[2]。
1.3存储系统
存储系统的开发,是联系多个系统、不仅有任务、成就等系统、背包的物品、也包括游戏玩家属性等级、名字、经验等。在《通通站》的项目中,保存游戏数据方式,选择了以保存Json文件的形式。在存储数据的结构上,不同的系统和存储系统交互的属性是不同的,所以需要针对不同的系统构建不同的数据结构(类),以方便保存和解析数据。在成就,任务系统与存储系统交互,其实存在着一个临行保存物品的系统,就是背包系统。在完成任务后获得奖励,储存在背包系统里,背包系统以一个C#的字典进行存储物品信息的,字典值类型使用C#列表类型,这样的设计可以提高查询的效率的同时,可确保多个相同的物品可以保持独立存储数据。背包物品均由一个(程序)父类派生出来,在背包中可通过该基类进行管理。
1.4成就,任务和存储系统的关系
对于存储系统而言不仅要将数据转化为Json文件,同时需要和其他系统构建联系起来,以成就和任务系统为例,存储系统只需存储必要信息,所以在保存数据时,需要存储系统根据成就,任务的脚本数据,对系统的属性进行区分,只留下必要信息,以实践项目的任务系统的存储数据为例:必要信息有任务ID,任务进度,是否完成过任务,任务是否领取过奖励等数据。
三个系统的联系不仅仅是在数据的传输上,存储系统也对其他两个系统的数据进一步管理,同时存储的数据,也需要任务,成就系统为构建保存的数据结构提供参考。
2制作存储系统的思考
2.1什么是Json
Json全称是(JavaScript Onject Notation),这是一种轻量级的数据交换格式。文件层次结构比较清晰,具有可读性,可在源文件中进行修改,同时对于计算机保存文件和数据的解析都比较友好。Json文件是一款完全独立于语言的文本格式,但由于使用了類似于C语言家族的习惯,使Json成为了比较理想的数据交换语言[3]。Json文件的结构和写法是以“{}”花括号对应程序的对象。“[]”方括号对应数组,“""”双引号对应程序里的变量名和值(Key和Value)。其写法如图2。
2.2 Json的优缺点
用于存储系统比较热门的技术分别有数据二进制序列化,XML和Json。其中对于电脑最友好的存储方式是二进制序列化,计算机对数据的处理最终是对二进制序列化数据的处理,这意味着数据的可靠性,稳定性和效率是最好,但相对的以二进制序列化保存的文件是难以解读,或修改的。
另一个选择是XML,其优点是格式统一,不同系统可共享数据,系统的兼容性高,文件具备可读性,并且可进行修改。
但这二者相对Json文件,可读性和可进行修改有着不可逾越的差距,二进制化难以解读和修改,而XML由于需要考虑父节点和子节点的复杂关系。而Json很好的管理了这些数据,Json和XML在保存相同数据的情况下,从文件数据的复杂度和内存大小分析,Json文件数据结构更清晰,存储空间更小,有研究表明当Json,XML传输相同的数据,XML消耗的时间更长[4]。这就意味着在传输速度和编写解析程序上,最优先选择的保存方式为Json文件,综合评价:在保存的数据需要进一步操作时,Json文件的保存方式是个很好的选择。 2.3使用LitJson的注意事项
决定使用以Json文件进行数据存储,针对于Unity平台,可以使用LitJson的Unity插件,LitJson是Unity开发和Json相关应用的开发包。在开发初期,需要手动将LitJson传入Unity的项目文件中。LitJson可存储的数据类型为bool 、double 、int 、 object和string等 。其中需要注意float类型在LitJson插件中是不支持的,如果使用float类型的数据,编译过程会直接报错。
相同的保存路径,文件具有覆盖性。存储不同阶段的数据时,需要在程序中更改保存文件的名字。对于保存路径还需要注意,在Unity编辑测试阶段时为了方便观察数据,保存的路径可以为(Application.dataPath "/StreamingAssets"),数据将会存储在项目的StreamingAssets文件夹中,如果打包成移动端,需要修改获取路径的函数(Application.persistentDataPath)。
在《通通站》项目中,玩家进入时Json文件同时也进行解析,在此过程需要判断Unity场景中UI元素是否构建完成,完成构建解析后的数据才有赋值的空间,否则Unity会报空。这里可以使用Unity的协程进行开发,通过协程判断游戏场景元素是否构建完毕。
3任务,成就,存储系统的制作
3.1任务与存储系统的关系类图
(Task)为任务的基类,其属性类包括处理奖品的类(TaskAward)和处理任务是否完成条件类(TaskConition),(FinishConitionChange)是对(TaskConition)类功能的补充,(TodayTask)继承于(Task),同时实现(Task)的功能,(TodayTask)创建对象后由(GrowTaskMgr)等级任务管理类和(todayTaskMgr)每日任务管理类进行管理。在保存和解读信息时,通过(JsonDataExchange)进行数据交互,而该类,采用了单例模式,方面该脚本和其他脚本的数据交互。(JsonDataExchange)交互的数据是(taskSave)保存任务存储必要信息类,通过(Save)将在(JsonDataExchange)中得到的数据进一步整理,最后(SRMgr)通过调用(SaveJson)或(LoadJson)类对(Save)的数据进行保存或解析。
3.2基于实践项目分析:任务,成就,存储系统程序设计的难点
针对于软件开发的功能模块,在程序上需要考虑程序的可移植性和可拓展性,对于可移植性,需要考虑Unity3D开发版本的兼容性问题,功能模块的开发,以C#程序和Unity3D的基础元素构成,尽量避免Unity版本迭代造成的问题。在程序可拓展型上,以面向对象的思维进行开发,通过图3的类图分析,构建游戏的程序框架,为游戏系统设计一个优秀的编程框架是开发编程型游戏系统的一项重要的任务[5]。
优化任务,成就数据更新逻辑,对于任务、成就系统而言,良好的程序调用逻辑,可以降低运行的消耗,也方便后期对程序的调试、修改和修补bug。对于任务数据的监控,是不建议采用实时监测的形式,实时监测提升不必要的消耗。故需要设计良好的运行逻辑。以任务系统为例:打开任务UI时,才触发判斷是否领取过奖励,非领取状态才能进一步交互,而对于可交互的状态的任务,UI界面的数据更新的触发为更新进度,进度的更新,触发判断进度是否完成,进而更新任务奖励状态,最后以更新UI。
(JsonDataExchange)数据交换类的设计,无论是任务系统,成就系统还是存储系统,都有大量的数据进行交互,造成的后果是对象之间的耦合度提高,增加了后期程序的维护成本,故使用中介模式,使三个系统的数据交互通过(JsonDataExchange)作为中间者进行交互,为了更好的使用该类,为此(JsonDataExchange)同时设计了单例模式,这样可以比较大程度上避免耦合性。
4结束语
本文以Unity3D游戏引擎编辑器作为为开发平台,以开发的项目《通通站》为实例,分析了《通通站》项目中,任务,成就系统的构建元素,同时解释了该项目中存储数据所用的文件为Json,进而介绍以Json技术为基础开发的Unity插件LitJson和使用的注意事项,通过这些技术的应用,以一个程序开发者的角度,阐述了项目中任务,成就,存储系统三个系统之间的运行逻辑和数据间的联系。对于一个游戏项目,如果没有提前思考总结游戏系统之间的联系,在开发的过程中很有可能导致系统间数据交互混乱。
参考文献:
[1] 2021游戏市场风向报.Unity对2020年游戏市场分析及2021年趋势预测[EB/OL].[2021-05-21].https://unity.cn/2021-gamer-report.
[2] 郭文文.基于心流体验的手机游戏设计研究[D].北京:北京服装学院,2013.
[3] Json介绍:Json中国 [EB/OL] 2013.http://www.json.org.cn/
[4] 高静,段会川.JSON数据传输效率研究[J].计算机工程与设计,2011,32(7):2267-2270.
[5] 江耿豪.编程型游戏编程框架的设计方法[J].软件导刊,2010,9(7):17-19.
【通联编辑:谢媛媛】
关键词:Unity3D;存储系统;任务系统;成就系统
在完整游戏制作中,几乎不可避免地需要在游戏中加入任务系统,成就系统和保存进度的存储系统。可以说成就为玩家提供了奋斗目标,而任务为玩家提供了完成目标的途径,而这个过程就需要存储系统进行管理数据。
本文以Unity3D为开发平台,以实践的形式分析成就、任务、存储系统的构建和联系。Unity3D是一款热门的游戏引擎,据Unity官方发布,每个月有28亿活跃的终端用户接触或使用Unity解决方案制作或运营内容[1]。
实践项目《通通站》是一款基于企业App开发的嵌入式项目,该项目以地铁文化为背景,以养成宠物(通通)为主要玩法,通过完成任务、游玩小游戏、社交、完成成就等方式获取培养宠物的资源。
1分析系统
1.1任务系统
基于实践项目对任务系统的基本属性进行分析,其中包括任务名、任务完成条件、任务进度、任务奖励、任务开放等级等属性。其中任务名、任务进度、是否领取过奖励等属性,是任务系统与存储系统中是最常交互的数据。在任务UI上,需要提前准备Unity的UI显示组件,包括奖励图片(Image)和奖励个数(Text)、任务进度(Text)、任务的名字和任务详情(Text)。任务系统数据的更新,包括任务属性的进度、任务是否完成、是否领取奖励和任务UI的更新等数据。而这些数据的更新和管理需要一个完整的设计思路和运行逻辑,良好的程序思路设计可以有效地提高程序的运行效率。当玩家进入《通通站》任务界面时。简单的运行逻辑如图1:
1.2成就系统
成就系统与任务系统在程序思路设计是类似的,在属性方面几乎有任务系统的全部属性,在更新数据上逻辑和任务系统是一样的,区别的设计主要在于UI排版、美术和交互上,在实践项目中,成就的交互设计和任务相比,成就交互设计难度更大,其区别在于交互细节,成就的UI设计是在任务系统UI的基础上,增添了一个新的UI面板,而所有的任务是共用这个UI面板的,面板的数据包括任务名称、完成条件、获取的奖励以及成就的具体信息。当玩家点击成就列表中某一个成就时,会在原来的UI面板上添加新的交互UI,同时根据所点击的成就对该共用UI面板进行数据更新,UI上显示的详细的成就信息和获得奖励的记录,对玩家有一定的激励作用,良好的成就系统能调动玩家的积极性,激发玩家内心的游戏动机[2]。
1.3存储系统
存储系统的开发,是联系多个系统、不仅有任务、成就等系统、背包的物品、也包括游戏玩家属性等级、名字、经验等。在《通通站》的项目中,保存游戏数据方式,选择了以保存Json文件的形式。在存储数据的结构上,不同的系统和存储系统交互的属性是不同的,所以需要针对不同的系统构建不同的数据结构(类),以方便保存和解析数据。在成就,任务系统与存储系统交互,其实存在着一个临行保存物品的系统,就是背包系统。在完成任务后获得奖励,储存在背包系统里,背包系统以一个C#的字典进行存储物品信息的,字典值类型使用C#列表类型,这样的设计可以提高查询的效率的同时,可确保多个相同的物品可以保持独立存储数据。背包物品均由一个(程序)父类派生出来,在背包中可通过该基类进行管理。
1.4成就,任务和存储系统的关系
对于存储系统而言不仅要将数据转化为Json文件,同时需要和其他系统构建联系起来,以成就和任务系统为例,存储系统只需存储必要信息,所以在保存数据时,需要存储系统根据成就,任务的脚本数据,对系统的属性进行区分,只留下必要信息,以实践项目的任务系统的存储数据为例:必要信息有任务ID,任务进度,是否完成过任务,任务是否领取过奖励等数据。
三个系统的联系不仅仅是在数据的传输上,存储系统也对其他两个系统的数据进一步管理,同时存储的数据,也需要任务,成就系统为构建保存的数据结构提供参考。
2制作存储系统的思考
2.1什么是Json
Json全称是(JavaScript Onject Notation),这是一种轻量级的数据交换格式。文件层次结构比较清晰,具有可读性,可在源文件中进行修改,同时对于计算机保存文件和数据的解析都比较友好。Json文件是一款完全独立于语言的文本格式,但由于使用了類似于C语言家族的习惯,使Json成为了比较理想的数据交换语言[3]。Json文件的结构和写法是以“{}”花括号对应程序的对象。“[]”方括号对应数组,“""”双引号对应程序里的变量名和值(Key和Value)。其写法如图2。
2.2 Json的优缺点
用于存储系统比较热门的技术分别有数据二进制序列化,XML和Json。其中对于电脑最友好的存储方式是二进制序列化,计算机对数据的处理最终是对二进制序列化数据的处理,这意味着数据的可靠性,稳定性和效率是最好,但相对的以二进制序列化保存的文件是难以解读,或修改的。
另一个选择是XML,其优点是格式统一,不同系统可共享数据,系统的兼容性高,文件具备可读性,并且可进行修改。
但这二者相对Json文件,可读性和可进行修改有着不可逾越的差距,二进制化难以解读和修改,而XML由于需要考虑父节点和子节点的复杂关系。而Json很好的管理了这些数据,Json和XML在保存相同数据的情况下,从文件数据的复杂度和内存大小分析,Json文件数据结构更清晰,存储空间更小,有研究表明当Json,XML传输相同的数据,XML消耗的时间更长[4]。这就意味着在传输速度和编写解析程序上,最优先选择的保存方式为Json文件,综合评价:在保存的数据需要进一步操作时,Json文件的保存方式是个很好的选择。 2.3使用LitJson的注意事项
决定使用以Json文件进行数据存储,针对于Unity平台,可以使用LitJson的Unity插件,LitJson是Unity开发和Json相关应用的开发包。在开发初期,需要手动将LitJson传入Unity的项目文件中。LitJson可存储的数据类型为bool 、double 、int 、 object和string等 。其中需要注意float类型在LitJson插件中是不支持的,如果使用float类型的数据,编译过程会直接报错。
相同的保存路径,文件具有覆盖性。存储不同阶段的数据时,需要在程序中更改保存文件的名字。对于保存路径还需要注意,在Unity编辑测试阶段时为了方便观察数据,保存的路径可以为(Application.dataPath "/StreamingAssets"),数据将会存储在项目的StreamingAssets文件夹中,如果打包成移动端,需要修改获取路径的函数(Application.persistentDataPath)。
在《通通站》项目中,玩家进入时Json文件同时也进行解析,在此过程需要判断Unity场景中UI元素是否构建完成,完成构建解析后的数据才有赋值的空间,否则Unity会报空。这里可以使用Unity的协程进行开发,通过协程判断游戏场景元素是否构建完毕。
3任务,成就,存储系统的制作
3.1任务与存储系统的关系类图
(Task)为任务的基类,其属性类包括处理奖品的类(TaskAward)和处理任务是否完成条件类(TaskConition),(FinishConitionChange)是对(TaskConition)类功能的补充,(TodayTask)继承于(Task),同时实现(Task)的功能,(TodayTask)创建对象后由(GrowTaskMgr)等级任务管理类和(todayTaskMgr)每日任务管理类进行管理。在保存和解读信息时,通过(JsonDataExchange)进行数据交互,而该类,采用了单例模式,方面该脚本和其他脚本的数据交互。(JsonDataExchange)交互的数据是(taskSave)保存任务存储必要信息类,通过(Save)将在(JsonDataExchange)中得到的数据进一步整理,最后(SRMgr)通过调用(SaveJson)或(LoadJson)类对(Save)的数据进行保存或解析。
3.2基于实践项目分析:任务,成就,存储系统程序设计的难点
针对于软件开发的功能模块,在程序上需要考虑程序的可移植性和可拓展性,对于可移植性,需要考虑Unity3D开发版本的兼容性问题,功能模块的开发,以C#程序和Unity3D的基础元素构成,尽量避免Unity版本迭代造成的问题。在程序可拓展型上,以面向对象的思维进行开发,通过图3的类图分析,构建游戏的程序框架,为游戏系统设计一个优秀的编程框架是开发编程型游戏系统的一项重要的任务[5]。
优化任务,成就数据更新逻辑,对于任务、成就系统而言,良好的程序调用逻辑,可以降低运行的消耗,也方便后期对程序的调试、修改和修补bug。对于任务数据的监控,是不建议采用实时监测的形式,实时监测提升不必要的消耗。故需要设计良好的运行逻辑。以任务系统为例:打开任务UI时,才触发判斷是否领取过奖励,非领取状态才能进一步交互,而对于可交互的状态的任务,UI界面的数据更新的触发为更新进度,进度的更新,触发判断进度是否完成,进而更新任务奖励状态,最后以更新UI。
(JsonDataExchange)数据交换类的设计,无论是任务系统,成就系统还是存储系统,都有大量的数据进行交互,造成的后果是对象之间的耦合度提高,增加了后期程序的维护成本,故使用中介模式,使三个系统的数据交互通过(JsonDataExchange)作为中间者进行交互,为了更好的使用该类,为此(JsonDataExchange)同时设计了单例模式,这样可以比较大程度上避免耦合性。
4结束语
本文以Unity3D游戏引擎编辑器作为为开发平台,以开发的项目《通通站》为实例,分析了《通通站》项目中,任务,成就系统的构建元素,同时解释了该项目中存储数据所用的文件为Json,进而介绍以Json技术为基础开发的Unity插件LitJson和使用的注意事项,通过这些技术的应用,以一个程序开发者的角度,阐述了项目中任务,成就,存储系统三个系统之间的运行逻辑和数据间的联系。对于一个游戏项目,如果没有提前思考总结游戏系统之间的联系,在开发的过程中很有可能导致系统间数据交互混乱。
参考文献:
[1] 2021游戏市场风向报.Unity对2020年游戏市场分析及2021年趋势预测[EB/OL].[2021-05-21].https://unity.cn/2021-gamer-report.
[2] 郭文文.基于心流体验的手机游戏设计研究[D].北京:北京服装学院,2013.
[3] Json介绍:Json中国 [EB/OL] 2013.http://www.json.org.cn/
[4] 高静,段会川.JSON数据传输效率研究[J].计算机工程与设计,2011,32(7):2267-2270.
[5] 江耿豪.编程型游戏编程框架的设计方法[J].软件导刊,2010,9(7):17-19.
【通联编辑:谢媛媛】