职场文秘网

首页 > 总结汇报 > 思想汇报 / 正文

《天启世界》游戏开发

2020-12-24 20:17:17

天启世界》游戏开发 摘要 游戏很多时候其实是一种文化载体,RPG游戏是最为常见的一种有思想文化的游戏类型。而卡牌游戏由于其奖励的不确定性也受到广大玩家的欢迎。

《天启世界》是用Unity3d游戏引擎开发出一款PC端3D卡牌RPG单机游戏,游戏的脚本是用Visual Studio 2010软件编写的C#代码,使用了Fungus插件实现游戏剧情和对话的开发,用Photoshop软件和Unity自带的UGUI实现界面开发,用Unity中的Navigation实现人工智能寻路和角色控制,最终实现了整个游戏的功能开发。

相对于一般的传统卡牌游戏,本游戏实现了3D效果,加入了RPG元素,在副本中主要用对话形式来推进剧情的发展,增强了游戏的目的性和代入感,对话选项会影响卡牌数的收集,增加了游戏的趣味性。游戏中的战斗采用3D自动战斗模式,战斗画面有着精良的画质和特效,比一般的2D放置式战斗卡牌游戏有更好的游戏体验。游戏整体操作流畅,剧情流程完善,音乐欢快悠扬,抽卡概率较高,卡牌画面表现力强,人物数据全场景同步。

关键词: Unity3D游戏引擎 PC游戏 卡牌 RPG ABSTRACT Games are often a cultural carrier, and RPG games are the most common type of game with ideological and cultural culture. And the card game is also welcomed by the majority of players due to the uncertainty of its reward. “Apocalypse World“ is a PC-side 3D card RPG stand-alone game developed with Unity3d game engine. The script of the game is C# code written with Visual Studio 2010 software. The Fungus plug-in is used to realize the development of game plots and dialogues. The software and Unity's own UGUI interface development, using the Unity navigation to achieve artificial intelligence pathfinding and role control, and ultimately achieve the entire game's functional development. Compared with the traditional traditional card game, the game realizes the 3D effect, and adds the RPG element. In the copy, the dialogue form is used to promote the development of the story, which enhances the purpose of the game and the sense of substitution. The dialogue option will affect the card. The collection of numbers increases the fun of the game. The battle in the game uses 3D automatic combat mode, the battle screen has excellent image quality and special effects, and has a better game experience than the general 2D placed combat card game. The overall operation of the game is smooth, the plot process is perfect, the music is cheerful and melodious, the probability of card is high, the card picture is strong, and the character data is synchronized. Keywords: Unity3D game engine, PC game, Card, RPG 目录 摘要 I 1 前言 1 1.1 开发前景和意义 1 1.2 开发内容 2 2 系统分析 3 2.1 需求分析 3 2.2 游戏特色 3 2.3 游戏背景 3 3 系统设计 5 3.1 功能设计 5 3.2 游戏界面设计 6 3.3 地图设计 11 3.4 关卡和NPC设计 12 3.5 卡牌设计 13 3.6 剧情对话设计 14 3.7 布阵系统设计 16 3.8 人工智能战斗设计 16 3.9 抽卡系统设计 17 3.10 数据同步设计 18 3.11 音乐和音效设计 18 4 游戏实现 19 4.1 游戏界面实现 19 4.2 关卡和NPC实现 23 4.3 剧情对话实现 24 4.4 布阵功能实现 26 4.5 人工智能战斗实现 26 4.6 抽卡系统实现 28 4.6 数据同步系统实现 30 4.8 音乐和音效实现 30 5 游戏测试与发布 31 5.1 游戏玩法及测试 31 5.2 游戏发布 32 6 结论 34 参考文献 36 致谢 37 《天启世界》游戏开发 2015级计算机科学与技术2班 凌鹏洲 1 前言 1.1 开发前景和意义 卡牌游戏是近年来比较热门的一种游戏类型,在市场上占得比重都比较大,但是卡牌游戏这个分类是比较笼统的,其中按表现形式主要就分为2D和3D。

传统的卡牌对战游戏,类似《我叫MT》,《炉石传说》等游戏,其画面表现形式就是2D,战斗方式是回合制,画面表现力不足。而类似《阴阳师》这样的3D卡牌对战游戏,战斗方式是3D自动战斗,因为其有动画模型,有技能动作和特效,使玩家有更好的游戏体验。所以卡牌游戏必定会朝着3D化发展。

RPG游戏的核心是扮演,在玩法上就是扮演一个或者多个角色在一个有规则的世界中行动完成某种活动的类型,一个优秀的RPG游戏肯定有一段丰富而且细腻的剧情,剧情是RPG游戏的灵魂,有了剧情玩家才会有更强烈的代入感,生动的剧情会让玩家感同身受,玩家会因为游戏剧情而产生情绪波动,感染力极强,这样的游戏才会赢得玩家发自内心的掌声。

