收藏 分享(赏)

基于Unity3D的角色扮演类游戏设计.doc

上传人:wo7103235 文档编号:6571064 上传时间:2019-04-17 格式:DOC 页数:30 大小:24.58MB
下载 相关 举报
基于Unity3D的角色扮演类游戏设计.doc_第1页
第1页 / 共30页
基于Unity3D的角色扮演类游戏设计.doc_第2页
第2页 / 共30页
基于Unity3D的角色扮演类游戏设计.doc_第3页
第3页 / 共30页
基于Unity3D的角色扮演类游戏设计.doc_第4页
第4页 / 共30页
基于Unity3D的角色扮演类游戏设计.doc_第5页
第5页 / 共30页
点击查看更多>>
资源描述

1、基于 Unity3D 的角色扮演类游戏设计专业:数字媒体技术【摘要】游戏开发行业,随着移动领域的崛起,近年来变得越加火热,各游戏开发公司纷纷投入移动游戏的研究开发,其中 Unity3D和 Cocos2D 两款引擎受到了各公司的青睐,游戏开发人员供不应求。本文将介绍如何用 Unity3D 引擎开发一款角色扮演类游戏的全过程,其中包含了 Unity3D 引擎使用的介绍、游戏策划及游戏各大功能模块的实现。在游戏策划中将规划整个游戏项目的背景故事,游戏场景,游戏系统等,为后面实现游戏功能代码打好基石。在游戏程序开发中,将使用 Unity3D 提供的编辑器结合 C#先实现游戏流程整个程序框架,然后按照框

2、架流程完成游戏各个模块的功能,最后将游戏进行 Windows 和 Android 双平台打包调试。1 前言1.1 项目背景与设计理念随便国家的富强,科技的发展,越来越多的人们需要在工作闲时进行娱乐休闲,游戏产业也随之诞生。在 21 世纪的互联网高速发展之期,游戏行业不断壮大,从最早的红白机时代,再到主机时代,随后 PC 计算机的崛起让游戏行业大放光彩,直到近年来移动领域的热潮又将手机游戏推向了顶峰。在这样的背景下,也越来越多的公司投入的游戏研发中,不过由于每次开发一款游戏都得重头开始编码,效率低,成本高,所以游戏设计者想如何去复用之前的东西从而进行快速发开。慢慢的,游戏引擎(GameEngin

3、e) 问世了,它集成了图形引擎、物理引擎、碰撞检测系统、音效、脚本引擎、电脑动画、人工智能、网络引擎以及场景管理等,为游戏设计者提供各种编写游戏所需的各种工具,大大提高了游戏设计者开发游戏的时间和成本。1.2 游戏设计方法与实现技术角色扮演类游戏(Role-Playing Game) ,提供虚拟的计算机游戏世界,该游戏世界提供虚拟的游戏角色供玩家选择并操作,最终使得玩家在该世界实现自己的第二人生为目标。RPG 框架的设计和研究自 RPG 诞生以来不断进步,至今发展到由引擎技术制作的时代。RPG 游戏设计较为复杂,系统主要以战斗、剧情、任务,交互、装备等系统为主,其中战斗系统为 RPG 游戏设计

4、的核心部分。战斗系统主要包含:1、 属性系统:这是游戏中最简单的系统,包括了主角、物品、NPC、技能、怪物等各自的属性值,通过属性值可计算出战斗中各种逻辑交互数值。2、 状态机系统:该系统标志着一个人物或者怪物现处于什么状态,相对于动作而言,人物是站立中?还是跑动中?还是与敌人打斗中?当然有些状态还是可以同时拥有的,这些状态需要在程序中利用不同的变量值来区分。所以战斗规则越多,状态机逻辑也就越复杂,所以在开发过程中需要预先制定好一套方案,否则在后续开发中将越加难以维护。3、 行为系统:该系统决定了游戏的表演方式,每一个动作或者声音的表现都由行为系统来管理。4、 人工智能(AI):该系统主要为了

