APP下载

基于Unity3D游戏客户端开发框架的设计与应用

2016-10-18桑琪叶德建

微型电脑应用 2016年6期
关键词:管理器消息客户端

桑琪,叶德建

基于Unity3D游戏客户端开发框架的设计与应用

桑琪,叶德建

游戏行业竞争日益激烈,从现有的游戏开发中汲取经验形成框架是应对残酷市场的必由之路。从实践出发,从长期的游戏开发经验中总结了一套通用的Unity3D游戏客户端开发框架,采用通用管理器的方式有效组织管理场景中的游戏对象以及控制游戏对象的脚本,以通用组件的形式支持整个游戏功能系统的开发。简述了UI框架、消息管理器、游戏对象缓存池3个框架层基础组件的设计与实现,并以一款即时战略游戏为例讲解了如何利用该框架进行客户端开发。

Unity3D;游戏客户端框架;通用管理器

章编号:1007-757X(2016)06-0066-04

0 引言

游戏作为近年来国家大力支持的文化创意产业,一直呈高速发展的趋势。就《2015年中国游戏产业报告》显示,中国游戏市场2015年收入达1407亿,同比增长22.9%[1]。随着游戏行业膨胀式的发展,中国游戏行业竞争越来越激烈。在这样的市场环境下,如何利用更短的时间开发出高质量的游戏成为游戏开发人员关注的焦点。伴随着游戏开发技术的成熟,游戏引擎不断进化发展,极大提高了游戏开发的效率,Unity3D作为游戏引擎中的翘楚成为各大游戏尤其是3D游戏开发商们的首选。

Unity3D拥有着多个子系统,如渲染引擎、物理引擎、动画系统、粒子特效等等,它们以组件的形式支持着游戏开发人员们的开发工作[2]。使用Unity3D开发游戏的基本原理是通过编写脚本调用这些组件,生成并控制场景中的各类游戏对象从而形成一个完整的游戏。然而如何更加有效地组织管理场景中的游戏对象以及控制游戏对象的脚本,需要在游戏开发中有一定的技术及经验积累。

Kim, Ae Hyun 、De Macedo等人针对应用Unity3D引擎进行游戏开发中的常用技术以及开发流程做了简单介绍[3-6],于Unity3D引擎的理解仅仅停留于使用层面。王超明、吕林轩、郭一晶等都曾经介绍过某Unity3D游戏具体功能系统的设计与实现[7-9],但并没有提取出通用的游戏客户端开发框架。本文在实践的基础上,总结出一套通用的Unity3D游戏客户端开发框架,将游戏开发中最常用的组件、功能整合起来,利用软件复用的思想进一步提升了游戏开发的效率,同时还可形成技术上的沉淀。

1 通用管理器

Unity3D功能异常强大,它提供了各种API让游戏开发者通过给游戏对象添加组件以及编写脚本的方式实现各种游戏功能,如角色动画、碰撞检测、播放音乐音效等等。但如果整个游戏开发仅仅以叠加脚本添加组件的方式完成,不但无法实现复杂的游戏逻辑甚至还会让整个项目混乱不堪难以维护[10]。因此我们要学会以通用管理器的方式统一组织管理同类的功能系统。以管理音效播放的管理器AudioManager为例,在Unity3D中,播放音乐音效需要在游戏场景的声源处添加AudioSource组件用以挂载音频源文件,在实际的游戏中我们往往需要在不同的时间播放不同的音效,因此需要实现一个AudioManager来管理游戏中的所有音乐音效的播放而非频繁得挂载音频文件。首先在AudioManager中维护一个音效字典,以key为标记,在管理器初始化时统一挂载好所有所需的音频文件,当需要播放音频的时候调用AudioManager对应的函数同时传入所需音频的key即可。

在整个游戏开发中,通用管理器的思想贯穿了从基本游戏框架到客户端功能系统的设计实现,这种思想也与面向对象编程的思想相统一。整个游戏通常以组件式进行开发,一个组件往往是一个大的管理器,其中可能包含许多小的管理器。

2 基本游戏框架