纯粹的卡牌游戏,其游戏性全在于出牌的策略性和抽卡的不确定性,玩法过于单一,游戏元素太少。而RPG游戏一般都是与其他类型结合,将剧情以不同的形式展现给玩家,用剧情来推动游戏的进程,增强游戏的目的性。卡牌游戏结合RPG元素会让游戏的玩法更加的丰富,也让游戏有了血肉。

一般的卡牌游戏都是网络游戏,但是由于抽卡系统对于玩家的经济要求较高,所以平民玩家游戏体验并不好,而单机游戏不需要联网,随时可以玩,不需要大量的资金投入,所以更容易让大众玩家接受。

1.2 开发内容 本游戏采用Unity3D游戏开发引擎进行游戏的相关开发,游戏主要完成:
1.地图设计;
2.关卡设计;
3.游戏界面UI设计;
3. 卡牌设计;
4.NPC设计;
5.剧情设计;
6.人工智能战斗设计;
7.抽卡系统设计;
8. 背景音乐和音效设计;
9.数据同步设计。

2 系统分析 2.1 需求分析 《天启世界》游戏是一款PC端的卡牌单机游戏,是结合了RPG元素的剧情向游戏,游戏类型说明如表2.1所示。

表2.1游戏类型说明 游戏名称 《天启世界》 游戏类型 PC端单机卡牌RPG游戏 游戏主题 卡牌、RPG 操作方式 键盘鼠标操作 2.2 游戏特色 《天启世界》是一款3D卡牌RPG游戏,游戏角色以卡牌的形式呈现,玩家主要是通过副本剧情的进展获取战斗卡牌,这些卡牌会帮助玩家在副本中战斗使玩家可以顺利通关。另外一种形式的卡是在主城界面抽取获得,抽的卡会显示在主城界面的背包中,不会在副本中一起战斗,但是可以加成属性给副本中的玩家。游戏主要玩法就是副本剧情和抽卡。

2.3 游戏背景 2500年,在世界资源日益枯竭的情况下,政府联合虚拟联盟开发了虚拟世界以解决现实资源的不足,这个计划被命名为天启计划,所以这个虚拟世界也被称为“天启”,在这里人们将体验到第二人生。

“言”在现实世界中是一个孤儿,父母在他小时候抛弃他,一去不复返,年幼的他被人捡到送进了孤儿院,在孤儿院的言受尽欺负,经历了一段黑暗时光,直到一天一位叔叔来到孤儿院接走了他, 他获得了人生第一个朋友“菱”。而后言因为一些原因离家出走,在外面过上了艰苦的流浪生活,因为幼年的经历使得性格发生了变化,从此变得现实,只要是能活下去的他都能做,言很不甘心,为什么世界如此不公,这一切的根源都来自于当年抛弃他的父母。在这段黑暗的日子里逐渐学会了生存,体验了孤独,那段时光成为了他无法忘怀的回忆,带着“怨恨”这个理由一步步向前,以找到当年的真相为目的(借口),开启丰富的新生活。后来言收到了一封神秘人寄来的信(想寻得当年的真相吗?“天启”将会为你揭开一切)和一个包裹(虚拟舱,可长时间维持生命状态,让人长时间呆在“天启”中)。

在这个游戏中,玩家就将扮演这个天启世界中的程序生命体----言,为探寻当年父母在现实世界中抛弃他的真相而进入了天启世界。

在虚拟世界言重新遇到了菱,后面又遇到了一个叫“小少爷”的人,是一个现实地位很高的人,他不断给你制造麻烦,言在一个神秘人的帮助下牵制住了小少爷,这个神秘人就是给言那封信的人。之后又遇到剑圣,拜其为师,学习了战斗技巧之后,在师傅的帮助下拿到凶器“七封”,那是一把没刀鞘的长直黑刀。后来神秘人加入队伍跟着言一起行动,他们通过传送门来到了外域,神秘人也成功利用言来到了外域,言在那里遇到了霄凝,霄凝是天启世界的原住民,在这里得知天启世界将要封闭,这意味着所有人都将出不去,并且在这里会有真正的死亡。然后言在一个特殊区域发现了这个世界的中枢,言从中枢那里了解到自己只是被言父亲以中枢为蓝本创造出来的一道小程序,言知道这个消息后非常茫然,开始怀疑自己的存在,然而后来在听到霄凝的生活后又感受到他们从来不会觉得自己是程序,他们认为自己就是人,言恍然大悟,终于承认了自己的存在,只要自己现在“活着”就是真正的“活着”。言找回了自己的价值,决定阻止中枢关闭世界,借用天启世界给他的力量为这个世界与中枢对抗的人守住了最后一条通往现实世界的通道,然后言集结了所有虚拟世界的力量,包括菱,霄凝,剑圣等人的力量与中枢大战,最后中枢灭亡,世界崩溃,言因为是一道程序,所以无法走入通道,从此与其他人永隔。