5、人机交互而生,在战斗过程中,敌人将以怎样的表现和玩家对战,越是强大的敌人,其 AI 设计过程也就越复杂,需要通过不一样的算法结合起来推导出一套怪物的 AI 指令。1.3 本项目的设计思路与实现技术本项目将设计一款角色扮演类游戏,游戏将采用 Unity 引擎进行制作,游戏中将实现游戏登录、交互、战斗、保存等几大功能,各功能间还包含了许多与之相依赖的小功能。项目利用.net 下mono 的跨平台编译技术,使用 C#在 windows 环境下进行跨平台开发,再结合 Unity 引擎提供了强大的 API 函数库和渲染引擎技术来实现整个 RPG 游戏的技术实现。1.4 本项目的主要工作任务本项目的的主要

6、设计工作包括:(1) 设计一款基于移动平台的 RPG 游戏(2) 策划 RPG 游戏各模块玩法及系统功能(3) 利用 Unity3D 引擎完整的实现游戏所有功能(4) 对最终实现游戏进行打包调试本项目通过对 Unity3D 引擎的一年的学习,实验了许多的小项目,最后总结了如何利用它来快速开发一款 RPG 游戏,从前期的游戏策划,游戏功能布局,再到游戏的程序框架、功能开发,到最后的打包调式,本文都将通过该实例一一描述。2 项目介绍2.1 游戏引擎介绍Unity3D 是一款由 Unity Technologies 开发的跨平台游戏引擎,该引擎集成了强大的可视化用户编辑器,采用了组件式开发,使开发者

7、能快速的开发出自己的游戏。该引擎由于可进行跨平台发开,在移动领域崛起时,受到了很多开发者的青睐,现已越来越多的开发者投入其中,已成为目前世界上使用最广泛的游戏引擎。在图形方面,Untiy3D 采用了主流的实时光照,Lightmapping,全局光照 GI等技术,使游戏界面更加逼真。在程序方面,该引擎支持用 C#和原生的 UntiyScript 进行开发,大大加快了用户开发进度,而且还提供了 AssetStore 商店,让开发者能在里面找到想要的插件,能快速实现想要的功能及效果。2.2 游戏介绍本文将以中国古代唐朝做为历史背景,利用 Unity3D 开发一款基于移动端的 ARPG 手游。游戏类型

8、:ARPG游戏平台:Win、Android游戏风格:中国古代游戏玩法:玩家通过副本战斗消灭敌人获得奖励,还可以通过商店购买等不断强大自己。2.3 游戏故事背景在开发游戏前,制定一个好的背景题材将决定了游戏后期的发展。如何定一个好的故事背景,需要针对玩家的喜好而决定,好的题材将更喜欢玩家的关注,所以好的故事题材将为游戏奠定基石。本文中,制定了近期较为火热的中国古代唐朝题材为背景故事,打造一款即时战斗的 ARPG 游戏,让玩家在游戏中体验打斗的快感和古典韵味。2.4 游戏场景游戏场景作为游戏主要的交互区,它承载了玩家在游戏中的大部分交互,其对游戏的重要性不言而喻。游戏场景可分为 2D 和 3D,2

9、D 场景都是由一张张图片拼成,效果相比 3D 稍差一些,3D 给人感觉更真实,仿佛身临其境的感觉。游戏场景还分为很多种风格,有古风,韩风,欧美风,日漫风,水墨风格等等,该如何去选择这就需要根据题材来决定了。本文中由于题材定位中国古代,所以场景也为中国古代风格的场景, 其风格华丽,浑厚庄重,线条平直硬拐,装饰丰富,令人感觉心旷神怡。图 2.4 (1)华丽的长安城图 2.4 (2)华丽的长安城2.5 游戏角色一款好玩的游戏、受欢迎的游戏,其中必定有几位受人欢迎的角色,每个角色有着自己独特的性格和能力,更加能被玩家们记住。那么要创作一些好的角色也不容易,其中有一点很重要,那就是每个角色都要有自己存在

10、的价值,形成鲜明的对比,要与其他角色与众不同,因为玩家们总是会喜欢独特的那位。本文中的游戏主角为一位初出茅庐的道士,道士途中遇到了各种磨难,消灭敌人,一步步的成长起来。道士的武功主要以剑术为主,因为性格较为外向,相信颇受玩家喜爱。本作中还有另外两位角色,后续还可以继续为游戏添加新角色,从而丰富游戏哦。图 2.5 帅气的道士2.6 游戏系统本文中的游戏功能系统主要为分以下几类 游戏登录 创建角色 背包系统 装备系统 战斗系统 副本系统 商店系统 NPC 系统 数值系统以上几类为本游戏大致的游戏功能,这些功能在 RPG 类型的游戏中必备的几项,通过这些功能系统,能够展示出一款 RPG 游戏的核心玩

