多角色场景的一种幻想模拟游戏(源码)
随着电子游戏行业的发展,电子游戏行业在市场上的经济比重越来越大。本文以Unity3D游戏引擎和C#编程语言为平台,设计开发一款独立的动作角色扮演游戏。本文首先对市场上现有的优秀游戏进行了分析,从而得出一个动作角色扮演游戏应具备的核心内容。然后进行需求分析,基于面向对象思想和设计模式,设计合理的游戏框架。面对游戏中出现的多状态转换问题,本文提出并设计了适合本游戏的有限状态机,实现了玩家和敌人多角色多场景的状态转换,以及功能菜单的转换。最后,本文基于设计模式中的单例模式和观察者模式,实现了战斗系统和道具装备系统的设计。经过整合测试,达到了预定设计要求。关键字电子游戏;Unity3D;有限状态机;设计模式A Fantasy Game Simulation Based on Multi Role and SceneStudent majoring in computer science and technology Hu PengfeiTutor Shen YiAbstract:The video game industry has become more and more important in the market because of it’s development.This paper takes the Unity3D game engine and the C# programming language as the platform,designs and develops an independent Action Role Playing Game.This paper first analyses the excellent games in the market,and gets the core content of an Action Role Playing Game.Then,it’s time to de the requirement analysis,and an appropriate frame for the game is designed based on the Object Oriented and design patterns.In order to solving the problem of mult *好棒文|www.hbsrm.com +Q: ¥351916072¥
i state transitions in the game,this paper proposes and designs the appropriate finite-state machine,and realizes the transform of multi characters and scenes based on player and enemies.At last,this paper realizes the transform of the function menu.This paper also realizes the design of the battle system and equipment system based on Singleton pattern and Observer pattern.After integration and testing,it meets the expected requirements.Keywords:Video game;Unity3D;Finite-state machine;design pattern1 绪论1.1 研究背景及意义游戏这个词传承千年,它所代表的意义是非常广的,从野兽一般的嬉戏,到真人之间有规则的活动,再到现在的人机交流,都能叫游戏。但是它们的目的都是一样的,那就是为了娱乐,为了充实自己的生活。生在现在这样和平安定的年代,人们生活稳定的同时需要更多能让自己充实的东西,想要寻求更多的刺激。然而现实给予我们的限制很多,很多事情现实中是无法做到的,或是没有时间没有机会去做的,这时候游戏(这里的游戏指的是在电脑、主机或手机上运行的虚拟产品,以后提到的游戏皆为此意)的意义就体现出来了,在游戏的世界中,人们可以得到自己所得不到的东西,见证各种各样的神奇,听闻一个又一个故事,甚至更有意义深远的游戏,引发人们对生活对各种情感的深思。游戏本身对人类是有重大意义的,而人们的生活与游戏的结合也越来越紧密,游戏成为人们生活中非常重要的一环。1.2 国内外研究现状正因为看到了游戏的重要意义,以及其中的巨大利益,全球有大量的公司、工作室和个人团体参与游戏开发工作,由此诞生了各种各样的游戏,满足不同需求的人群。这些团体中,有许多全球知名的团体,他们的游戏在给人们带来快乐的同时,也使他们自己获得了巨大的财富和名声,而在全球的游戏产业中,以日本的游戏产业为最。索尼(Sony Corporation)是日本的一家全球知名的大型综合性跨国企业集团,索尼是世界电子游戏领域的先导者,是世界电子游戏业三大巨头之一,其旗下的PlayStation游戏机是现在最出名的游戏主机产品之一。CAPCOM是以制作动作游戏闻名世界的电视游戏软件公司,在业内被称为“动作天尊”,旗下有《生化危机》系列、《鬼泣》系列、《街头霸王》系列等闻名世界的游戏巨作。BANDAI NAMCO GAMES(简称BNGI)由日本著名的公司南梦宫(NAMCO)和万代(DANDAI)合并而成,是著名的RPG游戏开发公司,旗下有《黑暗之魂》系列、《传说》系列、《铁拳》系列等巨作。光荣(Koei)是日本以模拟游戏闻名的游戏软件公司,旗下有著名的《信长之野望》系列、《三国志》系列等著作,更是开创了独特的动作游戏类型《无双》系列。任天堂(Nintendo)是日本全球的娱乐厂商,电子游戏业三大巨头之一,现代电子游戏产业的开创者,旗下有大量的游戏平台产品,比如FC游戏机、WiiU、3DS等,同时旗下还有大量世界著名的巨作,如《马里奥》系列、《精灵宝可梦》系列、《塞尔达传说》系列等。欧美的游戏产业次于日本,但也有许多世界著名的游戏公司。微软(Microsoft)是美国的跨国科技公司,现在使用最广的操作系统Windows操作系统就是该公司的产品,目前是全球最大的电脑软件供应商。同时微软也涉及游戏领域,其旗下的Xbos游戏机是当代的“三大主机”之一,还有《光晕》系列、《帝国时代》系列等巨作。暴雪娱乐公司是美国著名的视频游戏制作和发行公司,是现在影响最深的游戏公司之一,旗下有著名的《魔兽》系列、《星际争霸》系列、《暗黑破坏神》系列等巨作。育碧娱乐软件公司(Ubisoft Entertainment)是一家著名的跨国公司,其总部设在法国雷恩,其旗下有著名的《雷曼》系列、《刺客信条》系列、《波斯王子》系列等巨作。其他还有一些著名的游戏公司和它们的著作,比如美国艺电公司(Electronic Arts,NASDAQ:ERTS,简称EA)以及其旗下的《命令与征服》系列、《FIFA》系列等,2K Games以及其旗下的《文明》系列、《无主之地》系列、《NBA》系列等,顽皮狗(Naughty Dog)以及其旗下的《最后的生还者》、《神秘海域》系列等。我国由于进入信息时代较晚,并且前期的产权意识薄弱等原因,在游戏产业落后于世界顶尖水平,但是随着近些年的飞速发展和产权意识的加深,越来越多的游戏公司如同雨后春笋般冒出头来,其中著名的有腾讯、网易、完美世界、盛大、蜗牛、久游等,虽然代理游戏在中国还是占主流,但也不乏一些优秀的自主研发的游戏作品,如腾讯开发的《天涯明月刀》、网易开发的《天谕》等,已经达到世界级水准。虽然电脑和主机上的游戏仍然和其他国家有差距,但是手机游戏却非常成功,随着这两年手游的强势崛起,国内各大游戏公司纷纷投身于手游市场,各种各样新奇有趣的手游由此诞生,影响越来越多的人。1.3 研究内容与技术路线1.3.1 研究内容(1)为了完整设计开发出一个独立游戏,需要知道游戏开发的全过程,从已有结果的论文中挑选出一部分,对其设计思路和整体框架进行分析。(2)工欲善其事,必先利其器,为了能成功的开发出一个游戏,并且增加其稳定性,对所使用的工具必须有一定程度的认知,通过各种渠道获取Unity3D游戏引擎的相关知识,并且分析其优缺点。(3)为了编程的合理性,体现面向对象编程思想,实现低耦合高内聚,研究设计模式的思想,一共28种设计模式,分析其中面向对象思想,以及各自的优缺点。 (4)为了实现游戏中的状态转换问题,分析现有的关于有限状态机的论文,设计实现基于有限状态机的状态转换。(5)通过已有论文分析游戏人工智能,针对该项目实现合适的怪物AI。1.3.2 技术路线图1.1 技术路线图2 开发平台简介2.1 Unity3D的简介Unity作为一个成熟的游戏引擎,具有游戏引擎应有的完备的系统。(1)图形渲染系统Unity自带的图形渲染系统和Shader能够满足绝大多数情况,同时Unity支持CG、GLSL、HLSL编程语言,自带着色器的封装ShaderLab,用户可以方便的编写Shader来实现自己想要的效果。(2)物理系统Unity自带的物理系统可以让用户方便的添加碰撞器和刚体,能很便捷的模拟出物理效果。(3)视音频系统该系统能自动将音视频转换为Unity支持的格式,同时提供大量的可调节选项,让用户便捷的调节视觉效果,以及模拟真实的声音。(4)GUI系统可视化操作的GUI系统,让用户方便的制作UI界面。(5)编辑器系统Unity支持JavaScript和C#等语言脚本,使用起来非常灵活。(6)强大的地形编辑体系Unity自带的地形编辑系统能让用户非常轻松的建立起地形,并且细节调节方便。同时,Unity能较好的支持Maya、3Ds Max等建模软件,所以被广泛的应用于三维游戏、VR等热门领域。2.2 Microsoft Visual StudioMicrosoft Visual Studio(简称VS)是美国微软公司的开发工具包系列产品,主要运行于各类Windows操作系统中。VS是一套完整的开发工具集,它囊括了整个软件生命周期所需的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。其强大的功能能够开发市面上所有的软件产品。由于多种计算机开发语言均使用相同的集成开发环境(IDE),开发人员可以快捷地创建共享工具,较为高效地实现各种混合语言解决方案。本文所设计的游戏是在Unity3D下通过C#开发的,C#是VS工具集中的一种。C#是一种面向对象的、运行于.NET Framework之上的高级程序设计语言。C#与Java有着惊人的相似,使用安全、简单,同时它又继承了C/C++的强大功能,所以C#是现在最流行的编程语言之一。3 模式设计3.1 动作角色扮演游戏简介本文设计的是动作角色扮演类游戏,在此对ARPG做一些介绍与分析。RPG是一个游戏类型,该游戏类型的核心是角色的扮演[2]。玩家将扮演一位角色在虚拟的世界中活动,玩家扮演的这名角色的活动都是在这个世界的规则下的,即事件的发展都在游戏设计的时候设计完毕,玩家所能做的就是通过一系列的选择来引导角色走向设计好的道路中的一条。通常RPG具有较强的故事性。RPG有多种形式,除了核心思想不变意外,它们的特点完全不一样。经由与不同的特点结合,RPG可大致分为动作角色扮演游戏、模拟角色扮演游戏、策略角色扮演游戏、角色扮演冒险游戏,另外还有独特的大型多人在线角色扮演游戏。模拟角色扮演游戏(简称RPSG)将角色扮演与模拟相结合,让玩家处在一个稳定安全的氛围中,玩家能在其中体验任何的工作,比如医生、建筑师等。这类游戏同时也是很好的教学工具,因为玩家不用担心任何的失误。策略角色扮演游戏(简称SRPG)是一种在日本非常流行的角色扮演游戏。SRPG将策略融入RPG中,玩家在游戏中会遇到许多的谜题和困难,这需要玩家细心的观察和充分的思考才能克服,这类游戏通常体现为战旗类[3]。动作角色扮演游戏(简称ARPG,以下皆用ARPG代称)的主题是“动作”,即玩家所操控的角色的动作(特别是攻击动作)和玩家的操作(如键盘和鼠标的指令输入)是密切相关的。ARPG是动作与剧情的完美融合的产物,玩家在玩ARPG类游戏是可以体会到如同动作游戏一般的流畅感,同时又能感受到游戏的丰富剧情。这就解决了动作游戏纯打斗的枯燥感,以及RPG没法畅快操作的遗憾。角色扮演冒险游戏(简称RPAG)结合了冒险游戏和角色扮演游戏的元素,RPAG的主旨是冒险,丰富的探险元素是这类游戏的重点,同时对角色的塑造也是一大重点。大型多人在线角色扮演游戏(简称MMORPG)是一种网络游戏,玩家所扮演的角色可以与其他玩家所扮演的角色在同一个世界见面,在MMORPG中,玩家之间的交互是重点,玩家可以和其他玩家一起探索这个世界,而不是自己一个人,这也要求世界要足够大,也要求它足够稳定能承受住大量的玩家。3.2 设计需求分析由于是ARPG,结合ARPG的特点,需求可大致分为以下几点(1)多角色。游戏中需要多种角色,除了玩家操纵的角色外,还要有不同的敌人,每个角色都有独立的动作和行为方式(比如有的敌人只会近距离攻击,有的只能远距离攻击),这样能使战斗丰富多彩,而不是一成不变的战斗,玩家需要用不同的策略来对付不同的敌人[4]。(2)多物品。游戏中需要多种物品,包括任务道具、消耗物品和装备。任务道具只有在恰当的时机使用才有效果(比如钥匙打开机关门);消耗物品能给玩家带来恢复和增益效果,但有使用次数限制;装备能带来稳定的增益效果,但能同时穿戴的装备数量有限制[5]。(3)关卡设计巧妙。关卡的设计关乎游戏的可玩性,若只是一条路走到底,一路上不断战斗到底的话,游戏的乐趣会大大减低。在合适的地方加入谜题、陷阱和宝藏,能提高玩家的探索欲望,增加游戏的可玩性。可以说合理的关卡设计对游戏的成功具有很大的推动作用。(4)数值合理。游戏数值的合理性对游戏性是很关键的,数值不合理可能会导致游戏难度太高或太简单,这会降低游戏的可玩性。游戏需要合理的数据来是游戏保持平衡,但有时一成不变又可能让玩家感受不到新鲜感,所以在某些特殊的地方可以调整一下游戏数据,可以让人眼前一亮。(5)UI界面简洁,功能齐全。UI是玩家看到游戏的第一印象,所以不能难看,也不能太花哨,应该风格明显,与游戏风格相符。好的UI应该能让人一看到就感受到游戏的主题,同时又不抢了游戏主体的风头。(6)游戏运行稳定。游戏的稳定是游戏成功的基础,没有人会愿意玩全是BUG的游戏。所以游戏不能有严重BUG,至少要保证BUG不影响游戏的体验。游戏的优化应该要跟的上,代码应精简,尽量避免高功耗。3.3 设计模式3.3.1 设计模式原则设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式的目的是为了代码的可重用性,让代码更容易被他人理解,保证代码的可靠性。设计模式软件工程的基石脉络,是设计模式让代码的编写真正的工程化。设计模式的六大原则(1)单一职责原则。单一职责原则的意思就如它的名字所示,单一的类只完成一个单一的功能。使用单一职责原则可以降低类的复杂度,提高类的可读性,提高系统的可维护性,还能降低变更引起的风险。但是在很多时候,我们都会有意无意的违反单一职责原则,因为功能在某些情况下会被划分成更细的功能。而在违反单一职责原则时,应该做到只有逻辑足够简单,才可以在代码级别上违反单一职责原则;只有类中方法数量足够少,才可以在方法级别上违反单一职责原则。(2)里氏替换原则[6]。里氏替换原则说的是子类可以扩展父类的功能,但不能改变父类原有的功能,即子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法,另外当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松,当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。在编程时,应尽量不去重写父类的方法,也尽量不去重载父类的方法。遵守里氏替换原则的好处是代码出现问题的几率大大降低。(3)依赖倒置原则。依赖倒置原则的定义为高层模块不应该依赖低层模块,二者都应该依赖其抽象,抽象不应该依赖细节,细节应该依赖抽象。依赖倒置原则的核心思想是面向接口编程,低层模块尽量都要有抽象类或接口,或者两者都有。为了降低类之间的耦合度,并且提高系统的稳定系,应当遵守依赖倒置原则。(4)接口隔离原则。客户端不应该依赖它不需要的接口,或者说一个类对另一个类的依赖关系应该建立在最小的接口上。由于类在实现接口的方法时,不管其中的方法时候用得到,都得实现,所以若是接口过于庞大,类在实现其方法的时候就必须实现很多不必要的方法,这样的设计是不合理的。接口应该具有针对性。但是接口也不能过小,这样会造成接口过多,提高设计的复杂性,所以一定要适度。(5)迪米特法则[7]。一个类对自己依赖的类知道的越少越好,换句话说,对于被依赖的类,无论逻辑多复杂,都尽量将逻辑封装在类的内部,对外除了提供public的方法,不对外泄露任何信息。遵守迪米特法则可以降低类之间的耦合,但过度的使用会导致系统复杂度变大,因此使用应有度。(6)开闭原则。其定义是所有程序员都追求的东西一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。它是所有设计模式的最终目标,合理的遵守设计模式,就是遵守开闭原则。本文所设计的游戏中,使用了设计模式中最常用的单例模式和观察者模式。3.3.2 单例模式单例模式的含义即保证一个类只有一个实例,并提供一个访问他的全局访问点。当对象在全局中有且唯一时,可以使用单例模式。在本文设计的游戏中,玩家角色是有且唯一的,所以玩家角色的属性可以使用单例模式。3.3.3 观察者模式观察者模式又可以叫做“发布-订阅模式”,从名字就可以看出该模式代表了一对多的关系模式,多个观察者同时监听同一个对象。观察者模式常与单例模式同时使用[8]。观察者模式涉及到委托和事件,在不同的编程语言中,委托和事件使用方式不同,本文设计的游戏使用的是C#语言,在C#中用delegate关键字申明委托,用event关键字申明事件。事件可以提供任意有需求的对象订阅,当条件满足时,自动回调所有订阅者的方法,被订阅的对象不需要知道订阅他的对象。本文所设计的游戏中玩家角色的生命值和精力值可以作为监听的主题,当玩家生命值、生命上限、精力值或精力上限改变时,自动回调所有订阅者的方法,可以同时做到生命条和数值的变化。3.3.4 有限状态机有限状态机(简称FSM),又称有限状态自动机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型[9]。在计算机科学中有限状态机被广泛用于建模应用行为、硬件电路系统设计、软件工程、编译器、网络协议和计算与语言的研究。在处理复杂的业务逻辑时,可以先看看是否适合用一个有限状态机来描述,如果可以把业务模型抽象成一个有限状态机,那么代码逻辑就会特别清楚,结构特别规整。状态机可归纳为4个要素,即现态、条件、动作、次态。现态是指当前所处的状态。条件又称“事件”,当现态的条件被满足时,现态会做出相应动作,或是变迁到次态。动作是条件满足后执行的动作,在动作执行完毕后,现态可以迁移到次态,也可以保持不变。动作不是必须的,当条件满足后,也可以不执行任何动作,直接从现态变迁到次态。次态是条件满足后要迁往的新状态。次态是相对与现态而言的,次态一旦被激活,就转变成新的现态了。3.4 游戏框架设计3.4.1 客户端的功能框架本文所设计的游戏属于单机游戏,只有客户端,没有服务器。客户端的功能分块框架[10]图3.1 客户端基础功能框架图3.4.2 玩家角色的功能框架玩家角色具有生命力、攻击力、防御力和精力四项基本属性,玩家可以通过穿戴装备、使用道具和升级来加强自己的基本属性。玩家通过按键输入,能够流畅的操控角色做各种动作,本项目将玩家角色的基本动作分为8种状态,分别为停滞、移动、攻击、跳跃、防御、闪避、硬直和死亡,另外玩家还能够在战斗中使用道具,使用道具状态作为第9状态(如图3.2)。图3.2 玩家角色功能框架图3.4.3 内置场景功能框架游戏中的敌人同样具有生命力、攻击力、防御力和精力4项基本属性,考虑到不同敌人所拥有的行为不同,所以将敌人的行为分为两部分,一部分为所有敌人都共有的基本行为,即停滞、移动、攻击和死亡,另一部分为可选行为,包括防御、闪避和硬直,敌人可以具有全部的可选行为,也可以完全没有可选行为(如图3.3)。图3.3 敌人功能框架图3.4.4 菜单的功能框架游戏中提供全面的菜单功能,菜单分为主菜单、背包菜单、装备菜单、退出菜单、保存菜单和升级菜单(如图3.4)。图3.4 菜单功能框架4 角色活动分析4.1 玩家活动的分析(1)玩家玩游戏用况的描述玩家进入游戏后,可以选择开始新游戏,继续游戏和退出游戏,玩家若选择退出游戏,则游戏直接结束,并结束用况。玩家在正式开始游戏后,系统会持续接收玩家的输入,并根据玩家的输入信息来控制角色做动作。期间若角色被攻击,则角色进入硬直状态,短时间内不接收玩家的输入。若玩家死亡,则提供重新开始游戏和退出游戏的按钮,继续游戏则从存档处再开始游戏,退出游戏则游戏结束,并结束用况。详细描述如图4.1所示。图4.1 玩家玩游戏用况的详细描述(2)玩家玩游戏用况的活动图描述玩家玩游戏用况的活动图描述如图4.2所示。图4.2 玩家玩游戏用况的活动图4.2 玩家角色的有限状态机本文设计的游戏中,玩家所控制的角色行为可以用有限状态机来实现。玩家角色的状态可以分为空闲,移动,攻击,跳跃,防御,闪避,使用道具,硬直,死亡[11]。玩家开始游戏后进入空闲状态,除了硬直和死亡状态,其他状态通过玩家的按键输入来控制转换,空闲状态可以转换到其他任何一个状态。移动状态与空闲状态一样可以转换到任意状态,但它与空闲状态不同的是其余状态只会回到空闲状态,而不是回到移动状态。为了游戏的合理性,在跳跃状态下允许转换到攻击状态,但是跳跃状态转换为攻击状态后就不能再转换回去,因为跳跃状态的动画时一个完整的动画,即从起跳到下落,攻击完毕后在重新播放完整的跳跃动画明显是不合理的。为了解决这个问题,在之后的实现中又添加了下落状态,在此先不做详细说明,此处跳跃和下落合并为跳跃状态。硬直状态和死亡状态不受玩家控制,而是与游戏中的敌人有关。当玩家受到敌人攻击或防御时精力降为0时进入硬直状态,玩家的输入无效。进入硬直状态后经过一段时间状态恢复,回到空闲状态。当玩家的生命值降为0时,进入死亡状态,玩家无法在控制角色,选择重新开始或退出游戏。具体状态机图如图4.3所示。图4.3 玩家角色的状态机图4.3 内置场景的有限状态机敌人的状态转换用有限状态机来实现是非常合适的。敌人的状态可以分为空闲、移动、攻击、防御、闪避、硬直、死亡。其中空闲、移动、攻击和死亡为所有敌人共有的状态,而防御、闪避和硬直为一些敌人所特有的状态。敌人的状态转换条件与玩家角色不同,敌人没有输入指令来作为条件,所以主要采用计时器和与玩家角色的互动为判断条件[12]。状态中空闲为基本状态,所有状态的次态都是空闲状态。移动、攻击、防御、闪避为主动状态,以时间为条件,满足条件后就从空闲状态变迁至其中之一,状态间不能相互变迁。硬直和死亡为被动状态,有玩家角色的攻击为条件,当敌人的精力降为0,则进入硬直状态,直到经过一定时间才变迁为空闲状态,当敌人的生命值降为0,则进入死亡状态,怪物进行死亡动作,播放死亡动画,经过一定时间后消失。敌人的类型又可以分为两种,一种为普通敌人,一种为boss。普通敌人拥有两种行为模式,巡逻模式和战斗模式,即未发现玩家情况下的状态和发现玩家情况下的状态,而boss因为其必然性,所以boss只有战斗模式。普通敌人在巡逻模式下,只有空闲和移动两种状态,在发现玩家后,切换至战斗模式,所有该敌人拥有的状态全部启用。普通敌人的详细状态机图如图4.4所示。图4.4 普通敌人的状态机图boss的详细状态机图如图4.5所示。图4.5 boss的状态机图5 游戏的实现5.1 有限状态机的实现本项目中的角色控制器、AI控制器和菜单控制都是使用有限状态机的思想来实现的。在平时的编程中使用的if-else和switch判断其实已经搭上了有限状态机的边,甚至简单的有限状态机就可以使用这样的方式来实现。但是使用这种方式编程会带来很多麻烦,当我们要添加或修改一个状态时,我们不得不加入更多的判断语句,当状态稍多时,我们就很难找到自己想要修改的关键点,更可怕的是当我们修改某些状态时,不得不把大部分代码全部推翻重来,所以这样的编程方式是不可取的。本项目依据面向对象思想,参考各种设计模式,力求达到开闭原则的对增加开放,对修改关闭,在添加状态时,不用修改其他状态,可以直接添加。具体实现情况如图5.1所示。图5.1 有限状态机类图本项目定义了状态类FSMState,状态装换类FSMTranslation,以及有限状态机类FSM。状态类FSMState用于表示状态对象,记录状态名和状态在开始、进行中和结束时的事件函数,该类还定义了字典,用来保存每个状态对象的状态转换。状态转换类FSMTranslation用于表示状态对象的状态转换,用该类中的成员变量name来表示状态类之间的转换,从fromState转换到toState。有限状态机类FSM用来存储所有的状态对象以及他们的状态转换,一个FSM对象就代表了一个角色对象的有限状态机。FSM类为FSMState类提供了事件函数的委托和事件函数的回调函数,通过字典保存一个角色对象所有的状态,同时还提供了状态装换的方法。新状态的增加,可以通过AddState和AddTranslation方法,将新状态和新状态对应的状态转换直接添加进来,不用修改其他状态。5.2 玩家角色控制器的实现玩家角色的状态转换通过有限状态机来实现,在有限状态机类FSM和状态类FSMState中并没有实现状态进入、进行中和结束时的具体功能,因为每个状态的动作是不同的,基于设计模式中的依赖倒置原则,面向接口编程的思想,本项目使用一个接口StateHandler来实现每个状态的动作。使用接口的另一个原因是本项目使用的是unity3D游戏引擎,C#编程语言,要使用unity中带有个各种功能组件需要继承MonoBehaviour,而C#并不支持多继承,角色控制器需要有一个基类继承MonoBehaviour,所有StateHandler接口的实现类都继承该类,这样就能保证各个状态的动作确实落实到游戏中的角色上。具体实现如图5.2所示。图5.2 玩家角色控制器类图玩家状态类所指的并不是一个类,而是指代玩家所有的状态。playerState类继承MonoBehaviour类,定义了动画组件的成员变量,因此在玩家状态类中可以直接控制角色的动画,即控制角色做出各种动作。playerState中还定义了玩家角色的有限状态机player_fsm,状态的定义和添加,以及各个状态的状态转换定义和添加在其子类playerController中完成,playerController类负责接收玩家从键盘输入的信息,控制状态装换,并且实现了碰撞检测和触发事件检测函数,判断玩家角色是否被攻击,是否落在地上。以上是玩家角色的状态转换控制,但角色控制器还不完整,还缺少的是角色的基础属性,生命值攻击力等。这些基础属性在玩家属性类playerProperty中定义。由于玩家角色在游戏中是唯一存在,同时他的属性应该是能够全局访问的,因此使用设计模式中的单例模式来实现玩家角色的基础属性。playerProperty类定义了玩家的基础属性值,生命力、攻击力、防御力和精力,由于装备系统会将效果直接作用到基础属性上,因此这些基础属性设为公有变量。玩家的具体属性通过基础属性和装备加成计算获得。玩家属性的类图如图5.3所示。图5.3 玩家属性类图5.3 攻击对象控制器的实现敌人的控制器与玩家角色控制器一样,状态转换都通过有限状态机来实现,与玩家不同的是敌人是可以重复出现的,甚至连boss都可以是重复出现的,所以敌人的属性不是唯一的,不能使用单例模式,每一个敌人对象都拥有他自己的属性。因此敌人属性通过敌人属性类EnemyProperty定义,该类不是单例的,每个敌人对象都可以初始化他自己的属性值。另外,由于敌人不需要升级系统,也没有装备系统,因此敌人的属性并不需要通过计算获得,直接在初始化时设置对应的具体属性值。敌人控制器的类图如图5.3所示。图5.4 敌人控制器类图5.4 菜单功能的实现游戏中的菜单也可以被看作是一种状态,菜单的开关和切换也是一种状态转换,因此菜单也可以用有限状态机来实现。菜单不用有限状态机也是能够实现的,并且因为本项目的菜单数量并不多也不算十分复杂,因此可以不使用有限状态机。但是考虑到对项目的修改和编程逻辑性的问题,使用有限状态机明显是优于不使用的。具体类图如图5.5所示。图5.5 菜单控制器类图5.5 道具装备系统的实现在本项目中,道具装备也是最重要的部分之一。道具和装备的使用也可以被分解为开始使用、使用中和结束使用三个动作,因此道具功能也可以通过实现接口StateHandler的方法来实现。由于道具库应是唯一存在的,所有道具都应该是唯一的(数量可以不为一),所以道具库类可以使用单例模式,使用单例的另一个好处是可以在任何地方添加新道具到道具库中。道具系统的类图如图5.6所示。图5.6 道具系统类图由于游戏中规定了玩家只能装备三件装备,携带三种药品,因此需要一个使用中的道具类来记录下当前使用中的道具,该类的另一个作用是实现装备栏的合理性,比如当玩家在不同的装备栏装备同一件装备时,装备应该被放置到后一个的位置,前一次的装备栏会清空。利用使用中道具类,可以人为规定使用中的装备所占的是哪个格子。本项目所设计的使用中道具类使用字典来存放对应格子的道具。具体类图如图5.7所示。图5.7 使用中道具类图6 总结与展望6.1 总结本文首先对国内外游戏现状进行了分析,从诸多成功的游戏中寻找他们成功的关键点,从而得出了动作角色扮演游戏所需要的元素。论文接着对游戏进行需求分析,建立起了基础的功能框架。基于面向对象编程思想,以及对设计模式的深入研究,对框架进行了进一步的完善。本文接着对角色的状态进行了深入的分析,并且根据有限状态机思想设计实现了符合设计模式的有限状态机类,使用该类可以方便的对状态进行添加而不用修改其他状态。通过将一般实现菜单的逻辑结构与有限状态机实现的菜单的逻辑结构作比较,发现使用有限状态机实现的菜单逻辑结构更清晰,更便于添加和修改,最后采用了后者的方法。然后论文对角色属性进行了分析,通过单例实现了玩家角色的属性,并用AI属性类来保存AI属性。针对游戏中的道具装备系统,本文设计实现了道具库类,该类采用单例模式,用于所有道具的添加和保存。论文最后将所有功能整合测试,得到了较好的效果,达到了预期。本文的主要难点在于(1)游戏框架的搭建。(2)有限状态机和设计模式的结合,实现对状态的任意添加。(3)UI界面的搭建,以及UI功能的实现。(4)道具装备系统的实现,实现合理的装备穿戴和替换效果。6.2 展望由于时间和精力有限,另外受个人能力所限,本项目还有可以进一步改进的地方(1)角色动作还有待提升。作为一个ARPG,动作是很重要的一环,但由于素材的限制,以及编程能力的限制,角色动作显得生硬,不够流畅。每个动作的衔接处数值应该设置更精确,另外还能加入更多的动作,然操作体验更好。(2)AI简单,可以加入更多指令,使AI更智能,从而提高游戏体验。(3)内容还能增加。由于时间原因,游戏的章节很短,并且游戏中角色数量较少,可用的道具也不多。需要更多的游戏内容来提高游戏时间。致谢参考文献[1]Will Goldstone.Unity Game Developemt Essentials[M].Packet Publishing,2009,10:32-48.[2]朱昊然.自由交互下RPG游戏的形象设计与体验研究[D].江西:江西师范大学,2015:1-47.[3]夏菲.策略性手机游戏设计与开发[D].扬州:扬州大学,2014:1-75.[4]马晨阳.基于coco2d-x引擎的ARPG类手机游戏的设计与实现[D].华南:华南理工大学,2015:1-65.[5]张地长.基于Cocos2d-x的战旗手游研发[D].南昌:南昌大学,2015:1-69.[6]李霞.MVC设计模式的原理与实现[D].吉林:吉林大学,2004:1-82.[7]张丽坤.设计模式在软件复用中的应用研究[D].大连:大连海事大学,2007:1-65.[8]石诚.“观察者模式框架”研究及其在量化投资中的应用[D].北京:首都经济贸易大学,2014:1-58.[9]谭同超.有限状态机及其应用[D].广州:华南理工大学,2013:1-59.[10]王异帆.基于Cocos2d-x游戏引擎的塔防类手机游戏框架设计与实现[D].武汉:华中师范大学,2015:1-94.[11] Mirko Suznjevic,Ivana Stupar,Maja Matijasevic.A model and software architecture for MMORPG traffic generation based on player behavior[J].?Multimedia Systems . 2013,19(3):231-253.[12]何赛.游戏人工智能关键技术研究与应用[D].导师李丽香.北京:北京邮电大学,2015:1-77.
目录
摘要 1
关键字 1
Abstract. 1
Keywords 1
1 绪论 1
1.1 研究背景及意义 1
1.2 国内外研究现状 2
1.3 研究内容与技术路线 3
1.3.1 研究内容 3
1.3.2 技术路线 3
2 开发平台简介 4
2.1 Unity3D的简介 4
2.2 Microsoft Visual Studio 4
3 模式设计 4
3.1 动作角色扮演游戏简介 4
3.2 设计需求分析 5
3.3 设计模式 6
3.3.1 设计模式原则 6
3.3.2 单例模式 7
3.3.3 观察者模式 7
3.3.4 有限状态机 7
3.4 游戏框架设计 7
3.4.1 客户端的功能框架 7
3.4.2 玩家角色的功能框架 8
3.4.3 内置场景功能框架 9
3.4.4 菜单的功能框架 9
4 角色活动分析 10
4.1 玩家活动的分析 10
4.2 玩家角色的有限状态机 12
4.3 内置场景的有限状态机 13
5 游戏的实现 15
5.1 有限状态机的实现 15
5.2 玩家角色控制器的实现 16
5.3 攻击对象控制器的实现 18
5.4 菜单功能的实现 19
5.5 道具装备系统的实现 20
6 总结与展望 22
6.1 总结 22
6.2 展望 22
致谢 23
参考文献 23
基于多角色场景的一种幻想模拟游戏
i state transitions in the game,this paper proposes and designs the appropriate finite-state machine,and realizes the transform of multi characters and scenes based on player and enemies.At last,this paper realizes the transform of the function menu.This paper also realizes the design of the battle system and equipment system based on Singleton pattern and Observer pattern.After integration and testing,it meets the expected requirements.Keywords:Video game;Unity3D;Finite-state machine;design pattern1 绪论1.1 研究背景及意义游戏这个词传承千年,它所代表的意义是非常广的,从野兽一般的嬉戏,到真人之间有规则的活动,再到现在的人机交流,都能叫游戏。但是它们的目的都是一样的,那就是为了娱乐,为了充实自己的生活。生在现在这样和平安定的年代,人们生活稳定的同时需要更多能让自己充实的东西,想要寻求更多的刺激。然而现实给予我们的限制很多,很多事情现实中是无法做到的,或是没有时间没有机会去做的,这时候游戏(这里的游戏指的是在电脑、主机或手机上运行的虚拟产品,以后提到的游戏皆为此意)的意义就体现出来了,在游戏的世界中,人们可以得到自己所得不到的东西,见证各种各样的神奇,听闻一个又一个故事,甚至更有意义深远的游戏,引发人们对生活对各种情感的深思。游戏本身对人类是有重大意义的,而人们的生活与游戏的结合也越来越紧密,游戏成为人们生活中非常重要的一环。1.2 国内外研究现状正因为看到了游戏的重要意义,以及其中的巨大利益,全球有大量的公司、工作室和个人团体参与游戏开发工作,由此诞生了各种各样的游戏,满足不同需求的人群。这些团体中,有许多全球知名的团体,他们的游戏在给人们带来快乐的同时,也使他们自己获得了巨大的财富和名声,而在全球的游戏产业中,以日本的游戏产业为最。索尼(Sony Corporation)是日本的一家全球知名的大型综合性跨国企业集团,索尼是世界电子游戏领域的先导者,是世界电子游戏业三大巨头之一,其旗下的PlayStation游戏机是现在最出名的游戏主机产品之一。CAPCOM是以制作动作游戏闻名世界的电视游戏软件公司,在业内被称为“动作天尊”,旗下有《生化危机》系列、《鬼泣》系列、《街头霸王》系列等闻名世界的游戏巨作。BANDAI NAMCO GAMES(简称BNGI)由日本著名的公司南梦宫(NAMCO)和万代(DANDAI)合并而成,是著名的RPG游戏开发公司,旗下有《黑暗之魂》系列、《传说》系列、《铁拳》系列等巨作。光荣(Koei)是日本以模拟游戏闻名的游戏软件公司,旗下有著名的《信长之野望》系列、《三国志》系列等著作,更是开创了独特的动作游戏类型《无双》系列。任天堂(Nintendo)是日本全球的娱乐厂商,电子游戏业三大巨头之一,现代电子游戏产业的开创者,旗下有大量的游戏平台产品,比如FC游戏机、WiiU、3DS等,同时旗下还有大量世界著名的巨作,如《马里奥》系列、《精灵宝可梦》系列、《塞尔达传说》系列等。欧美的游戏产业次于日本,但也有许多世界著名的游戏公司。微软(Microsoft)是美国的跨国科技公司,现在使用最广的操作系统Windows操作系统就是该公司的产品,目前是全球最大的电脑软件供应商。同时微软也涉及游戏领域,其旗下的Xbos游戏机是当代的“三大主机”之一,还有《光晕》系列、《帝国时代》系列等巨作。暴雪娱乐公司是美国著名的视频游戏制作和发行公司,是现在影响最深的游戏公司之一,旗下有著名的《魔兽》系列、《星际争霸》系列、《暗黑破坏神》系列等巨作。育碧娱乐软件公司(Ubisoft Entertainment)是一家著名的跨国公司,其总部设在法国雷恩,其旗下有著名的《雷曼》系列、《刺客信条》系列、《波斯王子》系列等巨作。其他还有一些著名的游戏公司和它们的著作,比如美国艺电公司(Electronic Arts,NASDAQ:ERTS,简称EA)以及其旗下的《命令与征服》系列、《FIFA》系列等,2K Games以及其旗下的《文明》系列、《无主之地》系列、《NBA》系列等,顽皮狗(Naughty Dog)以及其旗下的《最后的生还者》、《神秘海域》系列等。我国由于进入信息时代较晚,并且前期的产权意识薄弱等原因,在游戏产业落后于世界顶尖水平,但是随着近些年的飞速发展和产权意识的加深,越来越多的游戏公司如同雨后春笋般冒出头来,其中著名的有腾讯、网易、完美世界、盛大、蜗牛、久游等,虽然代理游戏在中国还是占主流,但也不乏一些优秀的自主研发的游戏作品,如腾讯开发的《天涯明月刀》、网易开发的《天谕》等,已经达到世界级水准。虽然电脑和主机上的游戏仍然和其他国家有差距,但是手机游戏却非常成功,随着这两年手游的强势崛起,国内各大游戏公司纷纷投身于手游市场,各种各样新奇有趣的手游由此诞生,影响越来越多的人。1.3 研究内容与技术路线1.3.1 研究内容(1)为了完整设计开发出一个独立游戏,需要知道游戏开发的全过程,从已有结果的论文中挑选出一部分,对其设计思路和整体框架进行分析。(2)工欲善其事,必先利其器,为了能成功的开发出一个游戏,并且增加其稳定性,对所使用的工具必须有一定程度的认知,通过各种渠道获取Unity3D游戏引擎的相关知识,并且分析其优缺点。(3)为了编程的合理性,体现面向对象编程思想,实现低耦合高内聚,研究设计模式的思想,一共28种设计模式,分析其中面向对象思想,以及各自的优缺点。 (4)为了实现游戏中的状态转换问题,分析现有的关于有限状态机的论文,设计实现基于有限状态机的状态转换。(5)通过已有论文分析游戏人工智能,针对该项目实现合适的怪物AI。1.3.2 技术路线图1.1 技术路线图2 开发平台简介2.1 Unity3D的简介Unity作为一个成熟的游戏引擎,具有游戏引擎应有的完备的系统。(1)图形渲染系统Unity自带的图形渲染系统和Shader能够满足绝大多数情况,同时Unity支持CG、GLSL、HLSL编程语言,自带着色器的封装ShaderLab,用户可以方便的编写Shader来实现自己想要的效果。(2)物理系统Unity自带的物理系统可以让用户方便的添加碰撞器和刚体,能很便捷的模拟出物理效果。(3)视音频系统该系统能自动将音视频转换为Unity支持的格式,同时提供大量的可调节选项,让用户便捷的调节视觉效果,以及模拟真实的声音。(4)GUI系统可视化操作的GUI系统,让用户方便的制作UI界面。(5)编辑器系统Unity支持JavaScript和C#等语言脚本,使用起来非常灵活。(6)强大的地形编辑体系Unity自带的地形编辑系统能让用户非常轻松的建立起地形,并且细节调节方便。同时,Unity能较好的支持Maya、3Ds Max等建模软件,所以被广泛的应用于三维游戏、VR等热门领域。2.2 Microsoft Visual StudioMicrosoft Visual Studio(简称VS)是美国微软公司的开发工具包系列产品,主要运行于各类Windows操作系统中。VS是一套完整的开发工具集,它囊括了整个软件生命周期所需的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。其强大的功能能够开发市面上所有的软件产品。由于多种计算机开发语言均使用相同的集成开发环境(IDE),开发人员可以快捷地创建共享工具,较为高效地实现各种混合语言解决方案。本文所设计的游戏是在Unity3D下通过C#开发的,C#是VS工具集中的一种。C#是一种面向对象的、运行于.NET Framework之上的高级程序设计语言。C#与Java有着惊人的相似,使用安全、简单,同时它又继承了C/C++的强大功能,所以C#是现在最流行的编程语言之一。3 模式设计3.1 动作角色扮演游戏简介本文设计的是动作角色扮演类游戏,在此对ARPG做一些介绍与分析。RPG是一个游戏类型,该游戏类型的核心是角色的扮演[2]。玩家将扮演一位角色在虚拟的世界中活动,玩家扮演的这名角色的活动都是在这个世界的规则下的,即事件的发展都在游戏设计的时候设计完毕,玩家所能做的就是通过一系列的选择来引导角色走向设计好的道路中的一条。通常RPG具有较强的故事性。RPG有多种形式,除了核心思想不变意外,它们的特点完全不一样。经由与不同的特点结合,RPG可大致分为动作角色扮演游戏、模拟角色扮演游戏、策略角色扮演游戏、角色扮演冒险游戏,另外还有独特的大型多人在线角色扮演游戏。模拟角色扮演游戏(简称RPSG)将角色扮演与模拟相结合,让玩家处在一个稳定安全的氛围中,玩家能在其中体验任何的工作,比如医生、建筑师等。这类游戏同时也是很好的教学工具,因为玩家不用担心任何的失误。策略角色扮演游戏(简称SRPG)是一种在日本非常流行的角色扮演游戏。SRPG将策略融入RPG中,玩家在游戏中会遇到许多的谜题和困难,这需要玩家细心的观察和充分的思考才能克服,这类游戏通常体现为战旗类[3]。动作角色扮演游戏(简称ARPG,以下皆用ARPG代称)的主题是“动作”,即玩家所操控的角色的动作(特别是攻击动作)和玩家的操作(如键盘和鼠标的指令输入)是密切相关的。ARPG是动作与剧情的完美融合的产物,玩家在玩ARPG类游戏是可以体会到如同动作游戏一般的流畅感,同时又能感受到游戏的丰富剧情。这就解决了动作游戏纯打斗的枯燥感,以及RPG没法畅快操作的遗憾。角色扮演冒险游戏(简称RPAG)结合了冒险游戏和角色扮演游戏的元素,RPAG的主旨是冒险,丰富的探险元素是这类游戏的重点,同时对角色的塑造也是一大重点。大型多人在线角色扮演游戏(简称MMORPG)是一种网络游戏,玩家所扮演的角色可以与其他玩家所扮演的角色在同一个世界见面,在MMORPG中,玩家之间的交互是重点,玩家可以和其他玩家一起探索这个世界,而不是自己一个人,这也要求世界要足够大,也要求它足够稳定能承受住大量的玩家。3.2 设计需求分析由于是ARPG,结合ARPG的特点,需求可大致分为以下几点(1)多角色。游戏中需要多种角色,除了玩家操纵的角色外,还要有不同的敌人,每个角色都有独立的动作和行为方式(比如有的敌人只会近距离攻击,有的只能远距离攻击),这样能使战斗丰富多彩,而不是一成不变的战斗,玩家需要用不同的策略来对付不同的敌人[4]。(2)多物品。游戏中需要多种物品,包括任务道具、消耗物品和装备。任务道具只有在恰当的时机使用才有效果(比如钥匙打开机关门);消耗物品能给玩家带来恢复和增益效果,但有使用次数限制;装备能带来稳定的增益效果,但能同时穿戴的装备数量有限制[5]。(3)关卡设计巧妙。关卡的设计关乎游戏的可玩性,若只是一条路走到底,一路上不断战斗到底的话,游戏的乐趣会大大减低。在合适的地方加入谜题、陷阱和宝藏,能提高玩家的探索欲望,增加游戏的可玩性。可以说合理的关卡设计对游戏的成功具有很大的推动作用。(4)数值合理。游戏数值的合理性对游戏性是很关键的,数值不合理可能会导致游戏难度太高或太简单,这会降低游戏的可玩性。游戏需要合理的数据来是游戏保持平衡,但有时一成不变又可能让玩家感受不到新鲜感,所以在某些特殊的地方可以调整一下游戏数据,可以让人眼前一亮。(5)UI界面简洁,功能齐全。UI是玩家看到游戏的第一印象,所以不能难看,也不能太花哨,应该风格明显,与游戏风格相符。好的UI应该能让人一看到就感受到游戏的主题,同时又不抢了游戏主体的风头。(6)游戏运行稳定。游戏的稳定是游戏成功的基础,没有人会愿意玩全是BUG的游戏。所以游戏不能有严重BUG,至少要保证BUG不影响游戏的体验。游戏的优化应该要跟的上,代码应精简,尽量避免高功耗。3.3 设计模式3.3.1 设计模式原则设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式的目的是为了代码的可重用性,让代码更容易被他人理解,保证代码的可靠性。设计模式软件工程的基石脉络,是设计模式让代码的编写真正的工程化。设计模式的六大原则(1)单一职责原则。单一职责原则的意思就如它的名字所示,单一的类只完成一个单一的功能。使用单一职责原则可以降低类的复杂度,提高类的可读性,提高系统的可维护性,还能降低变更引起的风险。但是在很多时候,我们都会有意无意的违反单一职责原则,因为功能在某些情况下会被划分成更细的功能。而在违反单一职责原则时,应该做到只有逻辑足够简单,才可以在代码级别上违反单一职责原则;只有类中方法数量足够少,才可以在方法级别上违反单一职责原则。(2)里氏替换原则[6]。里氏替换原则说的是子类可以扩展父类的功能,但不能改变父类原有的功能,即子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法,另外当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松,当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。在编程时,应尽量不去重写父类的方法,也尽量不去重载父类的方法。遵守里氏替换原则的好处是代码出现问题的几率大大降低。(3)依赖倒置原则。依赖倒置原则的定义为高层模块不应该依赖低层模块,二者都应该依赖其抽象,抽象不应该依赖细节,细节应该依赖抽象。依赖倒置原则的核心思想是面向接口编程,低层模块尽量都要有抽象类或接口,或者两者都有。为了降低类之间的耦合度,并且提高系统的稳定系,应当遵守依赖倒置原则。(4)接口隔离原则。客户端不应该依赖它不需要的接口,或者说一个类对另一个类的依赖关系应该建立在最小的接口上。由于类在实现接口的方法时,不管其中的方法时候用得到,都得实现,所以若是接口过于庞大,类在实现其方法的时候就必须实现很多不必要的方法,这样的设计是不合理的。接口应该具有针对性。但是接口也不能过小,这样会造成接口过多,提高设计的复杂性,所以一定要适度。(5)迪米特法则[7]。一个类对自己依赖的类知道的越少越好,换句话说,对于被依赖的类,无论逻辑多复杂,都尽量将逻辑封装在类的内部,对外除了提供public的方法,不对外泄露任何信息。遵守迪米特法则可以降低类之间的耦合,但过度的使用会导致系统复杂度变大,因此使用应有度。(6)开闭原则。其定义是所有程序员都追求的东西一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。它是所有设计模式的最终目标,合理的遵守设计模式,就是遵守开闭原则。本文所设计的游戏中,使用了设计模式中最常用的单例模式和观察者模式。3.3.2 单例模式单例模式的含义即保证一个类只有一个实例,并提供一个访问他的全局访问点。当对象在全局中有且唯一时,可以使用单例模式。在本文设计的游戏中,玩家角色是有且唯一的,所以玩家角色的属性可以使用单例模式。3.3.3 观察者模式观察者模式又可以叫做“发布-订阅模式”,从名字就可以看出该模式代表了一对多的关系模式,多个观察者同时监听同一个对象。观察者模式常与单例模式同时使用[8]。观察者模式涉及到委托和事件,在不同的编程语言中,委托和事件使用方式不同,本文设计的游戏使用的是C#语言,在C#中用delegate关键字申明委托,用event关键字申明事件。事件可以提供任意有需求的对象订阅,当条件满足时,自动回调所有订阅者的方法,被订阅的对象不需要知道订阅他的对象。本文所设计的游戏中玩家角色的生命值和精力值可以作为监听的主题,当玩家生命值、生命上限、精力值或精力上限改变时,自动回调所有订阅者的方法,可以同时做到生命条和数值的变化。3.3.4 有限状态机有限状态机(简称FSM),又称有限状态自动机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型[9]。在计算机科学中有限状态机被广泛用于建模应用行为、硬件电路系统设计、软件工程、编译器、网络协议和计算与语言的研究。在处理复杂的业务逻辑时,可以先看看是否适合用一个有限状态机来描述,如果可以把业务模型抽象成一个有限状态机,那么代码逻辑就会特别清楚,结构特别规整。状态机可归纳为4个要素,即现态、条件、动作、次态。现态是指当前所处的状态。条件又称“事件”,当现态的条件被满足时,现态会做出相应动作,或是变迁到次态。动作是条件满足后执行的动作,在动作执行完毕后,现态可以迁移到次态,也可以保持不变。动作不是必须的,当条件满足后,也可以不执行任何动作,直接从现态变迁到次态。次态是条件满足后要迁往的新状态。次态是相对与现态而言的,次态一旦被激活,就转变成新的现态了。3.4 游戏框架设计3.4.1 客户端的功能框架本文所设计的游戏属于单机游戏,只有客户端,没有服务器。客户端的功能分块框架[10]图3.1 客户端基础功能框架图3.4.2 玩家角色的功能框架玩家角色具有生命力、攻击力、防御力和精力四项基本属性,玩家可以通过穿戴装备、使用道具和升级来加强自己的基本属性。玩家通过按键输入,能够流畅的操控角色做各种动作,本项目将玩家角色的基本动作分为8种状态,分别为停滞、移动、攻击、跳跃、防御、闪避、硬直和死亡,另外玩家还能够在战斗中使用道具,使用道具状态作为第9状态(如图3.2)。图3.2 玩家角色功能框架图3.4.3 内置场景功能框架游戏中的敌人同样具有生命力、攻击力、防御力和精力4项基本属性,考虑到不同敌人所拥有的行为不同,所以将敌人的行为分为两部分,一部分为所有敌人都共有的基本行为,即停滞、移动、攻击和死亡,另一部分为可选行为,包括防御、闪避和硬直,敌人可以具有全部的可选行为,也可以完全没有可选行为(如图3.3)。图3.3 敌人功能框架图3.4.4 菜单的功能框架游戏中提供全面的菜单功能,菜单分为主菜单、背包菜单、装备菜单、退出菜单、保存菜单和升级菜单(如图3.4)。图3.4 菜单功能框架4 角色活动分析4.1 玩家活动的分析(1)玩家玩游戏用况的描述玩家进入游戏后,可以选择开始新游戏,继续游戏和退出游戏,玩家若选择退出游戏,则游戏直接结束,并结束用况。玩家在正式开始游戏后,系统会持续接收玩家的输入,并根据玩家的输入信息来控制角色做动作。期间若角色被攻击,则角色进入硬直状态,短时间内不接收玩家的输入。若玩家死亡,则提供重新开始游戏和退出游戏的按钮,继续游戏则从存档处再开始游戏,退出游戏则游戏结束,并结束用况。详细描述如图4.1所示。图4.1 玩家玩游戏用况的详细描述(2)玩家玩游戏用况的活动图描述玩家玩游戏用况的活动图描述如图4.2所示。图4.2 玩家玩游戏用况的活动图4.2 玩家角色的有限状态机本文设计的游戏中,玩家所控制的角色行为可以用有限状态机来实现。玩家角色的状态可以分为空闲,移动,攻击,跳跃,防御,闪避,使用道具,硬直,死亡[11]。玩家开始游戏后进入空闲状态,除了硬直和死亡状态,其他状态通过玩家的按键输入来控制转换,空闲状态可以转换到其他任何一个状态。移动状态与空闲状态一样可以转换到任意状态,但它与空闲状态不同的是其余状态只会回到空闲状态,而不是回到移动状态。为了游戏的合理性,在跳跃状态下允许转换到攻击状态,但是跳跃状态转换为攻击状态后就不能再转换回去,因为跳跃状态的动画时一个完整的动画,即从起跳到下落,攻击完毕后在重新播放完整的跳跃动画明显是不合理的。为了解决这个问题,在之后的实现中又添加了下落状态,在此先不做详细说明,此处跳跃和下落合并为跳跃状态。硬直状态和死亡状态不受玩家控制,而是与游戏中的敌人有关。当玩家受到敌人攻击或防御时精力降为0时进入硬直状态,玩家的输入无效。进入硬直状态后经过一段时间状态恢复,回到空闲状态。当玩家的生命值降为0时,进入死亡状态,玩家无法在控制角色,选择重新开始或退出游戏。具体状态机图如图4.3所示。图4.3 玩家角色的状态机图4.3 内置场景的有限状态机敌人的状态转换用有限状态机来实现是非常合适的。敌人的状态可以分为空闲、移动、攻击、防御、闪避、硬直、死亡。其中空闲、移动、攻击和死亡为所有敌人共有的状态,而防御、闪避和硬直为一些敌人所特有的状态。敌人的状态转换条件与玩家角色不同,敌人没有输入指令来作为条件,所以主要采用计时器和与玩家角色的互动为判断条件[12]。状态中空闲为基本状态,所有状态的次态都是空闲状态。移动、攻击、防御、闪避为主动状态,以时间为条件,满足条件后就从空闲状态变迁至其中之一,状态间不能相互变迁。硬直和死亡为被动状态,有玩家角色的攻击为条件,当敌人的精力降为0,则进入硬直状态,直到经过一定时间才变迁为空闲状态,当敌人的生命值降为0,则进入死亡状态,怪物进行死亡动作,播放死亡动画,经过一定时间后消失。敌人的类型又可以分为两种,一种为普通敌人,一种为boss。普通敌人拥有两种行为模式,巡逻模式和战斗模式,即未发现玩家情况下的状态和发现玩家情况下的状态,而boss因为其必然性,所以boss只有战斗模式。普通敌人在巡逻模式下,只有空闲和移动两种状态,在发现玩家后,切换至战斗模式,所有该敌人拥有的状态全部启用。普通敌人的详细状态机图如图4.4所示。图4.4 普通敌人的状态机图boss的详细状态机图如图4.5所示。图4.5 boss的状态机图5 游戏的实现5.1 有限状态机的实现本项目中的角色控制器、AI控制器和菜单控制都是使用有限状态机的思想来实现的。在平时的编程中使用的if-else和switch判断其实已经搭上了有限状态机的边,甚至简单的有限状态机就可以使用这样的方式来实现。但是使用这种方式编程会带来很多麻烦,当我们要添加或修改一个状态时,我们不得不加入更多的判断语句,当状态稍多时,我们就很难找到自己想要修改的关键点,更可怕的是当我们修改某些状态时,不得不把大部分代码全部推翻重来,所以这样的编程方式是不可取的。本项目依据面向对象思想,参考各种设计模式,力求达到开闭原则的对增加开放,对修改关闭,在添加状态时,不用修改其他状态,可以直接添加。具体实现情况如图5.1所示。图5.1 有限状态机类图本项目定义了状态类FSMState,状态装换类FSMTranslation,以及有限状态机类FSM。状态类FSMState用于表示状态对象,记录状态名和状态在开始、进行中和结束时的事件函数,该类还定义了字典,用来保存每个状态对象的状态转换。状态转换类FSMTranslation用于表示状态对象的状态转换,用该类中的成员变量name来表示状态类之间的转换,从fromState转换到toState。有限状态机类FSM用来存储所有的状态对象以及他们的状态转换,一个FSM对象就代表了一个角色对象的有限状态机。FSM类为FSMState类提供了事件函数的委托和事件函数的回调函数,通过字典保存一个角色对象所有的状态,同时还提供了状态装换的方法。新状态的增加,可以通过AddState和AddTranslation方法,将新状态和新状态对应的状态转换直接添加进来,不用修改其他状态。5.2 玩家角色控制器的实现玩家角色的状态转换通过有限状态机来实现,在有限状态机类FSM和状态类FSMState中并没有实现状态进入、进行中和结束时的具体功能,因为每个状态的动作是不同的,基于设计模式中的依赖倒置原则,面向接口编程的思想,本项目使用一个接口StateHandler来实现每个状态的动作。使用接口的另一个原因是本项目使用的是unity3D游戏引擎,C#编程语言,要使用unity中带有个各种功能组件需要继承MonoBehaviour,而C#并不支持多继承,角色控制器需要有一个基类继承MonoBehaviour,所有StateHandler接口的实现类都继承该类,这样就能保证各个状态的动作确实落实到游戏中的角色上。具体实现如图5.2所示。图5.2 玩家角色控制器类图玩家状态类所指的并不是一个类,而是指代玩家所有的状态。playerState类继承MonoBehaviour类,定义了动画组件的成员变量,因此在玩家状态类中可以直接控制角色的动画,即控制角色做出各种动作。playerState中还定义了玩家角色的有限状态机player_fsm,状态的定义和添加,以及各个状态的状态转换定义和添加在其子类playerController中完成,playerController类负责接收玩家从键盘输入的信息,控制状态装换,并且实现了碰撞检测和触发事件检测函数,判断玩家角色是否被攻击,是否落在地上。以上是玩家角色的状态转换控制,但角色控制器还不完整,还缺少的是角色的基础属性,生命值攻击力等。这些基础属性在玩家属性类playerProperty中定义。由于玩家角色在游戏中是唯一存在,同时他的属性应该是能够全局访问的,因此使用设计模式中的单例模式来实现玩家角色的基础属性。playerProperty类定义了玩家的基础属性值,生命力、攻击力、防御力和精力,由于装备系统会将效果直接作用到基础属性上,因此这些基础属性设为公有变量。玩家的具体属性通过基础属性和装备加成计算获得。玩家属性的类图如图5.3所示。图5.3 玩家属性类图5.3 攻击对象控制器的实现敌人的控制器与玩家角色控制器一样,状态转换都通过有限状态机来实现,与玩家不同的是敌人是可以重复出现的,甚至连boss都可以是重复出现的,所以敌人的属性不是唯一的,不能使用单例模式,每一个敌人对象都拥有他自己的属性。因此敌人属性通过敌人属性类EnemyProperty定义,该类不是单例的,每个敌人对象都可以初始化他自己的属性值。另外,由于敌人不需要升级系统,也没有装备系统,因此敌人的属性并不需要通过计算获得,直接在初始化时设置对应的具体属性值。敌人控制器的类图如图5.3所示。图5.4 敌人控制器类图5.4 菜单功能的实现游戏中的菜单也可以被看作是一种状态,菜单的开关和切换也是一种状态转换,因此菜单也可以用有限状态机来实现。菜单不用有限状态机也是能够实现的,并且因为本项目的菜单数量并不多也不算十分复杂,因此可以不使用有限状态机。但是考虑到对项目的修改和编程逻辑性的问题,使用有限状态机明显是优于不使用的。具体类图如图5.5所示。图5.5 菜单控制器类图5.5 道具装备系统的实现在本项目中,道具装备也是最重要的部分之一。道具和装备的使用也可以被分解为开始使用、使用中和结束使用三个动作,因此道具功能也可以通过实现接口StateHandler的方法来实现。由于道具库应是唯一存在的,所有道具都应该是唯一的(数量可以不为一),所以道具库类可以使用单例模式,使用单例的另一个好处是可以在任何地方添加新道具到道具库中。道具系统的类图如图5.6所示。图5.6 道具系统类图由于游戏中规定了玩家只能装备三件装备,携带三种药品,因此需要一个使用中的道具类来记录下当前使用中的道具,该类的另一个作用是实现装备栏的合理性,比如当玩家在不同的装备栏装备同一件装备时,装备应该被放置到后一个的位置,前一次的装备栏会清空。利用使用中道具类,可以人为规定使用中的装备所占的是哪个格子。本项目所设计的使用中道具类使用字典来存放对应格子的道具。具体类图如图5.7所示。图5.7 使用中道具类图6 总结与展望6.1 总结本文首先对国内外游戏现状进行了分析,从诸多成功的游戏中寻找他们成功的关键点,从而得出了动作角色扮演游戏所需要的元素。论文接着对游戏进行需求分析,建立起了基础的功能框架。基于面向对象编程思想,以及对设计模式的深入研究,对框架进行了进一步的完善。本文接着对角色的状态进行了深入的分析,并且根据有限状态机思想设计实现了符合设计模式的有限状态机类,使用该类可以方便的对状态进行添加而不用修改其他状态。通过将一般实现菜单的逻辑结构与有限状态机实现的菜单的逻辑结构作比较,发现使用有限状态机实现的菜单逻辑结构更清晰,更便于添加和修改,最后采用了后者的方法。然后论文对角色属性进行了分析,通过单例实现了玩家角色的属性,并用AI属性类来保存AI属性。针对游戏中的道具装备系统,本文设计实现了道具库类,该类采用单例模式,用于所有道具的添加和保存。论文最后将所有功能整合测试,得到了较好的效果,达到了预期。本文的主要难点在于(1)游戏框架的搭建。(2)有限状态机和设计模式的结合,实现对状态的任意添加。(3)UI界面的搭建,以及UI功能的实现。(4)道具装备系统的实现,实现合理的装备穿戴和替换效果。6.2 展望由于时间和精力有限,另外受个人能力所限,本项目还有可以进一步改进的地方(1)角色动作还有待提升。作为一个ARPG,动作是很重要的一环,但由于素材的限制,以及编程能力的限制,角色动作显得生硬,不够流畅。每个动作的衔接处数值应该设置更精确,另外还能加入更多的动作,然操作体验更好。(2)AI简单,可以加入更多指令,使AI更智能,从而提高游戏体验。(3)内容还能增加。由于时间原因,游戏的章节很短,并且游戏中角色数量较少,可用的道具也不多。需要更多的游戏内容来提高游戏时间。致谢参考文献[1]Will Goldstone.Unity Game Developemt Essentials[M].Packet Publishing,2009,10:32-48.[2]朱昊然.自由交互下RPG游戏的形象设计与体验研究[D].江西:江西师范大学,2015:1-47.[3]夏菲.策略性手机游戏设计与开发[D].扬州:扬州大学,2014:1-75.[4]马晨阳.基于coco2d-x引擎的ARPG类手机游戏的设计与实现[D].华南:华南理工大学,2015:1-65.[5]张地长.基于Cocos2d-x的战旗手游研发[D].南昌:南昌大学,2015:1-69.[6]李霞.MVC设计模式的原理与实现[D].吉林:吉林大学,2004:1-82.[7]张丽坤.设计模式在软件复用中的应用研究[D].大连:大连海事大学,2007:1-65.[8]石诚.“观察者模式框架”研究及其在量化投资中的应用[D].北京:首都经济贸易大学,2014:1-58.[9]谭同超.有限状态机及其应用[D].广州:华南理工大学,2013:1-59.[10]王异帆.基于Cocos2d-x游戏引擎的塔防类手机游戏框架设计与实现[D].武汉:华中师范大学,2015:1-94.[11] Mirko Suznjevic,Ivana Stupar,Maja Matijasevic.A model and software architecture for MMORPG traffic generation based on player behavior[J].?Multimedia Systems . 2013,19(3):231-253.[12]何赛.游戏人工智能关键技术研究与应用[D].导师李丽香.北京:北京邮电大学,2015:1-77.
目录
摘要 1
关键字 1
Abstract. 1
Keywords 1
1 绪论 1
1.1 研究背景及意义 1
1.2 国内外研究现状 2
1.3 研究内容与技术路线 3
1.3.1 研究内容 3
1.3.2 技术路线 3
2 开发平台简介 4
2.1 Unity3D的简介 4
2.2 Microsoft Visual Studio 4
3 模式设计 4
3.1 动作角色扮演游戏简介 4
3.2 设计需求分析 5
3.3 设计模式 6
3.3.1 设计模式原则 6
3.3.2 单例模式 7
3.3.3 观察者模式 7
3.3.4 有限状态机 7
3.4 游戏框架设计 7
3.4.1 客户端的功能框架 7
3.4.2 玩家角色的功能框架 8
3.4.3 内置场景功能框架 9
3.4.4 菜单的功能框架 9
4 角色活动分析 10
4.1 玩家活动的分析 10
4.2 玩家角色的有限状态机 12
4.3 内置场景的有限状态机 13
5 游戏的实现 15
5.1 有限状态机的实现 15
5.2 玩家角色控制器的实现 16
5.3 攻击对象控制器的实现 18
5.4 菜单功能的实现 19
5.5 道具装备系统的实现 20
6 总结与展望 22
6.1 总结 22
6.2 展望 22
致谢 23
参考文献 23
基于多角色场景的一种幻想模拟游戏
版权保护: 本文由 hbsrm.com编辑,转载请保留链接: www.hbsrm.com/jsj/jsjkxyjs/1784.html