3 系统设计 根据该游戏所提出的需求,将该游戏系统分为10个部分,分别是:
1. 游戏界面设计;
2. 地图设计;
3. 关卡和NPC设计;
4. 卡牌设计;
5. 剧情对话设计;
6. 布阵系统设计;
7. 人工智能战斗设计;
8. 抽卡系统设计;
9. 数据同步设计;
10.音乐和音效设计。

图3.1 游戏框架图 3.1 功能设计 游戏功能模块包括游戏开始模块、主城模块、副本模块和战斗模块。

游戏开始模块包括游戏开始,游戏说明,结束游戏,背景音乐;
主城模块包括玩家数据同步、副本选择、金钱动态显示、抽卡模块;
副本模块包括人物控制模块、关卡和NPC模块、剧情对话模块;
战斗模块包括玩家卡牌AI模块、敌人AI模块、加速/暂停模块、战后结算模块。

图3.2 功能模块图 3.2 游戏界面设计 玩家进入游戏后显示游戏开始界面,点击帮助显示游戏说明界面,点击开始进入游戏,显示主城界面。主城界面中,点击出征进入副本选择界面,点击招募进入抽卡界面,点击背包进入背包界面。副本选择界面中,点击关卡图标显示关卡信息界面,再次点击确认进入副本。副本界面中,点击武将显示武将信息,点击布阵显示布阵界面,与剧情NPC对话显示剧情对话界面,每次进入关卡战斗前显示敌人战斗力界面,再次点击确认进入战斗,副本通关后显示副本通关界面。战斗界面中,胜利或失败后显示战斗结算界面,点击返回副本。每次切换场景都会显示加载界面。

图3.3 游戏界面设计图 (1) 开始界面设计 界面有一个背景图,中间显示开始游戏,游戏说明,结束游戏三个按钮。

图3.4 开始界面设计图 (2) 说明界面设计 界面中间显示操作说明和背景说明,右上角显示关闭按钮。

图3.5 说明界面设计图 (3) 主城界面设计 界面右下方显示出征,背包两个按钮,左上方显示招募按钮,上方显示金币等资源信息,中间显示3D主城场景。

图3.6 主城界面设计图 (4) 抽卡界面设计 界面右下方显示当前金币和元宝数量,中间显示两副卡包,左边一副,右边一副,抽到卡牌后显示卡牌头像界面,点击头像隐藏,右上角显示关闭按钮。

. 图3.7 抽卡界面设计图 (5) 背包界面设计 界面显示抽到的武将卡头像,未抽到的位置显示空的头像框,鼠标移到头像位置显示卡牌加成的属性,右上方显示关闭按钮。

. 图3.8 背包界面设计图 (6) 副本选择界面设计 界面右上角显示返回按钮,中间显示大地图和两个场景图标,点击图标分别显示副本1和副本2的介绍,再次点击确认可以进入副本,副本2需要通关副本1才能进入。

图3.9 副本选择界面设计图 (7) 副本界面设计 界面右下角显示武将和布阵按钮,右上角显示返回按钮。

图3.10 副本界面设计图 (8) 武将界面设计 界面左边显示武将大图,右边动态显示玩家武将的属性和金币数等信息。

图3.11 武将界面设计图 (9) 布阵界面设计 界面中间显示四张战斗卡牌的立绘,第一张主角卡默认上阵,后面三张默认是空卡框,需要获得后显示。

图3.12 布阵界面设计图 (10) 战斗界面设计 界面下方显示上阵后的武将卡血量,界面中间显示战斗场景,右上方显示暂停按钮和加速按钮。战斗胜利后显示战斗结算界面,显示战斗胜利和人物升级信息,如果失败显示战斗失败界面,显示重新开始和返回副本按钮。

图3.13 战斗界面设计图 3.3 地图设计 第一个副本地图为森林场景,色彩较为鲜艳,Q版中国风。场景四周被高山围起,有条河流把地图分成两部分,只有一条木桥可以通过,地图中间有一些高山和亭子,右上角有一个传送阵为通关点,玩家从地图左上角开始副本。

图3.14 副本地图1实现 第二个副本地图是较为荒凉的草地场景,场景中有很多乱石,四周也是被高山围起,但是这个场景没有出口。

图3.15 副本地图2实现 3.4 关卡和NPC设计 关卡即游戏副本中的战斗场景,第一个副本有五场战斗,第二个副本只有一场最终BOSS的战斗。每场战斗都有独立的场景,第一关是平地,第二关是塔楼下,第三关是木桥上,第四关也是木桥但场景色调偏暗,突出必败的结局,第五关在森林中,最后一关在石洞里。游戏中玩家的金币和元宝收入都来自于副本奖励,副本奖励只能领取一次,不会因为再次战斗而发放。