11、法。其中数值系统最为重要,一款好的 RPG 游戏不仅要满足玩家对画面以及功能上的需求,还要满足玩家的虚荣心。一款 RPG 游戏是不是好玩,和数值的相关性不是特别大,但是游戏是不是不好玩以及能玩的多深入,和数值的关系就很大了。数值做的不好,在表现层面上是让游戏流程的体验不好,比较容易出现的两个极端是过度的挫折感(练功十年,出门就被小兵秒)和茫然所失的成就感(玩家还没发力,Boss 就扑街了?)!所以说,如何巧妙的运用这些数值来构建起整个游戏的可玩性是至关重要的,得学会如何去根据玩家的需求来构建不一样的数值系统。3 游戏程序框架设计3.1 游戏核心本游戏将采用组件式的模式进行开发,不同组件维护着自

12、己相关的功能,不与其他组件进行直接交互,降低层与层之间的耦合(俗称:解耦) ,便于后期维护。本作还将根据 MVC 模式,即数据模型(游戏数据)、视图(UI)和控制器(管理器)来编写整套逻辑程序。MVC 模式所带来的优点:1、开发人员可以只关注整个结构中的其中某一层;2、可以很容易的用新的实现来替换原有层次的实现;3、可以降低层与层之间的依赖;4、有利于标准化;5、利于各层逻辑的复用。数据:管理游戏程序中各种数值数据。视图:Unity 中的控件都必须继承于 Monobehaviour。管理器:对数据和 UI 进行操作和管理。本文中的管理器都将继承于 Graduation.Component,这个

13、类是本作者自己写的一个组件管理,利用组件容器将每个管理器加入容器中,便于对各模块的管理器进行管理和交互。游戏核心架构:游戏核心(GameCore) (单例)游戏管理器(GameManager):场景管理器(SceneManager)数据管理器(DataManager)资源管理器(ResourceManager)UI 管理器(UIManager)游戏组件(Component):音效管理器(SoundManager)网络管理器(NetManager)配置管理器(ConfigManager)逻辑管理器(LogicManager)动画管理器(AnimationManager)游戏启动流程:/ 启动游戏

14、./ 1.加载配置表InitConfig();/ 2.加载组件InitComponent();/ 3.加载游戏资源InitResource();/ 4.初始化网络模块InitNetwork();/ 5.进入游戏EnterGame();图 3.1 游戏核心框架流程图为了游戏开发中的方便使用,作者在开发前已经封装好了一整套常用工具库,工具库大致包含:文件读写工具类,数值计算工具类,UI 工具类,序列化工具类等。有了这些工具库,在开发中可以更快速编码,省去了频繁写一些常用逻辑的时间。3.2 游戏 UI 框架在 Unity3D 早起的版本里,UI 系统在引擎中是较为薄弱的,只能通过 Unity 提供的

15、一些 API 来实现 UI 的搭建,但这种方式效率实在太差,改起来也非常麻烦。由于 Untiy 越加的火热,Unity 的Asset Store 商店的插件也越来越多,其中 Next-GUI 插件(下文简称:NGUI)最受开发者欢迎,因为其弥补了 Unity 本身的弱点,把 UI 系统变得非常的强大,甚至用完美来形容。使用 NGUI 插件可以让用户通过可视化界面的方式,只要在界面上拖入各种控件、脚本,再结合自己的一些逻辑代码即可完成游戏所需的界面。在 Unity4.6 版本中,Unity 开发组认识到了 UI 系统的薄弱,随即也在该版本发布了新版 UI 系统(简称;UGUI) 。它仅吸取了 N

16、GUI 的各种优点,由于 UGUI 属于原生系统,所以性能上会比 NGUI 好很多,渐渐的也被开发者所接纳。在本游戏中,将采用 Unity 最新的 UGUI 系统来完成整套游戏 UI 界面的开发,并讲述如何来搭建游戏的 UI 框架,一套好的 UI 框架将使后期开发起来更加便捷。图 3.2 游戏 UI 框架流程图UIBase:该类为所有 UI 脚本都继承的基类,该类重载了大多数 MonoBehaviour 函数,方便在后期资源管理以及界面动画等进行统一管理。UIManager:该类将统一管理所有 UI 界面的显示、隐藏、动画、音效,所以需要显示的 UI 界面都需要通过该类进行注册才能使用,该类还