同其他软件开发一样,游戏开发也遵循类似MVC框架的模型视图分离的准则。沿用Unity3d本身的层级思想,本文的游戏框架也采用分层设计。整个游戏从下到上依次为系统层、框架层、数据层、控制层、视图层,如图1所示:

图1 游戏分层设计示意图

系统层,即游戏最终运行在什么平台上。众所周知,Unity3D可进行跨平台发布,可发布游戏至IOS、Android、Windows phone 8等多种平台。

框架层,顾名思义,游戏开发的通用底层支持,可轻松复用于不同游戏的开发,包括UI框架、消息管理器、游戏对象缓存池等基础组件。

上面3层为大家所熟悉的MVC框架,即模型(model)-视图(view)-控制器(controller)。

模型(Model)层用于处理游戏数据逻辑,负责在数据库中存取数据或序列化与反序列化本地数据。我们将游戏数据划分为两大类:持久化数据和运行时数据。持久化数据包括游戏本身的配置表和用户持久化信息,运行时数据是游戏运行时的临时数据。

视图(View)层包括UI层和各类游戏对象的行为表现。UI层即用户看到的游戏界面,用以显示相应的游戏数据。

控制(Controller)层是游戏开发中各类管理器的合集,从View层读取数据,控制用户输入,并向Model层发送数据。集中表现在游戏对象的生成与控制。

采用此种划分层次可以让数据与逻辑分离,使游戏开发更具条理和效率。下文中我们先依次介绍框架层三个重要基础组件的设计与实现,然后以ARPG游戏的游戏角色为例详细解释游戏对象的生成与控制。

3 框架层的设计与实现

游戏框架对于后期游戏功能系统的开发影响深远,合理的游戏框架应该在提高游戏开发效率的前提下同时兼顾游戏项目的稳定性以及可扩展性,组件式的开发成为各游戏开发项目的首选。在这一部分,我们将介绍框架层三个非常重要基础组件:基于NGUI的UI框架、消息管理器、游戏对象缓存池。

3.1基于NGUI的UI框架

NGUI是目前Unity3D游戏开发团队最常用的UI插件,提供了强大的UI系统和事件通知框架。NGUI基于组件化、模块化的原则,可以使开发者们使用非常少的代码以及操作便可实现各类UI控件。

我们基于NGUI插件设计实现了一个UI框架,它具备以下功能特点:由UIManager统一管理游戏各UI界面的显示、关闭、隐藏;提供插入界面动画的接口;通过3个按钮与相应回调函数的隐藏与显示实现通用对话框;同时管理各UI界面的上下文Context,Context保存着UI界面的数据信息,我们通过栈的方式管理Context,从而实现界面的有序跳转;用Mask遮罩提供插入新手教程的功能。应用此框架可以让开发人员专注实现单个UI界面的逻辑而不用担心界面的显示关闭以及跳转的实现,极大提高了游戏界面的开发效率。

3.2消息管理器

游戏通常要涉及各类游戏对象间的交互以及各个模块的交互,为了实现模块间的松耦合,我们一般采用消息驱动的方法来达到交互的目的。我们借鉴观察者模式开发消息管理器模块。模块主要包括消息中心MessageCenter,消息观察者Observer,消息发送者MessageSender,消息Message4部分,四者的交互活动图如图2所示:

图2 消息管理器活动图

MessageCenter是整个消息管理器的消息中枢,起着一个消息中介的作用,它维护一个消息队列,负责接收以及转发游戏的所有消息。Observer把自己以及自己感兴趣的消息对应得注册到MessageCenter中的消息队列中,相对的当Observer对消息不再感兴趣时,也可以随时向MessageCenter取消注册。EventSender产生并发送相应的Message到MessageCenter,MessageCenter会遍历自己的消息队列,找到监听该消息的Observers并把Message转发给它们。

我们举个例子来说明消息管理器的应用。在游戏战斗过程中,如果主角死亡往往会结束战斗并跳出结算界面,但战斗流程控制与角色行为管理是两个不相关的模块,如果角色行为管理器直接调用战斗流程控制器的结算接口会增加两个模块的耦合性,这个时候我们便可以借助消息管理器。我们封装一个MainPlayer_Dead的Message加入MessageCenter的消息队列中供战斗流程控制器注册监控,当主角死亡时由角色行为管理器发送该消息即可。