表3.1 关卡设计 关卡编号 胜利条件 敌人 数量 血量 攻击 通关奖励 1 消灭敌人 枪兵 3 200 30 等级+1 2 消灭敌人 弓兵 3 100 40 等级+2 3 消灭敌人 “其他玩家” 4 500 50 等级+3 4 必败 小少爷 1 9999 9999 无 5 打掉70%血 剑圣 1 9999 20 等级+5 6 消灭敌人 中枢 1 5000 1000 等级+10 游戏中的战斗场景都是在副本中的NPC处进入,有些关卡是剧情NPC对话强制触发进入战斗,有些则是玩家主动点击副本NPC选择进入战斗。

图3.16 NPC设计图 图3.17 最终BOSS设计图 3.5 卡牌设计 卡牌分为战斗卡牌和属性加成卡,战斗卡牌即游戏中的角色,只能通过副本剧情获得,而属性加成卡只能通过抽卡系统获得。游戏中玩家除了主角言还可以拥有三张战斗卡牌,分别是菱(金卡),霄凝(紫卡),神秘人(金卡),其战斗力数据跟主角言一致。而属性加成卡就会根据卡牌品质有不同的属性加成。

表3.2 卡牌设计 卡牌编号 类型 品质 卡牌名 攻击(1级) 防御(1级) 生命(1级) 1 战斗 紫 言 90 20 190 2 战斗 金 菱 90 20 190 3 战斗 紫 霄凝 90 20 190 4 战斗 金 神秘人 90 20 190 5 加成 绿 血魂 10 5 20 6 加成 蓝 狩魂 20 10 40 7 加成 紫 幽泽 50 20 100 8 加成 紫 零 50 20 100 9 加成 金 天女 100 100 200 战斗卡牌参与战斗,有3D模型和对应的动画、特效设计。加成卡牌不参与战斗,所以没有对应3D模型,只会在主城背包中显示对应加成卡牌的头像。

图3.18 战斗卡牌设计图 3.6 剧情对话设计 在副本中,玩家会根据剧情触发各种各样的对话,每个角色都有对应的对话框和对话内容,其中玩家手上的四张卡和最终BOSS中枢在对话框左侧或者右侧还会有人物立绘显示,游戏剧情对话系统较为丰富。

剧情流程:进入天启前黑屏白字显示天启进入流程。刚进入天启,言就听到了“声音”的指引,然后言自言自语了一段话,接下来遇到菱,对话后菱加入,过桥遇到小少爷,对话后触发第一次战斗,战斗成功再次跟小少爷对话,小少爷会问你是否放弃抵抗(这个选择关系到后面神秘人是否加入),在这里无论选什么都进入战斗,战斗是必败的,失败后触发黑暗空间剧情,醒来后继续跟小少爷对话。对话后往北走遇到剑圣开启新对话,进入战斗,将血打到一定程度就可胜利,再次跟剑圣对话便可通关第一个副本。副本1左下角有神秘人,如果在小少爷剧情中选择正确的话,他会跟玩家对话然后加入,否则不会对话。

第二个副本直接跟霄凝对话,然后霄凝加入,再跟中枢对话进入战斗,战斗胜利后游戏结束。

图3.19 剧情对话系统流程图 3.7 布阵系统设计 布阵界面显示目前上阵的战斗卡牌,言是默认显示为上阵的,其他三张卡需要剧情加入,默认显示为空的卡框按钮。当没有获得武将卡时,即武将卡数量小于2时,则卡框按钮无效,当玩家获得任意一张武将卡时,卡框按钮激活,玩家可以点击任意空卡框显示卡牌选择界面,这里会有卡牌的介绍,拖动界面选择获得的卡牌上阵,没有获得的卡牌点击后不会上阵。只有上阵后战斗卡牌才会在副本的战斗场景中上场战斗。

图3.20 布阵系统流程图 3.8 人工智能战斗设计 玩家在进入副本后自动开始人工智能战斗,我方角色和敌方会自动寻找最近的目标攻击,并且播放攻击动画,产生攻击特效,目标扣血。

图3.21 人工智能战斗流程图 3.9 抽卡系统设计 在主城点击招募可进入抽卡界面, 有标准包和兵魂包,标准包消耗金币,兵魂包消耗元宝。

标准包绿卡的概率是50%,蓝卡的概率是20%,紫卡的概率是20%,金卡的概率是1%,还有9%概率什么都抽不到。兵魂包绿卡的概率是30%,蓝卡的概率是40%,紫卡的概率是20%,金卡的概率是10%。

图3.22 抽卡系统流程图 3.10 数据同步设计 游戏中的所有卡牌数据,资源数据和玩家属性数据都需要根据抽卡奖励和副本奖励同步刷新,玩家战斗结束后在副本中的位置也需要同步更新到进入战斗场景前所在的副本位置。

3.11 音乐和音效设计 游戏音乐以中国风音乐为主,使用了网上一些三国类和秦时明月这样的国风卡牌类游戏的bgm,音效方面有攻击击中目标的音效。