17、提供各种通用 UI 界面,例如消息框,提示框,输入框,确认选择框等等。UIUtils:该类为静态类,是 UI 工具库,将提供大量功能型函数供 UI 界面使用,例如一些 UI 对齐,UI 的各种位置算法等。有了以上三大类,在后续的界面设计中就能轻松的利用他们实现一套完整的 UI 框架,实现每一个功能界面的需求。3.3 Lightmapping 光照烘焙光照烘焙,该技术是指通过计算机计算模拟得到的灯光效果,省去了采用实时灯光所带来的高消耗。简单来说就是实时灯光计算十分耗时,随着光源越多会倍增计算耗时。使用 Lightmap 模拟灯光带来的效果,便不用去计算灯光,会带来性能上的大大提升。当然你不用灯

18、光效果也是没问题的,具体还是看项目需求。最简单的直接在 3dmas 或 maya 里面烘培完贴图顶点色也行。对于移动手机游戏来说,由于硬件的原因,如果在 3D 游戏中大量的采用实时光照手机的性能是吃不消的,但如果不用实时光照效果又非常差。所以本文的游戏中将采用 Untiy Pro 版本自带的Lightmap 技术,大大减轻了游戏本身对手机性能带来的开销,而且使用 Lightmap 的画面效果又非常不错。首先,先在场景内,在合适的位置打好大量的点光源(Point Light) ,方向、位置、亮度这些都需要经过细心的调整。图 3.3 (1)Lightmapping 的使用其次,打开 Lightma

19、pping 面板调节具体的参数。图 3.3 (2)Lightmapping 的使用由于手游中并不需要太高的画质,所以这里作者调节的光照品质较为一般。最后,点击 Bake Scene 即可开始场景的烘焙,烘焙需要等待一段时间。看看烘焙后的效果是不是感觉好震撼?效果丝毫不逊于实时光照。图 3.3 (3)Lightmapping 的使用3.4 序列化与反序化3.4.1 序列化介绍序列化 (Serialization):将数据结构或对象转换成二进制串的过程反序列化(Deserialize):将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程这两个过程在游戏开发中被广泛的使用,因为其可以让游戏

20、在跨平台上方便的进行通讯传递,把一个完整的对象通过网络发送到终端。序列化还能将一个对象永久的保存在硬盘上,可以用于存储玩家的游戏数据。本文中将采用序列化方式来进行玩家数据存储,并在序列化过程中加入了加密解密技术,使得游戏数据不会轻易的被玩家所破坏。现在主流的序列化方式大致分为二进制序列化:二进制序列化的优点是可以精确地控制序列化及反序列化的过程,并可以序列化对象的非公共成员。其序列化过程的速度非常之快,而且序列化后的体积小,非常适合用来传输实时性较高的应用。但因为缺乏标准的协议,装拆箱比较麻烦。Json 序列化:JSON 起源于弱类型语言 Javascript,与 xml 相比,这种序列化简直

21、是太简单了,其只需要通过将变量用一个 key 对应一个 value 即可完成序列化,而且序列化速度比较快,仅次于Binary 方式。Xml 序列化:Xml 序列化历史较为悠久了,其缺点太明显了,冗余太大,但拥有的非常高的安全性与可扩展性,所以至今仍被广泛的使用着。序列化方案的选择:每种序列化协议都有优点和缺点,它们在设计之初有自己独特的应用场景。在系统设计的过程中,需要考虑序列化需求的方方面面,综合对比各种序列化协议的特性,最终给出一个折衷的方案。3.5.2 序列化应用本文中的游戏为了更节省空间和解析效率,采用二进制序列化方式,并对二进制序列化方案进行了二次封装,可更方便的在游戏中使用。本文中

22、所有需要序列化的对象都将继承与 SerializeData 类,在该类利用.net 自带的 ISerializable 接口通过 BinaryFormatter 对所有需要序列化的变量进行序列化并存储。附:序列化与反序列化代码(见附录)3.5 表格配置数据读取在游戏开发中,数值模型起到了很大的作用,它将很大程度上决定了游戏的可玩性。那么如何在游戏开发中方便的配置数值使游戏更具可玩性呢?由于 Unity 自身有着强大的编辑器,开发者可以直接在编辑器上修改变量的数值从而修改数据模型。但这样的作法看起来很方便,其实还是有很多弊端的。首先策划并不见得能很好的使用 Unity 进行数值编辑,其次这种方式