消息管理器的应用让我们避免了模块间或游戏对象间交互时的显示调用,让游戏模块间保持低耦合,非常方便游戏开发后期功能的扩展。

3.3游戏对象缓存池

前文中提到游戏由大量不同种类的游戏对象组成,这些游戏对象在游戏运行过程中需要不停地创建、销毁,如果频繁调用Unity3D游戏对象实例化API (GameObject.Ins -tiante())与对象销毁API(GameObject.Destroy() )会造成游戏频繁卡顿同时会产生很多内存碎片。游戏对象缓存池很好地解决了这一问题,它在合理利用设备内存的同时还能保证游戏画面的流畅。游戏场景开始加载的时候我们预先实例化一定数量的接下来要用到的游戏对象,将游戏对象置为非激活状态放入缓存池,对象实例化的数量根据需求决定,例如金币同屏最多30个,则可以在最开始时实例化30个金币。如图3所示:

图3 对象池设计图

当外部需要某种游戏对象时可直接从缓存池获取,然后把游戏对象置为激活状态,外部用完该游戏对象后返还给缓存池并置回为非激活状态。当切换游戏场景或终止游戏的时候,我们会对缓存池进行一次性清理。采用此种方式管理游戏对象非常有效地管理了内存并避免了内存泄漏。

4 客户端设计与实现

为了验证该客户端框架的可用性,我们采用此框架实现了一款动作类即时战略游戏,游戏场景、人物为全3D设计,以战斗中控制大招点放,聚焦各人物特色技能为亮点。我们把该游戏的开发分为两块,战斗系统和除战斗系统之外的系统(简称外围系统)。外围系统通常包括人物养成系统、副本系统、商城系统、邮件系统等等,由于篇幅的限制,本文将主要介绍体现游戏核心玩法的战斗系统。

我们将战斗场景中的游戏对象分为两大部分:前方UI界面与后方的场景对象。UI界面是2D的,后方场景对象则为3D。后方的场景对象一般包括角色对象、地图资源、武器对象以及各类特效等等,体现了游戏的核心玩法。作为游戏的重要一部分,大量游戏界面用来显示玩家与游戏内各类信息。上文我们已经介绍了基于NGUI的UI框架用来生成与控制大量的UI界面,这里我们将针对后方场景游戏对象的生成与控制进行简单的介绍,并以战斗中角色对象的管理器为例进行详细的说明。

4.1游戏对象的生成与控制

一方面在战斗场景中每个动态的游戏对象都是一个单独的线程,不断根据用户的操作或者事件的进行自我更新并改变自身的行为,复杂的游戏对象往往需要几个组件来控制自身的行为,如场景中的人物角色,需要动画播放组件、位置管理组件、行为状态机以及碰撞处理器等等,每个组件独立负责自己的功能逻辑,在需要通信的时候利用上文介绍的消息管理器,这些组件采用组合模式,构成整个人物角色的控制器。游戏对象的种类多种多样,因此我们一般采用Factory模式生成对象,将游戏对象各个组件的创建与初始化工作统一封装起来。这里对应上文游戏对象缓存池的应用,实例化对象采用抽象工厂模式,不同的游戏对象注册不同的工厂方法到对象池,以key为标记,非常方便后期新对象的扩展。游戏对象缓存池初始化时,根据工厂字典用不同的构造方法生成各类游戏对象加入缓存池的缓存队列中,供上层随时获取对象。

另一方面游戏战斗中一般都有暂停、恢复功能,甚至有几倍速播放的需求,因此要求我们实现一个对象控制中心来统一管理所有的动态游戏对象。所有的游戏对象都需要实现IUpdate接口的Update方法,在该方法中更新所有的相关组件。当加载战斗场景时,所有的对象从缓存池中获取后便加入对象控制中心的更新队列中,战斗进行时通过对象控制中心统一调用Update方法来定时更新所有游戏对象,这样我们便可以通过控制Update方法的调用频率来实现所有游戏对象统一暂停、恢复以及变速播放的目的。

4.2角色管理器