表3.3 游戏背景音乐 背景音乐编号 音乐场景 音乐名--音乐来源 1 开始场景 游戏bgm--QQ三国 2 主城场景 主城bgm--秦时明月手游 3 副本1场景 新浔莲—QQ三国 4 副本2场景 战云--三国策 5 副本1战斗场景 战斗bgm—QQ三国 6 副本2战斗场景 英雄—三国策 4 游戏实现 4.1 游戏界面实现 开始界面显示三个按钮,点击帮助进入帮助界面,点击开始游戏进入游戏。

图4.1 开始界面实现 在说明界面中,显示游戏说明和背景介绍。

图4.2 说明界面实现 在主城界面中,显示资源信息以及招募,背包,出征三个按钮。

图4.3 主城界面实现 在抽卡界面中显示两个卡包和资源信息。

图4.4 招募界面实现 在背包界面中显示当前招募到的加成卡牌。

图4.5 背包界面实现 副本选择界面中,点击右上角返回按钮返回主城界面,选择副本点击弹出副本的介绍信息。在副本信息界面中,点返回或者关闭都是关闭副本介绍信息界面,点确认进入副本。

图4.6 副本选择界面实现 副本界面中,界面右下角显示武将和布阵按钮,右上角显示返回按钮,点击会返回副本选择界面。

图4.7 副本界面实现 武将界面显示目前玩家同步更新的数据信息。

图4.8 武将界面实现 布阵界面显示当前上阵武将状态。

图4.9 布阵界面实现 战斗界面中主要显示自动战斗的过程,会播放战斗动画和特效, 图4.10 战斗界面实现 4.2 关卡和NPC实现 在副本场景的敌人物体中加上射线检测脚本,将场景中的非剧情NPC保存为不同的标签物体,通过标签判断点击到的物体显示不同的战斗信息界面,在战斗信息界面写上切换场景脚本使玩家点击确定可以进入战斗场景。

在每个关卡的相机上挂载脚本用SceneManager.GetActiveScene().buildIndex来获取当前场景的ID。

在主城场景创建一个空物体,挂载不销毁自身的脚本,再写一个WinState脚本,用来控制关卡的胜利和失败状态。在Update()中获取敌人标签物体和Player标签物体,判断其中物体是否为空,如果敌人标签物体为空则进入失败界面,如果Player标签物体为空则进入胜利界面。通过标签获取到当前场景的ID,根据ID来实现不同关卡获取不同的奖励。

一开始关卡通关状态为false,当WinState脚本执行到关卡胜利的时候就将这一关的通关状态设为true传给PlayerManager单例数据保存类中,这样就实现了再次通关不会重复获得奖励的功能,但是胜利界面的显示代码需要写在通关状态判断前,场景ID状态判断后。这样重复战斗的时候会显示战斗胜利界面,但并没有实际奖励,只有第一次战斗才会有奖励。

战斗界面中的暂停和加速功能是通过调用Time.timeScale实现,当它等于0时游戏会暂停运行,等于1正常速度执行,等于2则两倍速执行,从而实现了游戏暂停和加速功能。

4.3 剧情对话实现 第一个剧情界面是黑屏白字的界面,通过计时器动态显示文本内容实现打字机效果。然后就是游戏中的剧情对话了,对话功能主要是依靠Fungus插件完成,首先通过插件创建Flowchart流程,再创建一个Character物体,通过其中的脚本来保存人物名和人物立绘,最后创建一个SayDialog用来作对话框,一个人物的对话框就出来了,以此类推创建出每个人物对应的对话框。在流程中创建Say对话,把对话文本写上去,对应创建的人物对话框就实现了对话功能。

除了跟菱的对话是通过按钮点击以外,其余的对话内容都是通过触发器触发,跟人物的对话还需要按下空格键。触发器触发对话无法用插件实现,需要用脚本控制触发状态,然后通过对话在流程中的名称来判断Flowchart中是否存在对话,如果存在就执行。

每次对话后都需要记录剧情进度状态,将状态更新到PlayerManager中,每次对话的触发都会根据当前的剧情进度状态来判断,这样玩家就必须按照剧情流程进行对话,而不能跳过某段剧情触发下一级剧情。

在与小少爷第二次的对话中会有选项,用Flowchart中的menu实现选项的显示和选择选项后不同的对话。在这个时候定 义一个bool变量Getsmr,当选择让剧情流程走向Fight时,Getsmr设为true并把该状态保存到PlayerManager中。在神秘人的触发对话脚本中通过PlayerManager读取这个bool值,如果为true才会触发对话,这样就实现了选项会对后续剧情造成不同影响的功能。

