




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于Unity3D的角色扮演类游戏设计专业:数字媒体技术【摘要】游戏开发行业,随着移动领域的崛起,近年来变得越加火热,各游戏开发公司纷纷投入移动游戏的研究开发,其中Unity3D和Cocos2D两款引擎受到了各公司的青睐,游戏开发人员供不应求。本文将介绍如何用Unity3D引擎开发一款角色扮演类游戏的全过程,其中包含了Unity3D引擎使用的介绍、游戏策划及游戏各大功能模块的实现。在游戏策划中将规划整个游戏项目的背景故事,游戏场景,游戏系统等,为后面实现游戏功能代码打好基石。在游戏程序开发中,将使用Unity3D提供的编辑器结合C#先实现游戏流程整个程序框架,然后按照框架流程完成游戏各个模块的功能,最后将游戏进行Windows和Android双平台打包调试。1 前言1.1 项目背景与设计理念随便国家的富强,科技的发展,越来越多的人们需要在工作闲时进行娱乐休闲,游戏产业也随之诞生。在21世纪的互联网高速发展之期,游戏行业不断壮大,从最早的红白机时代,再到主机时代,随后PC计算机的崛起让游戏行业大放光彩,直到近年来移动领域的热潮又将手机游戏推向了顶峰。在这样的背景下,也越来越多的公司投入的游戏研发中,不过由于每次开发一款游戏都得重头开始编码,效率低,成本高,所以游戏设计者想如何去复用之前的东西从而进行快速发开。慢慢的,游戏引擎(GameEngine) 问世了,它集成了图形引擎、物理引擎、碰撞检测系统、音效、脚本引擎、电脑动画、人工智能、网络引擎以及场景管理等,为游戏设计者提供各种编写游戏所需的各种工具,大大提高了游戏设计者开发游戏的时间和成本。1.2 游戏设计方法与实现技术角色扮演类游戏(Role-Playing Game),提供虚拟的计算机游戏世界,该游戏世界提供虚拟的游戏角色供玩家选择并操作,最终使得玩家在该世界实现自己的第二人生为目标。RPG框架的设计和研究自RPG诞生以来不断进步,至今发展到由引擎技术制作的时代。RPG游戏设计较为复杂,系统主要以战斗、剧情、任务,交互、装备等系统为主,其中战斗系统为RPG游戏设计的核心部分。战斗系统主要包含:1、 属性系统:这是游戏中最简单的系统,包括了主角、物品、NPC、技能、怪物等各自的属性值,通过属性值可计算出战斗中各种逻辑交互数值。2、 状态机系统:该系统标志着一个人物或者怪物现处于什么状态,相对于动作而言,人物是站立中?还是跑动中?还是与敌人打斗中?当然有些状态还是可以同时拥有的,这些状态需要在程序中利用不同的变量值来区分。所以战斗规则越多,状态机逻辑也就越复杂,所以在开发过程中需要预先制定好一套方案,否则在后续开发中将越加难以维护。3、 行为系统:该系统决定了游戏的表演方式,每一个动作或者声音的表现都由行为系统来管理。4、 人工智能(AI):该系统主要为了人机交互而生,在战斗过程中,敌人将以怎样的表现和玩家对战,越是强大的敌人,其AI设计过程也就越复杂,需要通过不一样的算法结合起来推导出一套怪物的AI指令。1.3 本项目的设计思路与实现技术本项目将设计一款角色扮演类游戏,游戏将采用Unity引擎进行制作,游戏中将实现游戏登录、交互、战斗、保存等几大功能,各功能间还包含了许多与之相依赖的小功能。项目利用.net下mono的跨平台编译技术,使用C#在windows环境下进行跨平台开发,再结合Unity引擎提供了强大的API函数库和渲染引擎技术来实现整个RPG游戏的技术实现。1.4 本项目的主要工作任务本项目的的主要设计工作包括:(1) 设计一款基于移动平台的RPG游戏(2) 策划RPG游戏各模块玩法及系统功能(3) 利用Unity3D引擎完整的实现游戏所有功能(4) 对最终实现游戏进行打包调试本项目通过对Unity3D引擎的一年的学习,实验了许多的小项目,最后总结了如何利用它来快速开发一款RPG游戏,从前期的游戏策划,游戏功能布局,再到游戏的程序框架、功能开发,到最后的打包调式,本文都将通过该实例一一描述。2 项目介绍2.1游戏引擎介绍Unity3D是一款由Unity Technologies开发的跨平台游戏引擎,该引擎集成了强大的可视化用户编辑器,采用了组件式开发,使开发者能快速的开发出自己的游戏。该引擎由于可进行跨平台发开,在移动领域崛起时,受到了很多开发者的青睐,现已越来越多的开发者投入其中,已成为目前世界上使用最广泛的游戏引擎。在图形方面,Untiy3D采用了主流的实时光照,Lightmapping,全局光照GI等技术,使游戏界面更加逼真。在程序方面,该引擎支持用C#和原生的UntiyScript进行开发,大大加快了用户开发进度,而且还提供了AssetStore商店,让开发者能在里面找到想要的插件,能快速实现想要的功能及效果。2.2 游戏介绍本文将以中国古代唐朝做为历史背景,利用Unity3D开发一款基于移动端的ARPG手游。游戏类型:ARPG游戏平台:Win、Android游戏风格:中国古代游戏玩法:玩家通过副本战斗消灭敌人获得奖励,还可以通过商店购买等不断强大自己。2.3 游戏故事背景在开发游戏前,制定一个好的背景题材将决定了游戏后期的发展。如何定一个好的故事背景,需要针对玩家的喜好而决定,好的题材将更喜欢玩家的关注,所以好的故事题材将为游戏奠定基石。本文中,制定了近期较为火热的中国古代唐朝题材为背景故事,打造一款即时战斗的ARPG游戏,让玩家在游戏中体验打斗的快感和古典韵味。2.4 游戏场景游戏场景作为游戏主要的交互区,它承载了玩家在游戏中的大部分交互,其对游戏的重要性不言而喻。游戏场景可分为2D和3D,2D场景都是由一张张图片拼成,效果相比3D稍差一些,3D给人感觉更真实,仿佛身临其境的感觉。游戏场景还分为很多种风格,有古风,韩风,欧美风,日漫风,水墨风格等等,该如何去选择这就需要根据题材来决定了。本文中由于题材定位中国古代,所以场景也为中国古代风格的场景, 其风格华丽,浑厚庄重,线条平直硬拐,装饰丰富,令人感觉心旷神怡。 图2.4 (1)华丽的长安城图2.4 (2)华丽的长安城2.5 游戏角色一款好玩的游戏、受欢迎的游戏,其中必定有几位受人欢迎的角色,每个角色有着自己独特的性格和能力,更加能被玩家们记住。那么要创作一些好的角色也不容易,其中有一点很重要,那就是每个角色都要有自己存在的价值,形成鲜明的对比,要与其他角色与众不同,因为玩家们总是会喜欢独特的那位。本文中的游戏主角为一位初出茅庐的道士,道士途中遇到了各种磨难,消灭敌人,一步步的成长起来。道士的武功主要以剑术为主,因为性格较为外向,相信颇受玩家喜爱。本作中还有另外两位角色,后续还可以继续为游戏添加新角色,从而丰富游戏哦。图2.5 帅气的道士2.6 游戏系统本文中的游戏功能系统主要为分以下几类u 游戏登录u 创建角色u 背包系统u 装备系统u 战斗系统u 副本系统u 商店系统u NPC系统u 数值系统以上几类为本游戏大致的游戏功能,这些功能在RPG类型的游戏中必备的几项,通过这些功能系统,能够展示出一款RPG游戏的核心玩法。其中数值系统最为重要,一款好的RPG游戏不仅要满足玩家对画面以及功能上的需求,还要满足玩家的虚荣心。一款RPG游戏是不是好玩,和数值的相关性不是特别大,但是游戏是不是不好玩以及能玩的多深入,和数值的关系就很大了。数值做的不好,在表现层面上是让游戏流程的体验不好,比较容易出现的两个极端是过度的挫折感(练功十年,出门就被小兵秒)和茫然所失的成就感(玩家还没发力,Boss就扑街了?)!所以说,如何巧妙的运用这些数值来构建起整个游戏的可玩性是至关重要的,得学会如何去根据玩家的需求来构建不一样的数值系统。3 游戏程序框架设计3.1 游戏核心本游戏将采用组件式的模式进行开发,不同组件维护着自己相关的功能,不与其他组件进行直接交互,降低层与层之间的耦合(俗称:解耦),便于后期维护。本作还将根据MVC模式,即数据模型(游戏数据)、视图(UI)和控制器(管理器)来编写整套逻辑程序。MVC模式所带来的优点:1、开发人员可以只关注整个结构中的其中某一层;2、可以很容易的用新的实现来替换原有层次的实现;3、可以降低层与层之间的依赖;4、有利于标准化;5、利于各层逻辑的复用。数据:管理游戏程序中各种数值数据。视图:Unity中的控件都必须继承于Monobehaviour。管理器:对数据和UI进行操作和管理。本文中的管理器都将继承于Graduation.Component,这个类是本作者自己写的一个组件管理,利用组件容器将每个管理器加入容器中,便于对各模块的管理器进行管理和交互。游戏核心架构:游戏核心(GameCore)(单例)游戏管理器(GameManager):场景管理器(SceneManager)数据管理器(DataManager)资源管理器(ResourceManager)UI管理器(UIManager)游戏组件(Component):音效管理器(SoundManager)网络管理器(NetManager)配置管理器(ConfigManager)逻辑管理器(LogicManager)动画管理器(AnimationManager)游戏启动流程:/ 启动游戏./ 1.加载配置表InitConfig();/ 2.加载组件InitComponent();/ 3.加载游戏资源InitResource();/ 4.初始化网络模块InitNetwork();/ 5.进入游戏EnterGame();图3.1 游戏核心框架流程图为了游戏开发中的方便使用,作者在开发前已经封装好了一整套常用工具库,工具库大致包含:文件读写工具类,数值计算工具类,UI工具类,序列化工具类等。有了这些工具库,在开发中可以更快速编码,省去了频繁写一些常用逻辑的时间。3.2 游戏UI框架在Unity3D早起的版本里,UI系统在引擎中是较为薄弱的,只能通过Unity提供的一些API来实现UI的搭建,但这种方式效率实在太差,改起来也非常麻烦。由于Untiy越加的火热,Unity 的Asset Store 商店的插件也越来越多,其中Next-GUI插件(下文简称:NGUI)最受开发者欢迎,因为其弥补了Unity本身的弱点,把UI系统变得非常的强大,甚至用完美来形容。使用NGUI插件可以让用户通过可视化界面的方式,只要在界面上拖入各种控件、脚本,再结合自己的一些逻辑代码即可完成游戏所需的界面。在Unity4.6版本中,Unity开发组认识到了UI系统的薄弱,随即也在该版本发布了新版UI系统(简称;UGUI)。它仅吸取了NGUI的各种优点,由于UGUI属于原生系统,所以性能上会比NGUI好很多,渐渐的也被开发者所接纳。在本游戏中,将采用Unity最新的UGUI系统来完成整套游戏UI界面的开发,并讲述如何来搭建游戏的UI框架,一套好的UI框架将使后期开发起来更加便捷。图3.2 游戏UI框架流程图UIBase:该类为所有UI脚本都继承的基类,该类重载了大多数MonoBehaviour函数,方便在后期资源管理以及界面动画等进行统一管理。UIManager:该类将统一管理所有UI界面的显示、隐藏、动画、音效,所以需要显示的UI界面都需要通过该类进行注册才能使用,该类还提供各种通用UI界面,例如消息框,提示框,输入框,确认选择框等等。UIUtils:该类为静态类,是UI工具库,将提供大量功能型函数供UI界面使用,例如一些UI对齐,UI的各种位置算法等。有了以上三大类,在后续的界面设计中就能轻松的利用他们实现一套完整的UI框架,实现每一个功能界面的需求。3.3 Lightmapping光照烘焙光照烘焙,该技术是指通过计算机计算模拟得到的灯光效果,省去了采用实时灯光所带来的高消耗。简单来说就是实时灯光计算十分耗时,随着光源越多会倍增计算耗时。使用Lightmap模拟灯光带来的效果,便不用去计算灯光,会带来性能上的大大提升。当然你不用灯光效果也是没问题的,具体还是看项目需求。最简单的直接在3dmas或maya里面烘培完贴图顶点色也行。对于移动手机游戏来说,由于硬件的原因,如果在3D游戏中大量的采用实时光照手机的性能是吃不消的,但如果不用实时光照效果又非常差。所以本文的游戏中将采用Untiy Pro版本自带的Lightmap技术,大大减轻了游戏本身对手机性能带来的开销,而且使用Lightmap的画面效果又非常不错。首先,先在场景内,在合适的位置打好大量的点光源(Point Light),方向、位置、亮度这些都需要经过细心的调整。图3.3 (1)Lightmapping的使用其次,打开Lightmapping面板调节具体的参数。图3.3 (2)Lightmapping的使用由于手游中并不需要太高的画质,所以这里作者调节的光照品质较为一般。最后,点击Bake Scene即可开始场景的烘焙,烘焙需要等待一段时间。看看烘焙后的效果是不是感觉好震撼?效果丝毫不逊于实时光照。图3.3 (3)Lightmapping的使用3.4 序列化与反序化3.4.1 序列化介绍序列化 (Serialization):将数据结构或对象转换成二进制串的过程反序列化(Deserialize):将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程这两个过程在游戏开发中被广泛的使用,因为其可以让游戏在跨平台上方便的进行通讯传递,把一个完整的对象通过网络发送到终端。序列化还能将一个对象永久的保存在硬盘上,可以用于存储玩家的游戏数据。本文中将采用序列化方式来进行玩家数据存储,并在序列化过程中加入了加密解密技术,使得游戏数据不会轻易的被玩家所破坏。现在主流的序列化方式大致分为二进制序列化:二进制序列化的优点是可以精确地控制序列化及反序列化的过程,并可以序列化对象的非公共成员。其序列化过程的速度非常之快,而且序列化后的体积小,非常适合用来传输实时性较高的应用。但因为缺乏标准的协议,装拆箱比较麻烦。Json序列化:JSON起源于弱类型语言Javascript,与xml相比,这种序列化简直是太简单了,其只需要通过将变量用一个key对应一个value即可完成序列化,而且序列化速度比较快,仅次于Binary方式。Xml序列化:Xml序列化历史较为悠久了,其缺点太明显了,冗余太大,但拥有的非常高的安全性与可扩展性,所以至今仍被广泛的使用着。序列化方案的选择:每种序列化协议都有优点和缺点,它们在设计之初有自己独特的应用场景。在系统设计的过程中,需要考虑序列化需求的方方面面,综合对比各种序列化协议的特性,最终给出一个折衷的方案。3.5.2 序列化应用本文中的游戏为了更节省空间和解析效率,采用二进制序列化方式,并对二进制序列化方案进行了二次封装,可更方便的在游戏中使用。本文中所有需要序列化的对象都将继承与SerializeData类,在该类利用.net自带的ISerializable接口通过BinaryFormatter对所有需要序列化的变量进行序列化并存储。附:序列化与反序列化代码(见附录)3.5表格配置数据读取在游戏开发中,数值模型起到了很大的作用,它将很大程度上决定了游戏的可玩性。那么如何在游戏开发中方便的配置数值使游戏更具可玩性呢?由于Unity自身有着强大的编辑器,开发者可以直接在编辑器上修改变量的数值从而修改数据模型。但这样的作法看起来很方便,其实还是有很多弊端的。首先策划并不见得能很好的使用Unity进行数值编辑,其次这种方式需要程序事先把所有变量都布局好供策划调整,而且中间经常会因为一些特殊的需求而出问题。所以如果在团队开发中,配置表格让策划自己填写无非是最好的方式了,策划只需要关心表中的字段和数值,然后根据游戏实际运行情况调整就行了。本文将介绍如何用csv表格(逗号分隔表)进行数值的读取,然后将它配置到游戏中去。(一)、用Excel制作csv表格图3.5(1)制作csv表格为了方便程序中开发使用,本作者自己制定了一套读取方案。打开Excel表格,填入数值字段及数值。数据行介绍:第一行:对应程序代码中的表类型第二行:数据字段,字段名对应程序中的表类型成员变量,后缀:s 结尾代表字符串,:a 结尾代表整型数组,如果没有带后缀的则默认为整型数值。第三行:以 # 号开头的行代表这正行的数据作为解释行,不进行数据读取。第四行至结尾:这些行每行的数据都代表着一行数据记录,读取后写入内存中方便调用。(二)、保存csv配置表选择另存为,选择CSV(逗号分隔)类型的文件,修改文件名为item.csv,然后保存至文档中。图3.5(2)保存csv表格(三)、解析csv配置表解析前需要先为该表定义指定数据类及成员变量。图3.5(3)解析csv配置表如图3.5(3),建立了两个类型,一个是CsvBase,该类为所有Csv类型的基类,因为每个表的第一个字段必须是tid。第二个是CsvItem类,也就是我们上文的Csv表对应的类型,注意这里的变量名必须与表里填写的字段相同。由于这些字段是不可变的,所以为了防止开发中意外将数值覆盖,所以这里变量加了readonly修饰符,表示只读。但是如果设为只读,那在解析表数据的时候要怎么赋值呢?这里又要提到另外一项技术“反射”,利用反射可以给字符串对应的变量进行赋值,并且在反射中是不受readonly所限制的,这样就能快速的将字段与变量配对,不需要一个一个去判断那么繁琐了。解析csv表关键点主要是对字符串进行操作,先用File.ReadAllText()将item.csv读取进来,然后利用string.split对读取后的字符串进行拆分,先对行进行分割,把数据分割为n行,然后对行进行解析,分析出每一行的作用,将其进行相应的赋值操作。接着对数据行进行逗号拆分,分为每一个数据项,然后利用反射赋值给对应的类型变量中。最后新建一个Dictionary将这些数据存起来供程序中使用。附:Csv配置表解析代码(见附录)4 游戏功能模块实现4.2 创建角色本游戏初始将提供玩家自由创建想要的角色,玩家根据需求创建角色,每个角色都有不一样的职业。编写CreateRoleManager类,该类用于管理玩家创建角色,完成确认选择后将选定的角色数据记录到UserInfo类用户数据中并进行存盘,下次玩家再次登录将可继续使用该角色。功能需求: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 背包系统背包系统将用于存放玩家中打怪掉落的物品,实现该系统我们首先需要为创建一个背包管理器(InventoryManager),利用该管理器根据用户的背包数据来操作UI控件来实现整个背包系统的逻辑操作以及数据控制。第一步:首先我们需要先分析背包系统在逻辑功能上有几种基础操作功能1、 查看物品详细信息2、 交换背包物品位置,3、 添加物品4、 删除物品5、 整理背包了解了功能需求,就可以开始功能的实现了,在InventoryManager类下新建几个功能函数,利用这些函数对界面UI进行操作,实现背包系统的基本功能。/ 查看物品public void LookItemInfo(ItemBase _item);/ 交互物品public void ChangeItem(InventoryItem _item1, InventoryItem _item2);/ 添加物品public void AddItem(ItemBase _item);/ 添加物品到指定位置public void AddItem(ItemBase _item,int _index);/ 整理背包public void SortOutInventory();第二步:实现了背包的基本操作功能,下面就开始对背包数据进行读取,将这些背包里的数据展现在背包界面中供玩家查看。在角色信息UserInfo里将InventoryList列表里的背包物品信息一一读取,然后分配给每个物品格子进行显示和操作。图4.3(1) 背包系统界面图4.3(2) 背包物品查看4.4装备系统装备系统是基于物品系统下的一种,但是它更特殊一些,它能够给玩家提供一定量的属性使得玩家变得更强,并且装备可能还可能有强化等一系列的附加功能。装备系统功能需求:1、 属性变更2、 穿上装备3、 卸下装备/ 穿上装备public void FitOnEquip(ItemEquip _equip);/ 卸下装备public void PutOffEquip(InventoryEquip _equip);/ 穿上装备对角色的属性变更public void FitOnToRole(RoleInfo _role);/ 卸下装备对角色属性的变更public void PutOffFromRole(RoleInfo _role);图4.4 装备系统界面4.5战斗系统战斗系统是本游戏最核心的系统,游戏是一种体验过程,在这个体验过程中,战斗通常是游戏中最强的交互要素,它对玩家的感觉刺激也是最大的。因此战斗系统的设计通常是MMORPG中的重中之重,且在设计过程中处于核心地位,其他绝大部分的游戏子系统都将服务于战斗系统,或者衍生于战斗系统。本游戏的战斗系统主要分为:角色控制、角色状态机、怪物状态机以及怪物AI四大功能模块,再配合上角色和怪物的属性,一个简单的战斗系统就形成了。4.5.1 角色控制角色的控制分为两种:鼠标点击和摇杆操作,通过以上操作可以控制角色在游戏中任意移动攻击敌人等。鼠标点击移动:首先需要先将游戏场景中的地面进行分层,将地面设为Ground层,然后通过UnityAPI函数ScreenPointToRay向鼠标点击屏幕的地方发射一条只射向Ground层的射线,射向只会射在游戏中的地面上,射线映射到3D世界中的点坐标即为玩家点击需要移动的点。然后调用作者事先编写的移动函数MoveTo(Vector3 position)移动到该点即可实现角色移动。键盘移动:键盘移动相对鼠标移动较为麻烦先,我们需要先获取角色跟随相机的正前方方向,然后再通过 / 水平方向float horizontal = Input.GetAxisRaw(Horizontal);/ 垂直方向float vertical = Input.GetAxisRaw(Vertical);这两个函数取得当前键盘按下的方向,根据键盘按下的移动方向再与角色相机正前方向量相乘则可得到角色移动到的方向。/ 移动方向 = 水平偏移值 * 相机向右向量 + 垂直偏移值 * 相机前方向量(horizontal和vertical为-11之间的数)moveDirection = horizontal * cameraRight + vertical * cameraForward;4.5.2 角色状态机角色状态机将管理角色整套操作和动画之间的切换,能有效的管理状态转换之间的逻辑。第一步:需要根据需求编写角色的状态类型/ 角色状态public enum PlayerState Idle, / 待机 BattleIdle, / 战斗待机 Move, / 移动 Attack, / 攻击 Magic, / 法术攻击 Die / 死亡第二步:我们需要根据角色状态利用Unity自带的AnimatorControllter动画控制器来规划角色的动作流程。图4.5.2角色动画状态机第三步:编写FSM有限状态机对角色进行状态管理/ 通过一个Switch 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逻辑直接写在状态机中,其实状态机与怪物AI本来就互相有着依赖关系,AI将操纵状态机才可以实现不同的怪物AI逻辑,就好比人脑控制人体四肢在运动一样。1、怪物的状态/ 怪物状态public enum EnemyState Respawn,/ 重生 Idle, / 待命 Attack, / 攻击 RunAway,/ 逃跑 Die, / 死亡 Homing, / 归位 BeAttck / 被击2、怪物动画状态机图4.5.3 怪物动画状态机3、本作怪物AI主要分为:攻击、追逐、死亡、重生、回到起始点怪物AI流程:首先怪物将执行等待状态,直接角色进入怪物的视野范围时,怪物将朝着角色的位置进行视线追逐,直接玩家离开了怪物的视野范围时怪物将回到起始点,若角色达到了怪物的攻击范围之内时怪物将对角色进行攻击,角色若将怪物杀死,怪物将会在指定重生时间复活。这整个AI流程实现了玩家与敌人的简单战斗交互,再配合上角色和怪物的数值属性,整个战斗系统就这样诞生了。/ 怪物等待EnemyIdle();/ 怪物攻击EnemyAttack();/ 怪物死亡EnemyDie();/ 怪物归位EnemyHoming();/ 怪物追逐EnemyRunTo();/ 怪物受击EnemyBeAttack();4.7商店系统商店系统可以购买一些玩家必备的装备和补给品,首先我们需要为商店配置表格,游戏中所有的物品都由金币购买,所以该商店也称为金币商店,可以点击城镇里的部分NPC打开商店界面进行购买。功能需求:1、 配置商店物品信息2、 显示商店界面并载入商店物品信息3、 购买物品4、 切换商店物品类型第一步:需要先配置商店的Csv表格,由于我们已经配置好了物品信息表,所以只需要根据物品表里的tid号来配置物品即可。第二步:创建StoreManager和StoreUI脚本,前者用来管理商店的逻辑管理,后者用来驱动UI界面实现各种操作功能的需求。/ 加载商店数据public void LoadPanelData();/ 显示商品信息public void ShowGoodsInfo(ItemBase _item);/ 购买商品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进行交互3、 NPC头顶名字第一步:NPC的剧情对话由于是可换行或者带特殊符号,所以不配置CSV表格里,将它配置成txt文本,使得解析效率更高,还可以方便支持换行等特殊操作。第二步:通过鼠标点击事件OnNpcClick()对NPC进行点击操作,然后按事先配置的NPC功能触发指定事件,NPC事件分为对话事件和商店事件。第三步:NPC头顶名字,通过WorldToScreenPoint函数将NPC的世界坐标点转换成2D屏幕上的坐标点,然后每次调用,将2D的名字标签绑定在NPC头上,让标签跟随着NPC,实现NPC头顶名字。/ 加载NPC数据public 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平台发布设置图这里我们需要选好需要打包的场景,然后设置相关属性以及选择X86_64位的包。最后,点击Build选择保存路径即可完成Windows平台的打包流程,下面让我们来看看最终效果图吧。图5.1(2) Windows平台调试2、 Android平台打包测试:Android平台打包相比Windows平台稍微复杂些,首先需要安装Java并在Windows上配置Java环境,然后还需要下载AndroidSDK,在Unity中选择指定AndroidSDK路径,接着在BuildSetting中设置Android平台发布相关设置,最后插上Android手机直接Build即可在Android系统的手机上进行真机调试了。看看在手机上的运气效果是不是也非常棒呢!6 工作总结与未来展望6.1 工作总结6.1.1 游戏开发问题(1)遇到技术难点该如何解决作为技术行业,遇到技术难题是在所难免的事,但如何有效的解决这些技术难题尤为重要。以下为笔者个人观点:1、 尽可能的使用最简单的方式解决问题,采用复杂的方法或许会使得代码越加累赘不堪,非常容易出Bug。2、 通过博客论坛、询问前辈等方式寻得解决答案,前辈们经验丰富,通过询问他们能够更快的获得解决问题的办法,加快项目进度。3、 如果短时间内并无法解决问题,建议先更改方案,采用简单的方法,预留接口待后期再继续修改。(2)先思考后编码在项目开发中,我们需要根据策划制定的规则去完成指定的功能,因此在决定开始编码之前一定要理清思路,否则如果遇到功能逻辑较为复杂的系统可能由于一开始逻辑框架等问题,导致后续开发异常困难。这一点笔者亲身经历过数次,每次都是想到拿写到哪,毫无框架可言,导致后续无法正常的完成该功能。(3)游戏程序框架很重要在游戏项目开发之前,应对游戏类型及最终完成内容进行规划思考,总结所有系统功能,然后依此制定良好的游戏框架。特别是在项目开发前期,不应该为了节约时间而省去了大多数的框架代码,应保证游戏在没有功能内容的情况下该程序也是可以正常运行的。适当的制作各类工具,以及工具代码,可以更便于我们开发使用。6.1.2 良好的编码习惯在游戏编码中,我们应该拥有良好的编码习惯,应按照项目预先规定的方案进行编码,整洁清晰的代码将在团队开发中起到重要作用。它会让你更容易的维护自己的代码,从中发现错误进行修改,而且规范的代码会使得其他人更容易理解,促进项目进度。笔者以前参与项目开发时,总是忽视了这点,导致游戏后期维护极难,所以在本项目中吸取了以往的教训,在项目开发前对整个代码命名规则,注释等等都做了详细的规则,使得代码看起来相当清晰易维护。6.2 未来展望随着游戏玩家数量不断上升,市面上的游戏也越来越多了,但游戏的品质却参差不齐。作为一名游戏爱好者,开发一款受人欢迎的游戏是我最大的目标,但距离实现这个目前笔者仅仅迈出了第一步,未来还将继续对游戏程序开发进行更深入的研究,要相信当技术水平达到一定境界时也就离这个目标越来越近了。参考文献:1 金玺曾. Unity 3D手机游戏开发M. 北京:清华大学出版社,2013:318-3472 (美)David M.Bourg & Glenn Seemann.游戏开发中的人工智能M. 东南大学出版社, 2006:14-963 (美)Phll Co.游戏关卡设计M. 机械工业出版社, 2006:28-344 (美)Michelle Menard. Game Development with UnityM. 机械工业出版社,2012:101-1025 (美)Fletcher Dunnlan Parberry.3d数学基础图形与游戏开发M. 北京:清华大学出版社, 2005: 133-1586 优美缔软件(上海)有限公司. Unity4.X从入门到精通M. 北京:中国铁道出版社, 2013:80-917 佚名.基于Unity3D的角色扮演游戏D 2013:14-208 gavinchengshubo博客. C#序列化(Serialize)与反序列化(Deserialize)J, /gavinchengshubo/article/details/83784419 百度百科.角色扮演游戏N ,/link?url=EETfbUlR1Iz7JV_PHDgJGaWsDVmokeiFVQ4jDNfsJcGcC9TD38pN2LPDkD5d_6YhFaUIMwSSAmXKhWz_QQmeRr9oqEDGUYOP1Q55l2RxKIpHfAvLWkKtaWh_T93EKpv2XpCsF6MpCZGMgTsUeLazfAog4-r5MrZKx4_gdnpdn-K10 wuzhang博客. Unity 读取CSV与ExcelJ,/wuzhang/p/wuzhang20150511.html?utm_source=tuicool&utm_medium=referral致谢:本论文是由王大昕老师精心指导和督促之下设计完成,从选题到设计再到论文编写,每一步老师都给予我很大的指导与支持,非常感谢老师在我大四一年的学习中对我的教诲让我受益匪浅。在实习工作中,要感谢厦门吉比特网络技术股份有限公司给与了我学习的机会,这公司这段时间里,公司的前辈们对我非常的照顾,细心的指导我工作中的点滴,使我的技术有了很大的进步,感谢他们对我的帮助。最后,感谢家人和学校对我的培养,正是有了你们的支持使我更加努力学习,为理想奋斗。附录:游戏部分核心代码:1、 序列化与反序列化 public abstract class SerializeData : ISerialize public SerializeData() private int m_intData = null; private ulong m_ulongData = null; private string m_strData = null; protected int intData get return m_intData; set m_intData = value; protected ulong ulongData get return m_ulongData; set m_ulongData = value; protected string strData get return m_strData; set m_strData = value; public virtual void Serialize(IWriteBuffer w) for (int i = 0; i intData.Length; i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑钢材期货锁价采购绿色节能合同
- 汽车广告创意设计及营销合同
- 宠物粪便处理责任保证协议(住宅小区)
- 游戏虚拟货币发行与内容版权保护协议
- 高空作业安全盘扣式脚手架租赁一体化服务合同
- 夫妻间电子设备使用规范及忠诚度保障协议书
- Web前端开发课件 项目一 HTML文档结构
- DB42-T 2005.2-2023 就业创业服务 第2部分:创业担保贷款网办服务规范
- 教师心理健康学习心得体会模版
- 2023年人教版四年级语文上册八单元测试卷及答案2
- 无锡惠山泥人课件
- 镇海中学剑桥班入学测试卷
- 人教版八年级英语下册第六单元教案
- 隐蔽工程(随工检查)验收表
- GB∕T 32218-2015 真空技术 真空系统漏率测试方法
- 消防(控制室)值班记录
- T∕CGMA 033001-2018 压缩空气站能效分级指南
- 工业管道的分类和分级
- 机器人任务规划
- 杨家湾220KV变电站工程预算表
- 易拉罐回收机设计毕业设计
评论
0/150
提交评论