23、需要程序事先把所有变量都布局好供策划调整,而且中间经常会因为一些特殊的需求而出问题。所以如果在团队开发中,配置表格让策划自己填写无非是最好的方式了,策划只需要关心表中的字段和数值,然后根据游戏实际运行情况调整就行了。本文将介绍如何用 csv 表格(逗号分隔表)进行数值的读取,然后将它配置到游戏中去。(一) 、用 Excel 制作 csv 表格图 3.5(1)制作 csv 表格为了方便程序中开发使用,本作者自己制定了一套读取方案。打开 Excel 表格,填入数值字段及数值。数据行介绍:第一行:对应程序代码中的表类型第二行:数据字段,字段名对应程序中的表类型成员变量,后缀:s 结尾代表字符串,:a

24、 结尾代表整型数组,如果没有带后缀的则默认为整型数值。第三行:以 # 号开头的行代表这正行的数据作为解释行,不进行数据读取。第四行至结尾:这些行每行的数据都代表着一行数据记录,读取后写入内存中方便调用。(二) 、保存 csv 配置表选择另存为,选择 CSV(逗号分隔)类型的文件,修改文件名为 item.csv,然后保存至文档中。图 3.5(2)保存 csv 表格(三) 、解析 csv 配置表解析前需要先为该表定义指定数据类及成员变量。图 3.5(3)解析 csv 配置表如图 3.5(3) ,建立了两个类型,一个是 CsvBase,该类为所有 Csv 类型的基类,因为每个表的第一个字段必须是 t

25、id。第二个是 CsvItem 类,也就是我们上文的 Csv 表对应的类型,注意这里的变量名必须与表里填写的字段相同。由于这些字段是不可变的,所以为了防止开发中意外将数值覆盖,所以这里变量加了 readonly 修饰符,表示只读。但是如果设为只读,那在解析表数据的时候要怎么赋值呢?这里又要提到另外一项技术“反射” ,利用反射可以给字符串对应的变量进行赋值,并且在反射中是不受 readonly所限制的,这样就能快速的将字段与变量配对,不需要一个一个去判断那么繁琐了。解析 csv 表关键点主要是对字符串进行操作,先用 File.ReadAllText()将 item.csv 读取进来,然后利用 s

26、tring.split 对读取后的字符串进行拆分,先对行进行分割,把数据分割为 n 行,然后对行进行解析,分析出每一行的作用,将其进行相应的赋值操作。接着对数据行进行逗号拆分,分为每一个数据项,然后利用反射赋值给对应的类型变量中。最后新建一个 Dictionary 将这些数据存起来供程序中使用。附:Csv 配置表解析代码(见附录)4 游戏功能模块实现4.2 创建角色本游戏初始将提供玩家自由创建想要的角色,玩家根据需求创建角色,每个角色都有不一样的职业。编写 CreateRoleManager 类,该类用于管理玩家创建角色,完成确认选择后将选定的角色数据记录到 UserInfo 类用户数据中并进

27、行存盘,下次玩家再次登录将可继续使用该角色。功能需求:1、 创建角色2、 随机角色名字3、 切换角色4、 选择角色/ 创建角色public void CreateRole(int roleIndex);/ 切换角色public void ChangeRole(int roleIndex);/ 选择角色public void SelectRole(int roleIndex);/ 随机角色名字public string RandomRoleName();/ 进入游戏public void EnterGame();图 4.2(1)创建角色界面图 4.2(2)角色选择界面4.3 背包系统背包系统将用