图4.11 剧情对话流程实现 图4.12 剧情对话实现 4.4 布阵功能实现 先在布阵界面中将卡牌和武将选择界面放在对应位置,然后隐藏后面三个卡牌和武将选择界面,创建ArrayPanel脚本获取PlayManager类中保存的武将卡牌数量,判断数量是否大于2,如果大于2就显示武将选择界面,否则点击无效。给武将选择界面的三张卡牌添加按钮监听,点击后判断PlayManager中武将获得状态,如果为true则将布阵界面中的对应卡牌物体显示出来,并记录武将上阵状态为true更新到PlayManager中,同时隐藏武将选择界面。在每个战斗界面摄像机上挂载的Create脚本的Start()方法中判断PlayManager中的武将上阵状态,如果为true则动态加载武将预制体,实现战斗卡牌上阵功能。

4.5 人工智能战斗实现 双方的战斗都是通过人工智能实现,但是目标设定不同,通过技能ID调用的技能和释放的动画特效不一样,造成的伤害和血量等参数也不一样。

寻找目标方法:先寻找目标对象,通过球形范围触发器获取到在Enemy层的对象物体,通过foreach循环找到所有在该层上的物体身上的EnemySkill脚本,先用distance获取一个距离,保存到一个临时变量minDistance中,与下一个找到的目标距离比较,如果下一个找到的目标距离小于目前的minDistance,就将这个较近的目标物体unit保存到selectedUnit中,不断循环比较,直到找到最小距离的目标并返回selectedUnit目标脚本。

