基于Unity3D在基本游戏框架下客户端研究与实现
2015-09-27梁成
梁成
(西华大学计算机与软件工程学院,成都 610039)
基于Unity3D在基本游戏框架下客户端研究与实现
梁成
(西华大学计算机与软件工程学院,成都610039)
0 引言
随着信息技术的不断发展,人们对于娱乐项目的要求越来越挑剔。在计算机硬件技术快速发展下,游戏作为一种新兴娱乐行业,正经历着蓬勃发展,在良好的人机交互下给玩家带来的越来越愉悦的体验。同时游戏也在商业,教育等领域日益影响着人们的社会生活。图1所示数据为网易游戏数据控对近年来游戏在商业上的表现进行的统计。
图1 中国大陆游戏市场总量和增长率
从大多数游戏研发来看,大体上要经历以下三个阶段,其阶段如图2所示。
在游戏策划阶段,拥有新颖的游戏想法决定是否在市场可以占有一席之地。
在游戏制作阶段,良好的人机交互和有趣的玩法是增加玩家数的法宝。
最后一个阶段是投放市场,宣传是关键。
图2 一款游戏经历的过程
目前,国内外针对Unity3D引擎在游戏开发中的技术进行不同程度的研究,2012年王树斌[1]简单介绍了Unity开发游戏流程和技术,2014年张敏[2]通过Unity实现了一个保龄球游戏,并没有对脚本进行有效的组织和管理。本文主要探讨的是游戏制作阶段,通过学习Unity游戏引擎的基础上,在基本游戏框架模型和脚本通用管理方式下,实现了一个游戏客户端。
1 Unity介绍
Unity是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。图3所示为Unity3D平台的界面。
图3 Unity3D平台界面
Unity3D一款跨多平台的游戏引擎,目前最新版本的Unity已经支持包括Android、iOS、Samsung TV等在内的14个平台。除了多平台以及简洁便用的界面特性之外,Unity3D还自带了丰富的资源,如CharacterController、地形系统、属性查看器、材质编辑器、天空盒,以及常用的脚本等。而在素材方面,Unity3D还内置了一个Asset Store,在这里面可以找到需要的一些模型、纹理图等。正是由于其这些强大的功能,国内排名前20的游戏公司都把Unity作为他们的游戏开发引擎[3]。图4所示为Unity3D所支持的平台。
图4 Unity3D支持平台
2 基本游戏框架及通用管理方式
基本游戏框架类似于一种简单MVC(Model View Controller,模型-视图-控制器)。按照MVC业务划分:Model(模型)在应用程序中主要用于处理数据逻辑,通常情况下模型对象负责的任务就是在数据库中进行数据的存取。View(视图)是应用程序中处理数据的显示。Controller(控制器)主要用于处理用户交互的部分。基本游戏框架继承了MVC中主要的分层,便于整个游戏的层次划分,提高开发效率,其框架如图5所示。
图5 基本游戏框架
服务器:主要用于用户之间数据交互和用户的数据存储。编写服务器是一项很艰巨,很费时的任务,一般的大公司都建立自己的服务器。那对于我们这些独立开发者来说,BaaS(Backend as a Service)便是不错的选择,其专为移动应用开发者提供整合云后端的服务。目前市场较为流行的BaaS有LeanCloud、Bmob、Amazon EC2等,这些云端服务器一般都提供了限免费访问量以及便捷易懂的API。移动应用后端云服务的好处是帮助开发者简化工作,程序员们只需一心一意做产品,而不需要过多考虑后端的服务器程序。做移动开发将会变得更轻松、更容易。
Network层:主要用于客户端与服务器的数据交换,把用于的请求提交给服务器,再把服务器还回来的数据提交客户端。最新版本Unity3D自带的Network组件以及Asset Store里面的TNet组件均可以胜任。
Server层:主要用于存储整个游戏的数据,负责与服务器交换数据。
Game层:主要为UI层提供需要的数据。
UI层:主要功能是直接对用户展示,这个层就是我们用户能看到的一些数据及界面。
GameThread:主要职责是用于修改及操作Game层和Server层的数据。
在Unity中,大多数动作都是可以通过添加Unity自身携带的组件来完成的,例如碰撞检测、天空盒、粒子特效等。但是对于组件之间的关联、通信,以及带有极强逻辑性的动作,简单的添加组件是无法达到预期的目标的。例如在游戏动画状态的切换时,可以通过设置其过渡参数来控制,从而控制玩家什么时候该跑,什么状态下进行走,但是这些控制条件也必须通过脚本来实现。Unity为解决这些问题,让开发者集中在游戏逻辑上面,提供一套比较完整的脚本系统及相应的API,通过这些API我们可以更好地去操作和组织我们的游戏逻辑。有了功能之后,需要考虑的是如何去高效、方便、易理解地去管理和组织我们的脚本。
“Manager of Manager”方式是指将同类型的行为或者操作组织起来统一管理,其也符合Unity中层级思想和面向对象的编程思想。例如我们想管理整个游戏的音乐音效的时候,我们可以建立AudioManager脚本。通过AudioManager来管理场景内的背景音乐管理器(BackgroundMusicManager)和背景音效管理器(BackgroundAudioEffectManager),然后我们在需要播放音乐音效的地方去调用这些脚本里面的方法即可,这样管理更加有效,更加让人理解。
3 客户端的实现
为了更好说明这两种思想,我们实现一个类似于跑酷游戏的客户端,下面我们采用模块化进行说明。在整个游戏里面,我们将其分成四个功能模块,它们分别实现不同的功能,在大多数的游戏公司也是采用模块化来分工完成的。其模块如图6所示。
图6 模块
我们都知道音乐会给人一种舒适感,引起人们的兴趣。在游戏中背景音乐音效是必不可少的,一方面可以增加游戏可玩性,给用户有种持续玩的兴趣。另一方面增加游戏真实感,以达到玩家和游戏场景人物的融合。目前Unity支持许多格式的音乐音效,开发者可以根据场景所需要的添加对应的音乐音效[4]。在添加之前,我们需要添加两个组件,一个类似于人的耳朵——AudioListener,另外一个就是类似于人的嘴巴——AudioSource,其中AudioSource用于添加音频片段。这里我们为了方便管理,建立了一个AudioManager,用于管理整个游戏中的音乐音效,只要在需要的地方进行调用相应的函数即可。最新版的Unity改善之前音频系统,新增加了AudioMixer(音频混合器),其整合所有的音频片段,让玩家听到AudioMixer整合出来的音频片段。
可以想象在游戏中如果缺少动画,我们玩家扮演的角色将处于静止,周围的AINPC也将处于静止,这样的情况对于FPS、RPG等游戏类型是多么可怕的景象,所以说动画系统是整个游戏的灵魂也不为过。在Unity中提供了一整套动画系统,我们可以利用其进行动画制作,也可以从外部软件导入动画,通过新版本的Unity中AnimatorController进行动画状态之间的控制。在大多数3D游戏角色都带有若干种动画状态,例如本文设计的游戏中的角色,包含跳、左右转、下蹲以及死亡在内的五种动画,这些动画状态之间的切换是通过Unity动画系统中的状态机进行控制的,在操作的时候需要设置触发参数,Unity为我们提供了Float、Int、Bool以及Trigger四种参数,利用这些参数我们可以轻松地去实现各个状态的融合,使动作看起来更加的逼真、协调[5-6]。
游戏虽然有属于自己的独特逻辑,但是这些逻辑也必须符合物理世界的规律。在游戏中不能出现角色穿墙而过,踏地而落的情况,那碰撞检测在游戏中起到关键性作用了。通过碰撞检测可以使我们的游戏效果更加的逼真。Unity提供Rigidbody、CharacterControlloer、Collider以及Trigger在内物理碰撞器和触发器,其实质就是一些包围盒算法[7],这些都需要绑定到主角或者相应的物体上,以便发生碰撞的时候检测到。本文通过碰撞检测来实现主角的物品拾取,判断是否和周围的障碍发生碰撞,然后决定其生死。
内存管理是每个开发者必须考虑的,内存使用率过高导致游戏本身运行变慢,出现卡顿现象,那带来的后果就是给用户体验差,导致游戏生命周期变短。Unity提供了很多内存管理方式,以便对对象的动态加载以及和动态回收,方便有效地利用内存。本文介绍两种资源管理,AssetBuddle打包及对象池,本文使用后者。
AssetBuddle是专门为Unity Pro付费提供的功能,它可以将游戏场景中的对象或者资源文件转化为二进制封装在AssetBuddle中,以便动态的加载。虽然这种办法很强劲,但对于没有个人预算的开发者并不建议,原因是其会产生一定的成本。这里我们推荐一种比较好的内存管理——对象池。图7所示为对象池的结构。
图7 对象池
对象池指的是在激活对象时,它从池中提取。在停用对象时,它放回池中,等待下一个请求。在C#中建立对象池实质就是集合的混用,集合可以用于动态增加或者减少,这样就方便对象池中的对象的获取和放入。在Unity创建对象池脚本之后,需要实例化。实例化有很多种办法,这里推荐两种办法。其一是创建一个Prefab,然后在需要的地方进行实例化。Prefab好处就是当我需要修改一类游戏物体属性时,我们不必一一的去操作,只需要去修改这类物体的Prefab即可,然后Apply一下即可应用到所有这类物体上,其大大方便了开发者。再则就是到Resources文件下进行加载,Unity为开发者提供了很多命名文件,开发者只需要将游戏物体或者资源放入这些文件中,然后调用API即可使用。本文实现的功能使用是第一种,通过提前创建需要的Prefab,然后再在场景中进行实例化。
4 实验结果与分析
本文通过对现有游戏开发常见的框架和脚本管理的研究,实现了一个简单的游戏客户端,所需要的开发环境为Unity3D和其自带编译器MonoDevelop。
图8(a)显示的本客户端使用的动画状态机,通过不同操作改变参数从而实现各个状态的之间的状态切换。图8(b)所示是对脚本的管理。图8(c)所示是通过碰撞检测对玩家和金币或者墙壁碰撞进行检测,当主角碰到金币之后,金币自动回收,然后设置钱Active为false。当主角碰到墙壁时,触发状态机切换状态为死亡状态。
图8 效果图
5 结语
本文通过学习Unity3D游戏引擎各个组件的基础上,通过对目前游戏开发框架和脚本管理方式的研究,实现了一个简单的游戏客户端开发。实现了游戏主角的动画状态切换、物品拾取,以及音频音效的管理等功能,一方面体现出Unity3D游戏开发平台的强大性,另一方面体现使用合理的管理方式对游戏开发的重要性。本文游戏还可以进一步进行扩展功能,例如登录注册,金币积分累计等功能,在资源材质方面还可以进步通过Shader来进一步美化。
[1]王树斌.浅析Unity3D开发游戏流程及常用技术[J].电脑知识与技术,2012.
[2]张敏.基于Unit 3D的游戏的设计与实现[J].计算机光盘软件与应用,2014.
[3]赵海峰.基于Unity3D的游戏开发与设计[D].山东:山东科技大学,2014.
[4]杨娜,李杰,廖金巧.基于Unity3D的三维生态庄园游戏设计与实现[J].现代计算机,2015.
[5]宣雨松.Unity3D游戏开发[M].北京:Unity3D游戏开发,2012.
[6]路朝龙.Unity权威指南[M].北京:中国青年出版社,2014.5.
[7]林巧民,林萍,王汝芬.3D游戏开发中的碰撞检测算法研究[J].计算机技术与发展,2010.
Game Development;Basic Framework;General Management Mode;Client
Research and Development of Client in the Framework of the Basic Game Based on Unity3D
LIANG Cheng
(School of Computer and Software Engineering,Xihua University,Chengdu 610039)
1007-1423(2015)25-0078-05
10.3969/j.issn.1007-1423.2015.25.020
梁成(1989-),男,重庆开县人,在读研究生,研究方向为游戏理论与虚拟现实
2015-07-09
2015-08-20
对于大多数人来说游戏开发是一项很神秘的工作,为了揭开这层神秘的面纱,通过研究现有游戏开发,总结游戏开发中的基本游戏框架和脚本通用管理方式。利用Unity3D平台,在基本游戏框架和通用管理方式下实现游戏客户端的设计与开发,从而让更多的游戏爱好者了解游戏的开发过程。
游戏开发;基本框架;通用管理方式;客户端
For most people,game development is a very mysterious work,in order to uncover the layer of mystery,studies the existing game development,summaries the basic game framework and scripting common management.Uses Unity3D platform,under the basic game framework and common management approach to achieve the client's game design and development,so that more game enthusiasts can understand the game development process.