28、于存放玩家中打怪掉落的物品,实现该系统我们首先需要为创建一个背包管理器(InventoryManager) ,利用该管理器根据用户的背包数据来操作 UI 控件来实现整个背包系统的逻辑操作以及数据控制。第一步:首先我们需要先分析背包系统在逻辑功能上有几种基础操作功能1、 查看物品详细信息2、 交换背包物品位置,3、 添加物品4、 删除物品5、 整理背包了解了功能需求,就可以开始功能的实现了,在 InventoryManager 类下新建几个功能函数,利用这些函数对界面 UI 进行操作,实现背包系统的基本功能。/ 查看物品public void LookItemInfo(ItemBase _ite

29、m);/ 交互物品public void ChangeItem(InventoryItem _item1, InventoryItem _item2);/ 添加物品public void AddItem(ItemBase _item);/ 添加物品到指定位置public void AddItem(ItemBase _item,int _index);/ 整理背包public void SortOutInventory();第二步:实现了背包的基本操作功能,下面就开始对背包数据进行读取,将这些背包里的数据展现在背包界面中供玩家查看。在角色信息 UserInfo 里将 InventoryList

30、列表里的背包物品信息一一读取,然后分配给每个物品格子进行显示和操作。图 4.3(1) 背包系统界面图 4.3(2) 背包物品查看4.4 装备系统装备系统是基于物品系统下的一种,但是它更特殊一些,它能够给玩家提供一定量的属性使得玩家变得更强,并且装备可能还可能有强化等一系列的附加功能。装备系统功能需求:1、 属性变更2、 穿上装备3、 卸下装备/ 穿上装备public void FitOnEquip(ItemEquip _equip);/ 卸下装备public void PutOffEquip(InventoryEquip _equip);/ 穿上装备对角色的属性变更public void Fi

31、tOnToRole(RoleInfo _role);/ 卸下装备对角色属性的变更public void PutOffFromRole(RoleInfo _role);图 4.4 装备系统界面4.5 战斗系统战斗系统是本游戏最核心的系统,游戏是一种体验过程,在这个体验过程中,战斗通常是游戏中最强的交互要素,它对玩家的感觉刺激也是最大的。因此战斗系统的设计通常是 MMORPG 中的重中之重,且在设计过程中处于核心地位,其他绝大部分的游戏子系统都将服务于战斗系统,或者衍生于战斗系统。本游戏的战斗系统主要分为:角色控制、角色状态机、怪物状态机以及怪物 AI 四大功能模块,再配合上角色和怪物的属性,一个

32、简单的战斗系统就形成了。4.5.1 角色控制角色的控制分为两种:鼠标点击和摇杆操作,通过以上操作可以控制角色在游戏中任意移动攻击敌人等。鼠标点击移动:首先需要先将游戏场景中的地面进行分层,将地面设为 Ground 层,然后通过 UnityAPI 函数 ScreenPointToRay 向鼠标点击屏幕的地方发射一条只射向 Ground 层的射线,射向只会射在游戏中的地面上,射线映射到 3D 世界中的点坐标即为玩家点击需要移动的点。然后调用作者事先编写的移动函数 MoveTo(Vector3 position)移动到该点即可实现角色移动。键盘移动:键盘移动相对鼠标移动较为麻烦先,我们需要先获取角色

33、跟随相机的正前方方向,然后再通过 / 水平方向float horizontal = Input.GetAxisRaw(“Horizontal“);/ 垂直方向float vertical = Input.GetAxisRaw(“Vertical“);这两个函数取得当前键盘按下的方向,根据键盘按下的移动方向再与角色相机正前方向量相乘则可得到角色移动到的方向。/ 移动方向 = 水平偏移值 * 相机向右向量 + 垂直偏移值 * 相机前方向量(horizontal和vertical为-11之间的数)moveDirection = horizontal * cameraRight + vertical

34、* cameraForward;4.5.2 角色状态机角色状态机将管理角色整套操作和动画之间的切换,能有效的管理状态转换之间的逻辑。第一步:需要根据需求编写角色的状态类型/ 角色状态public enum PlayerStateIdle, / 待机BattleIdle, / 战斗待机Move, / 移动Attack, / 攻击Magic, / 法术攻击Die / 死亡第二步:我们需要根据角色状态利用 Unity 自带的 AnimatorControllter 动画控制器来规划角色的动作流程。图 4.5.2 角色动画状态机第三步:编写 FSM 有限状态机对角色进行状态管理/ 通过一个Switch

35、 case语句来管理角色状态的转换switch (playState)case PlayerState.Idle:PlayerIdle();break;case PlayerState.Move:PlayerMove();break;case PlayerState.Attack:PlayerAttack();break;case PlayerState.Magic:PlayerMagic();break;case PlayerState.Die:PlayerDie();break;4.5.3 怪物状态机及怪物 AI这里由于本作游戏怪物 AI 较为简单,所以便直接将怪物 AI 逻辑直接写在状态