public EnemySkill FindTargetInradius() { float minDistance = -1; EnemySkill selectedUnit = null; //在OverlapSphere球形20米范围内寻找目标 Collider[] colliders = Physics.OverlapSphere(transform.position,20, 1 << LayerMask.NameToLayer(“Enemy“)); foreach (Collider c in colliders) { EnemySkill unit = c.gameObject.GetComponent<EnemySkill>(); //寻找目标获取他身上的EnemySkill if (unit == null) //判断是否有这个组件 { continue; } if (unit == this) //判断是否等于自己 { continue; } float distance = Vector3.Distance(transform.position, unit.transform.position);//获得距离 if (minDistance < 0) { minDistance = distance; selectedUnit = unit; } else { if (distance < minDistance) { minDistance = distance; selectedUnit = unit; } } } //获得最小距离minDistance return selectedUnit; //返回寻找到的最近目标 } 攻击动画:尝试攻击目标,如果与目标的距离大于设定的攻击距离,就传回一个移动状态为true,并且用寻路组件的SetDestination方法更新位置。如果目标在攻击距离范围内,就停止移动,调用PrepareAttack()方法通过两点的相对坐标,取x,z轴平面角度,然后旋转Y轴,朝向目标。最后通过IsIdleToUseSkill()方法判断当前动画状态是否在idle状态,如果该方法返回true则执行攻击动画。

//尝试攻击目标 public void TryAttack(out bool moveToTarget) { moveToTarget = false; if (m_Skill != null) { if (!m_Skill.CoolDown) //技能不在冷却中 { //计算自己与搜索到的目标的距离,如果距离大于攻击距离,就设移动状态为true if ((Vector3.Distance(transform.position, m_Target.transform.position)) >= m_Skill.AttackDist) { moveToTarget = true; return; } else { PrepareAttack();//准备攻击 } if (IsIdleToUseSkill) //是否正在Idle动画状态 { m_Animator.SetInteger(“SkillId“, m_Skill.SkillId);//播放攻击动画 } return; } } return; } 攻击特效和伤害:通过帧动画调用方法实现,找到人物攻击动画上的Events参数,在攻击动作打到目标上的某一帧动画上调用函数,生成特效,执行敌人扣血函数。

public void OnAttackEffect(int effectId){ GameObject effect = EffectManager.Instance.CreateEffect(effectId, gameObject.transform);//根据effectId生成特效 EffectData info = DataManager.s_EffectDataManager.GetData(effectId);//获取特效 m_Target.OnDamaged(PlayerManager.Instance.Atk); //敌人扣血 if (effect == null || info == null){ return; } } 4.6 抽卡系统实现 每次点击卡包扣相对应的金币数,并且通过Random.Range(1,100)得到一个1到100的随机数,在Update函数中通过Switch语句判断随机数,控制概率,获得不一样的卡牌显示,并且将该卡牌的获得状态传到PlayerManager玩家数据中,最后重置value值,跳出循环。

switch(value / 10){ case 1: case 2: case 3: case 4: case 5: Card1 = Draw.transform.Find(“Card1“).gameObject; Card1.SetActive(true); PlayerManager.Instance.CardId1 = true; value = 0; break; case 6: case 7: Card2 = Draw.transform.Find(“Card2“).gameObject; Card2.SetActive(true); PlayerManager.Instance.CardId2 = true; value = 0; break; case 8: Card3 = Draw.transform.Find(“Card3“).gameObject; Card3.SetActive(true); PlayerManager.Instance.CardId3 = true; value = 0; break; case 9: Card4 = Draw.transform.Find(“Card4“).gameObject; Card4.SetActive(true); PlayerManager.Instance.CardId4 = true; value = 0; break; case 10: jinCard = Draw.transform.Find(“jinguang“).gameObject; jinCard.SetActive(true); value = 0; break; } 在背包中调用PlayerManager中的卡牌获得状态,如果为true,则在背包相应位置显示该卡片。如果为false则不显示。

4.6 数据同步系统实现 在主城界面通过空物体写一个不删除该物体的脚本用来处理全局控制:通过DontDestroyOnLoad()方法可以使物体不被删除,让物体可以在切换场景时不会销毁。

在主城中用一个空物体挂载PlayerManager脚本用来控制全局的玩家数据信息,该脚本需要使用单例模式,这样就保证了数据的共通性和唯一性。

主城再用一个不销毁的PlayerData脚本设定玩家所有信息的初始值,实现数据初始化。并在脚本中获取玩家上次进入副本关卡的位置,将它保存到PlayerManager中,在玩家回到副本的时候将更新过的PlayerManager中保存的位置赋值给副本场景的Player移动控制类中,这样就实现了副本位置保存功能。玩家的卡牌获得状态,卡牌上阵状态,通关状态,位置信息,属性信息,剧情进度等都统一放在这个管理类中,每当玩家状态和信息改变时就将数据更新到PlayerManager中,PlayerManager是游戏中的核心,控制了游戏的所有数据状态,实现了全局数据同步的功能。

4.8 音乐和音效实现 在每个场景的摄像机脚本中添加Audio Source组件,拖入不同的音乐实现不同场景的音乐切换,用帧动画方法实现游戏中的战斗音效。开始音乐和主城音乐比较悠扬,副本1音乐欢快,战斗场景音乐激昂,副本2因为是BOSS关卡所以比较大气,整体风格都是中国风音乐。

5 游戏测试与发布 本游戏设置的画面分辨率为1920*1080,在Unity中可以正常运行,测试本游戏的软硬件配置如下表。

表5.1 测试用机硬件配置表 硬件类别 名称 CPU I5-5200U 型号 华硕A55L 内存 8G 硬盘 500G 表5.2 测试用机软件配置表 软件类别 名称 系统 WIN 10家庭中文版 5.1 游戏玩法及测试 本游戏主要玩法是剧情和卡牌。

游戏副本的进度全靠剧情推动,剧情是RPG游戏的灵魂,本游戏采用类似文字冒险游戏的对话形式展开剧情,使剧情更加细腻,本游戏还有对话选项功能,玩家的不同选择会对未来的剧情造成不同影响,这样更容易使玩家代入其中。

卡牌是游戏的战斗单位,游戏中的角色数值也都设定为卡牌数值,通过副本收集战斗卡牌,通过招募收集加成卡牌。卡牌能够显著增加玩家的战斗力这是数值上的体验,其次卡牌的美观能够让玩家喜欢这是感官上的体验,这就是卡牌游戏的主要魅力,抽到高质量的卡牌会有成就感和满足感。由于是单机游戏,抽卡概率也较高,对于平民玩家来说可以享受到网络游戏抽卡得不到的快乐。

测试:找出了很多bug并且都已成功修复。游戏设计中的测试用例如下表。

表5.2 游戏测试用例表 用例 DEBUG 原因 修改后测试结果 用例1 相机镜头有时会发生剧烈抖动 场景中的动态云层会撞到相机,使相机判断有物体挡住视线,所以会不断进行调整 Pass 用例2 重复进入关卡战斗场景,战斗胜利后不会弹出战斗胜利界面 战斗胜利界面的显示代码被包括在了通关状态为true的if语句中 Pass 用例3 第一次进入副本时不点击武将按钮直接战斗会阵亡 把角色数据初始化写到了武将按钮点击中 Pass 用例4 战斗界面出来后人物不会回到进入战斗前的位置 因为场景切换导致人物回到副本依然在一开始的位置 Pass 用例5 对话选项并没有影响后面剧情对话的触发 点击选项战斗结束后在Fungus中保存的变量会因为场景切换导致数据丢失 Pass 用例6 与小少爷战斗的场景中点击屏幕按钮无效 场景没有加UI点击事件监听Event System Pass 用例7 第二个副本中BOSS触发器无法触发的问题 BOSS没有添加刚体组件 Pass 用例8 关闭招募或背包界面后无法再次显示主城场景 只将获取场景ID的代码写到了战斗场景中 Pass 用例9 进入与剑圣的战斗界面直接显示游戏胜利,胜利后奖励一直在增加 将判断语句写到了Update中 Pass 5.2 游戏发布 在Unity3D引擎中点击左上角File-Building Setting,将所有的场景都放到Scenes In Build中,然后选择PC,MAC图标,最后点击下方Build将游戏导成exe可执行文件。

图5.1 游戏生成设置图 6 结论 本设计是通过在学校学到的编程和游戏开发知识,结合网上的很多教程和素材实现出来的一款3D卡牌RPG游戏。游戏的主要乐趣就是剧情探索和卡牌获取,相比一些纯粹的卡牌对战游戏,有了剧情的加入,使得游戏作品有了血肉,让游戏玩家代入其中。而卡牌则是让玩家有抽卡的乐趣。

一开始设计这个游戏的时候只是想着做RPG,因为我在听了初中同学想写的小说设定后,就被深深吸引住了,一直在想究竟生命的意义是什么,怎样的生活就算是生命,我得到的答案就是思想就是生命。无论是人造人也好,虚拟人物也好,当他们有思想,有自己的行动的时候,他们就已经被赋予了生命,他们生活的世界也许很小,他们不知道 自己是不是按着安排好的命运在行动,但是自己认为感受到的生活是真实的,那他们在这个世界就是真实存在的。我们也是一样,我们不知道未来会发生什么,也不知道天外是否有天,因为我们的局限性所以不知道这些东西,但是最后我们都觉得这是没有意义的,因为我们现在的生活就已经足够真实了,活在当下就是这个意思。所以我就将剧情融入了《天启世界》这个游戏作品,本来没打算做卡牌类游戏的,后来我在市面上接触到了这类游戏,发现卡牌游戏仍然是很热门的,抽卡能够挑起玩家的欲望,通过收集不一样的卡牌来增加成就感也是一件很有趣的事情。所以最后我的游戏就定型了,这是最重要的,一个游戏的开发过程都是从策划开始,再到美工素材,最后才是程序开发。

在确定类型后我就正式开始找素材,做界面的开发,游戏的界面UI是非常多的,因为涉及的场景和按钮很多,所以需要大量的跳转和UI的显示隐藏,顺序和调用关系很重要。另外,这类游戏对数值的要求也很高,数据必须一一对应才会让玩家感觉到卡牌的作用。剧情上的流程也是很繁琐的,必须按着流程对话,否则不会触发。所以游戏在实现上必须逻辑清晰,谨小慎微。制作过程虽然枯燥,但是看到自己做的游戏功能一步步实现后非常的有成就感,从界面的跳转到人物的移动、战斗、数值变动,再到卡牌的增加,布阵的实现,剧情对话的实现,选项的影响,抽卡的设计,充值的体验,音乐的添加等流程下来发现越做越有趣,做的过程就是一个享受游戏的过程。

最后到整个游戏的开发完成,游戏的基本功能已经完善,游戏的数据虽然都是临时的,但是如果在这个基础上接上服务器,就可以实现网络游戏的开发,一个客户端游戏开发工程师所要做的就是将游戏的功能和玩法实现,所以本游戏还是有点遗憾的,有了一个网络游戏的雏形,但没有做成一个网络游戏。通过这次的毕业设计,我看到自己的想法变成了自己做成的游戏,非常的开心,加强了自身的游戏制作技术,得到了很多的锻炼和成长。

参考文献 [1] 刘国柱. Unity3D/2D游戏开发从0到1(第二版),北京:电子工业出版社,2018。

[2] 宣雨松.Unity 3D游戏开发,北京:人民邮电出版社,2012。

[3] 张帆. Unity 2017经典游戏开发教程 算法分析与实现,北京: 人民邮电出版社,2018。

[4] 万书帆. Unity游戏开发实用教程,北京: 海洋出版社,2015。

[5] 陈嘉栋.Unity 3D脚本编程,北京:电子工业出版社,2016。

[6] (美)Jeremy Gibson(杰里米.吉布森),游戏设计、原型与开发:基于Unity与C#从构思到实现,北京:电子工业出版社, 2017。

致谢 大学时光匆匆而过,我也来到了毕业的时间点上,这次的毕业设计得到了很多的帮助。

首先谢谢王强强老师对我的悉心指导,从选题到最后的毕设答辩,老师一直在提供意见,引导我方向。还要感谢我游戏方向的教学老师,谢谢老师将我从一个对游戏一窍不通的孩子培养成了如今可以独立完成一个游戏开发的学生。在学习过程中,如果没有老师的引导和帮助,自己可能没有动力往这个方向去努力,所以人生需要一个目标,而在大学中,由于生活的多样化,这个目标变得非常的模糊,很多时候自己都不知道自己需要的是什么。所以这种时候就需要有人指引,让自己可以为之奋斗,让自己在奋斗中获得成就感,很显然,开发游戏让我感受到了很多乐趣,这都得益于我的导师。

然后感谢我的同学和朋友,如果没有朋友的小说设定给我的灵感,我可能就想不出剧情。当我的开发进度卡住的时候,有了同学的帮忙,让我一直解决不了的bug得到顺利解决,这让我省下了大量的调试时间。我们之间互相帮助,互相交换游戏开发心得,共同进步,这使得我的开发过程不再枯燥,我也有了更大的兴趣和动力。

最后,我在此对大学帮助过我的人表示衷心的感谢。

Tags: 天启   游戏开发   世界  

搜索
网站分类
标签列表