角色对象是游戏战斗中最重要的组成元素,要想充分地吸引并留住玩家除了精致的角色美术模型还要有合理流畅的管理器,因此角色管理器的设计在游戏总体设计中处于核心地位。它需要的主要组件如图4所示:

图4 游戏角色管理组件图

我们将依次介绍组件的设计与实现。

4.2.1动画管理器

任何游戏都离不开动画,尤其在突出人物角色的游戏中,角色动画是否逼真、流畅直接关系到游戏的直接体验。动画的逼真程度往往取决于美术工作人员,但动画是否能自然融合和过度以及跟周围环境进行交互还是程序开发人员的工作。

Unity3本身提供了动画播放组件Animation和Animator,它支持动画播放、停止、改变速度以及动画融合。但这些并不足以满足我们复杂的系统需求,Unity3D本身的动画播放组件是基于时间自动播放动画的,但我们需要动画组件服从对象控制中心的统一调用进行帧更新,于是我们编写了动画管理器组件,它实现了以下功能:提供一个适配层让动画根据帧来进行播放,从而实现动画的暂停、恢复以及变速播放;加入伴随角色动画的特效动画,让特效动画与角色动画保持同步播放;同时加入动画事件系统,实现动画依赖的事件回调,如角色攻击的伤害判定。

应用此动画管理器组件可以方便得控制角色动作的播放,添加动画事件与周围环境进行流畅交互,增加角色运动的多样性,给玩家带来强烈的视觉感受。

4.2.2行为管理器

游戏角色在游戏运行时往往有着不同的行为状态,如待机、攻击、奔跑等等。游戏角色在不同的行为状态下会产生不一样的行为,并会在达到一定条件时切换行为状态,这便构成了角色的行为状态机。我们采用了状态机模式实现了行为管理器,所有行为实现三个接口供行为管理器调用,分别为:状态更新Update,进入状态OnEnter,离开状态OnExit。行为管理器作为角色行为状态的控制中心,它维护该角色所有会产生行为的字典,以行为枚举类为key,同时维护角色当前唯一的行为状态currentBehavior,行为管理器每帧的更新操作会调用currentBehavior的更新操作,当达到一定条件时调用设置行为的函数并传入枚举类值来切换行为状态,此时会自动调用老行为状态的OnExit操作,同时调用新行为状态的OnEnter操作。

采用行为管理器控制角色行为逻辑,可以让开发者更加关注每个行为的具体逻辑而不用担心状态的切换。

4.2.3碰撞处理器

游戏尤其动作类游戏中避免不了对碰撞事件的处理,例如子弹碰到角色需要处理角色受击,NPC角色在行走模式时碰到敌方角色或塔防需要切换至攻击模式,碰到友方角色或塔防等障碍物需要改变行进路线。Unity3D提供了碰撞检测的API,需要给游戏对象添加碰撞器Collider跟刚体Rigidbody组件。碰撞器有各种形状,Box Collider、Sphere Collider、Mesh Collider等等,我们可以根据具体需求来进行选择。刚体用来描绘游戏对象的各种物理属性,可以让游戏对象在碰撞后严格遵照物理规则来运动。两个游戏对象产生碰撞的前提是,两个对象都带有碰撞体同时至少其中一个对象带有刚体。

Unity3D内的碰撞处理的方式有两种,一种是利用碰撞器,游戏对象碰撞前后会调用碰撞函数OnCollisionEnter/ Stay/Exit,同时根据物理规则产生碰撞效果。另一种是利用触发器,即把对象身上碰撞器的IsTrigger属性置为True,这种情况下仅调用碰撞函数OnTriggerEnter/Stay/Exit,而不产生任何碰撞效果。

游戏开发过程中,为了保证对所有游戏对象的可控性,我们一般采用后者来处理碰撞。我们的角色碰撞处理器便是为了处理游戏对象间的碰撞事件,它继承于MonoBehavior脚本覆写以下几个函数:

MonoBehaviour.OnTriggerEnter(Collider other)当进入触发器MonoBehaviour.OnTriggerExit(Collider other)当退出触发器MonoBehaviour.OnTriggerStay(Collider other)当逗留触发器我们可以通过传入的Collider获取相应的游戏对象从而处理一系列的碰撞事件。