36、机中,其实状态机与怪物 AI 本来就互相有着依赖关系,AI 将操纵状态机才可以实现不同的怪物 AI 逻辑,就好比人脑控制人体四肢在运动一样。1、怪物的状态/ 怪物状态public enum EnemyStateRespawn,/ 重生Idle, / 待命Attack, / 攻击RunAway,/ 逃跑Die, / 死亡Homing, / 归位BeAttck / 被击2、怪物动画状态机图 4.5.3 怪物动画状态机3、本作怪物 AI 主要分为:攻击、追逐、死亡、重生、回到起始点怪物 AI 流程:首先怪物将执行等待状态,直接角色进入怪物的视野范围时,怪物将朝着角色的位置进行视线追逐,直接玩家离开了

37、怪物的视野范围时怪物将回到起始点,若角色达到了怪物的攻击范围之内时怪物将对角色进行攻击,角色若将怪物杀死,怪物将会在指定重生时间复活。这整个 AI 流程实现了玩家与敌人的简单战斗交互,再配合上角色和怪物的数值属性,整个战斗系统就这样诞生了。/ 怪物等待EnemyIdle();/ 怪物攻击EnemyAttack();/ 怪物死亡EnemyDie();/ 怪物归位EnemyHoming();/ 怪物追逐EnemyRunTo();/ 怪物受击EnemyBeAttack();4.7 商店系统商店系统可以购买一些玩家必备的装备和补给品,首先我们需要为商店配置表格,游戏中所有的物品都由金币购买,所以该商店

38、也称为金币商店,可以点击城镇里的部分 NPC 打开商店界面进行购买。功能需求:1、 配置商店物品信息2、 显示商店界面并载入商店物品信息3、 购买物品4、 切换商店物品类型第一步:需要先配置商店的 Csv 表格,由于我们已经配置好了物品信息表,所以只需要根据物品表里的 tid 号来配置物品即可。第二步:创建 StoreManager 和 StoreUI 脚本,前者用来管理商店的逻辑管理,后者用来驱动 UI界面实现各种操作功能的需求。/ 加载商店数据public void LoadPanelData();/ 显示商品信息public void ShowGoodsInfo(ItemBase _it

39、em);/ 购买商品public void BuyGoods(ItemBase _item);/ 切换物品类型分组public void OnGroupClick();图 4.7 商店系统界面4.8 NPC 系统NPC 是指“非玩家控制角色” ,这些 NPC 一般分为剧情 NPC 和功能性 NPC,剧情 NPC 用于子跟玩家进行一些人机交互,增加玩家在游戏世界中的真实感,还有一些功能性 NPC 可供玩家买卖物品,任务等功能。本项目里的 NPC 较为简单,主要提供一些剧情对话和商店功能,NPC 分布在主城各个位置中,需求开发者自行摆放。功能需求:1、 配置 NPC 剧情对话2、 点击 NPC 进

40、行交互3、 NPC 头顶名字第一步:NPC 的剧情对话由于是可换行或者带特殊符号,所以不配置 CSV 表格里,将它配置成txt 文本,使得解析效率更高,还可以方便支持换行等特殊操作。第二步:通过鼠标点击事件 OnNpcClick()对 NPC 进行点击操作,然后按事先配置的 NPC 功能触发指定事件,NPC 事件分为对话事件和商店事件。第三步:NPC 头顶名字,通过 WorldToScreenPoint 函数将 NPC 的世界坐标点转换成 2D 屏幕上的坐标点,然后每次调用,将 2D 的名字标签绑定在 NPC 头上,让标签跟随着 NPC,实现 NPC 头顶名字。/ 加载NPC数据public

41、void LoadNpcData();/ 点击NPC事件public void OnClickNpc();/ 设置NPC名字跟随public void SetNameFollow();图 4.8 NPC 剧情对话5 发布调试完成游戏内容后,我们需要打包进行测试,Unity3D 是一款强大的跨平台引擎,所以可以打出多平台的安装包,并且其兼容率非常高,打包过程非常简单,下面我们就打 Windows 和 Android 平台进行测试。1、 Windows 平台打包测试:首先,我们需要打开 BuildSetting 先设置 Windows 平台发布相关设置,图 5.1(1) Windows 平台发布设

42、置图这里我们需要选好需要打包的场景,然后设置相关属性以及选择 X86_64 位的包。最后,点击 Build 选择保存路径即可完成 Windows 平台的打包流程,下面让我们来看看最终效果图吧。图 5.1(2) Windows 平台调试2、 Android 平台打包测试:Android 平台打包相比 Windows 平台稍微复杂些,首先需要安装 Java 并在 Windows 上配置Java 环境,然后还需要下载 AndroidSDK,在 Unity 中选择指定 AndroidSDK 路径,接着在BuildSetting 中设置 Android 平台发布相关设置,最后插上 Android 手机直

43、接 Build 即可在Android 系统的手机上进行真机调试了。看看在手机上的运气效果是不是也非常棒呢!6 工作总结与未来展望6.1 工作总结6.1.1 游戏开发问题(1)遇到技术难点该如何解决作为技术行业,遇到技术难题是在所难免的事,但如何有效的解决这些技术难题尤为重要。以下为笔者个人观点:1、 尽可能的使用最简单的方式解决问题,采用复杂的方法或许会使得代码越加累赘不堪,非常容易出 Bug。2、 通过博客论坛、询问前辈等方式寻得解决答案,前辈们经验丰富,通过询问他们能够更快的获得解决问题的办法,加快项目进度。3、 如果短时间内并无法解决问题,建议先更改方案,采用简单的方法,预留接口待后期再

44、继续修改。(2)先思考后编码在项目开发中,我们需要根据策划制定的规则去完成指定的功能,因此在决定开始编码之前一定要理清思路,否则如果遇到功能逻辑较为复杂的系统可能由于一开始逻辑框架等问题,导致后续开发异常困难。这一点笔者亲身经历过数次,每次都是想到拿写到哪,毫无框架可言,导致后续无法正常的完成该功能。(3)游戏程序框架很重要在游戏项目开发之前,应对游戏类型及最终完成内容进行规划思考,总结所有系统功能,然后依此制定良好的游戏框架。特别是在项目开发前期,不应该为了节约时间而省去了大多数的框架代码,应保证游戏在没有功能内容的情况下该程序也是可以正常运行的。适当的制作各类工具,以及工具代码,可以更便于

45、我们开发使用。6.1.2 良好的编码习惯在游戏编码中,我们应该拥有良好的编码习惯,应按照项目预先规定的方案进行编码,整洁清晰的代码将在团队开发中起到重要作用。它会让你更容易的维护自己的代码,从中发现错误进行修改,而且规范的代码会使得其他人更容易理解,促进项目进度。笔者以前参与项目开发时,总是忽视了这点,导致游戏后期维护极难,所以在本项目中吸取了以往的教训,在项目开发前对整个代码命名规则,注释等等都做了详细的规则,使得代码看起来相当清晰易维护。6.2 未来展望随着游戏玩家数量不断上升,市面上的游戏也越来越多了,但游戏的品质却参差不齐。作为一名游戏爱好者,开发一款受人欢迎的游戏是我最大的目标,但距

46、离实现这个目前笔者仅仅迈出了第一步,未来还将继续对游戏程序开发进行更深入的研究,要相信当技术水平达到一定境界时也就离这个目标越来越近了。参考文献:1 金玺曾. Unity 3D 手机游戏开发M. 北京:清华大学出版社,2013:318-3472 (美)David M.Bourg private ulong m_ulongData = null;private string m_strData = null;protected int intDataget return m_intData; set m_intData = value; protected ulong ulongDataget

47、return m_ulongData; set m_ulongData = value; protected string strDataget return m_strData; set m_strData = value; public virtual void Serialize(IWriteBuffer w)for (int i = 0; i 0.3f)runTo(mHomePosition);/获取和玩家之间的距离distance = Vector3.Distance(transform.position, mTargetTransform.position);if (distanc

48、e = SightRange)/若在警觉范围内就主动攻击enemyState = EnemyState.Attack;elseenemyState = EnemyState.Idle;void runTo(Vector3 iPosition)/获取注视方向var lookRotation = Quaternion.LookRotation(iPosition - transform.position);/注视玩家transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, RotateSpeed * Time.deltaTime);/移动mController.SimpleMove(lookRotation * Vector3.forward * MoveSpeed);mAnimator.SetInteger(“ActionID“, 1);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 学术论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报