5 实验结果

我们应用上文描述的客户端开发框架开发了一个全3D即时战略游戏,该游戏项目实现了多种复杂的游戏系统,稳定并具有很强的扩展性。目前该项目已经上线运营,精细的画风配合流畅多样的玩法得到玩家的一致好评,如图5所示:

图5 游戏效果图

图5(a)为游戏的主界面,中间部分展示的人物角色可以通过碰撞与玩家进行交互,周围的UI部分展示了游戏的个功能入口。图5(b)为抽奖界面,得意于功能强大的UI框架,抽奖面板可来回翻转。图5(c)为炫酷的战斗场景,玩家可通过点击下方人物头像释放对应人物技能。

6 总结

本文阐述了一套通用的Unity3D游戏客户端开发框架,并利用此框架开发了一个全3D即时战略游戏。实践证明,好的Unity3D程序员不仅要熟练使用引擎本身,还要学会在开发过程中吸取经验教训,总结出好的游戏开发框架,将通用常用的功能组件提取整理,如此可以很大程度上减少开发下一个游戏的工作量。除此之外我们还要学会与团队其他成员保持良好的沟通。

[1] 中国游戏产业报告[Z]. 2016.

[2] 谢文斌. 基于游戏引擎的沉浸式立体显示游戏框架设计与实现[D]. 复旦大学, 2013.

[3] Kim A H, Bae J H. Development of Mobile Game Using Multiplatform (Unity3D) Game Engine[J]. International Journal of Intelligent Information Processing. 2014.

[4] De Macedo D V, Formico Rodrigues M A. Experiences with rapid mobile game development using unity engine[J]. Computers in Entertainment. 2011, 9(3): 1-12.

[5] Xie J. Research on key technologies base Unity3D game engine[C]. 2012.

[6] Jie J, Yang K, Haihui S. Research on the 3D Game Scene Optimization of Mobile Phone Based on the Unity 3D Engine[C]. 2011.

[7] 王超明. 基于 Unity3D 引擎的赛车手机游戏的设计与实现[D]. 北京交通大学, 2015.

[8] 吕林轩. 基于 Unity3D 的 “全民快跑” 客户端的设计与实现[D]. 北京交通大学, 2015.

[9] 郭一晶, 吴文树. 基于 Android 的飞行射击游戏的设计与实现[J]. 微型电脑应用, 2014, 30(6): 13-15.

[10] 左强. 设计模式与游戏开发[J]. 程序员:游戏创造. 2006(3): 56-62.

Design and Application of Mobile Game Client Development Framework Based on Unity3D

Sang Qi1,2, Ye Dejian1,2
(1. Software School, Fudan University, Shanghai 201203, China;2. Engineering Research Center of Cyber Security Auditing and Monitoring, Ministry of Education, Shanghai 201203, China))

Along with the increasingly fierce competition in the game industry, forming a framework from the experience of existing game development is the only way to deal with the brutal market. This paper sums up a general framework for the development of the Unity3D game client based on the long-term game development experience, which uses the method of general manager to effectively organize the game objects in the scene as well as the control scripts of the game objects. In this paper, it first briefly describes three basic components in the frame layer including UI framework, message manager and buffer pool of game objects. Then it explains how to use the framework for client development with a real-time strategy game as an example.

Unity3D; Game Client Framework; General Manager

TP311

A

2016.02.20)

桑 琪(1990-),女,复旦大学,软件学院,网路信息安全审计监控教育部工程科研中心,硕士,研究方向:网络多媒体,上海,201203

叶德建(1976-),男,复旦大学,软件学院,网路信息安全审计监控教育部工程科研中心,副教授,博士,研究方向:宽带网络与互动媒体,上海,201203

猜你喜欢

管理器消息客户端
启动Windows11任务管理器的几种方法
应急状态启动磁盘管理器
一张图看5G消息
如何看待传统媒体新闻客户端的“断舍离”?
Windows文件缓冲处理技术概述
县级台在突发事件报道中如何应用手机客户端
孵化垂直频道:新闻客户端新策略
大枢纽 云平台 客户端——中央人民广播电台的探索之路
消息
消息