行为树与状态机在游戏NPC行为设计中的应用Word文件下载.docx
《行为树与状态机在游戏NPC行为设计中的应用Word文件下载.docx》由会员分享,可在线阅读,更多相关《行为树与状态机在游戏NPC行为设计中的应用Word文件下载.docx(24页珍藏版)》请在冰豆网上搜索。
1.2研究意义
通过研究怪物的智能攻击与躲避,更深层的了解到游戏中关于怪物的智能攻击。
随着科技技术的发展,作为计算机科学的一个分支,人工智能渗透到了各个领域,像图像识别技术,智能机器人,语言翻译器等等。
在游戏中,人工智能技术能够使虚拟世界变得更加现实。
本文介绍使用Unity3D引擎开发一款Android平台的横板闯关教育游戏,以此来体现Unity3D开发游戏简便,同时展现教育游戏的魅力以及人工智能技术的强大。
第二章项目概述
2.1开发工具
2.1.1Unity3D简介
此次游戏开发主要是在Unity3D引擎上开发,它不仅仅是一款优秀的3D引擎开发软件,在2D上的表现也十分出众,它的优点有:
多平台发布,适用于C#、JavaScript、Boo等主流的脚本语言,编辑后立即运行,还能在运行过程中时实编辑,查看效果等等。
2.1.2VisualStudio简介
VisualStudio2013是由微软公司推出的开发环境,是目前最流行的Window平台
应用程序开发环境。
选择VisualStudio2013的原因是因为课程的关系对其有一定程度的熟悉,而且,MicrosoftVisualStudio2013开发环境不仅支持C#语言,对于C++、VB多种语言均能够支持,其目标代码适用于微软支持的所有平台,它的优点有:
灵活性、高效性、简易性
在此设计中利用其开发Unity游戏相关的C#脚本。
2.2.开发环境
开发环境主要是Windows10,此系统是能够使用VisualStudio的必要环境,加
上Unity3D也可以运行在此系统上,所以本游戏选择在此系统上进行开发。
第三章游戏程序设计
3.1游戏玩法介绍
本游戏设计的受众群体主要是初高中生,是一款教育类型的横版过关游戏,其核心玩法是通过按键控制主角亲嘴龙进行角色移动,通过闯关的方式拯救被科学家们藏匿起来的恐龙蛋,每次通关可以获得新的角色。
通关背景为实验室内,科学家会放射化学药剂,让角色受阻。
每一关关卡里面都设有解密门,通过解密门的方式来凸显游戏的教育意义,玩家九可以进入解密门进行解密游戏,通过博士日志去调配对付科学家发射的化学药剂,这样玩家就不用在冒险的过程中躲避手持化学武器的科学家,并且在游戏的过程中可以学习,巩固到一些化学知识。
3.2游戏功能介绍
3.2.1游戏功能结构
由于本游戏设计的最初立项是制作一款新颖的教育游戏,游戏特色是为了突出解密门关卡内的化学实验,因此没有揉入过多的其他系统,玩家通过初始角色进入关卡,通过设计障碍,触发解密门进行实验,获得道具增加战力攻击,最终打败BOSS获得新角色。
最主要的功能结构如下图所示:
图3-1游戏功能结构图
3.2.2游戏流程图
图3-2主要是用流程图说明了游戏的一个整体的流程,该图是对游戏整个玩法流程的详细介绍。
图3-
2游戏流程图
3.3游戏主菜单设计
游戏主菜单主要包含了道具选择、关卡选择、角色选择以及音乐设置四个功能。
UIManager作为游戏的界面管理类,负责管理道具面板、选择关卡面板、角色选择面板、设置面板等菜单下的UI的显示,通过UIManager激活关闭面板实现界面的切换,并实现面板之间的切换特效。
图3-3主菜单类图
下面分别从四个功能界面阐述:
1)角色选择
因为游戏通关会获得新的角色,玩家拥有多个角色后,可以自主选择所需角色,因此在主菜单界面加了角色选择的功能。
UICharacterRoulette组件脚本,负责管理角色选择轮盘。
包含轮盘自动转动,拖拽检测,拖拽状态下的旋转角度控制。
玩家可以滑动右下角的轮盘进行角色选择。
UICharacterBtn角色选择按钮脚本,包含角色sprite与角色介绍文字属性。
负责处理点击选择或取消的功能。
2)关卡选择
LevelManager关卡选择脚本。
包含关卡选择,关卡跳转功能。
3)道具选择
道具选择界面主要是为了展示主角在关卡解密门实验中获得的道具,在获得多个道具的情况下,玩家可以在主菜单的选择道具界面自主选择所需道具。
该界面主要包含道具的展示以及文字使用说明,在PropShow包含道具选择功能,切换道具图片与简介内容。
UIPropBtn负责管理道具选择按钮显示状态:
是否获取,是否选择。
4)设置面板
MusicController负责调节背景音乐与音效声音大小。
包含设置,播放,切换,停止bgm及播放音效等功能。
3.4游戏关卡设计
GameManager脚本中主要负责关卡及地图障碍的设计,在Awake函数中,对摄像机、主角、主角血条、Slider血条、关卡BGM的属性进行初始化。
作为横版闯关游戏,“D-Dragon”设计了PC端与移动端双平台的实现,而在PC端移动、跳跃、攻击按钮不能够很好地实现同时操作,因此设置了以按键代替按钮的方式进行游戏,在CloseHelp中识别windows平台显示help界面及包含help界面关闭功能,在界面中有按钮操作说明。
在GameManager中还涵盖了更新显示角色血条、伤害显示、关闭BOSS关卡提示
游戏的暂停、返回、重开以及战斗失败,战斗胜利的UI显示及功能的实现。
3.5游戏地图设计
1)玻璃棒障碍设计
GlassRod监听角色子弹碰撞事件,触发RigidbodyType2D.Dynamic破碎显示,使得玩家能够发射炮弹击碎玻璃棒从而进入高台。
2)碰触蜘蛛扣血
主角行径过程中会有部分障碍,其中,如果通过跳跃误触蜘蛛网,会对主角造成一定高伤害,设置蜘蛛预制体tag为spider角色碰撞,受到伤害。
3)蜘蛛网设计
主角需要通过攀爬蜘蛛网的方式进入高台,设置蜘蛛预制体tag为spiderweb角色碰撞它,关闭重力:
rigibody2d.gravityscale=0,减缓角色速度,达到攀爬的效果。
4)弹簧设计
Spring识别碰撞对象为player时,角色执行弹簧跳跃方法,进入高台。
5)毒气喷发
除了误触的伤害,游戏中还设置了毒气的周期性喷发,被毒气喷到后会对玩家造成一定伤害,Gas负责循环周期性喷射毒气:
激活关门毒气伤害碰撞体以及放毒气动画。
6)电梯设计
Lift包含监听识别角色tag,并在角色进入电梯的状态下,触发携带角色上升的功能,从而实现电梯的效果。
3.6解密门内设计
玩家通过触发显微镜进入解密门,解密门内的功能设计主要包含了道具的拖拽移动、定位以及实验结果的次数判断与成败判断。
Door负责管理门内场景实验功能,CheckBtnClick包含判定实验成败、判断实验次数、剩余次数。
OpenHelp自动显示实验帮助UI,让玩家阅读制作道具规则;
CloseHelp关闭帮助UI显示。
OnTriggerEnter2D负责控制进入,退出门内实验。
DoorItem控制实验道具的拖拽移动,位置重定,定位判断与设置功能。
DoorPos实体类,定义道具位置,包含门位置及道具标签属性。
3.7主角设计
主角Player通过状态机管理角色状态切换与表现
1)移动:
MoveLeft()MoveRight()方法通过改变
transform.rotation与
transform.Translate(driction)实现角色的左右移动
2)攻击:
BulletFactory管理生成攻击子弹
attack遍历子弹预制
bullet控制管理子弹的运动与触发伤害逻辑
3)跳跃:
Jumpup通过给刚体添加力实现rigi.velocity+=Vector2.up*jumpForce。
并播跳跃动画。
下落Falldown.播放下落动画。
除了主角的移动与跳跃,游戏中有关障碍物主角的状态切换也很重要,EnterSpiderWeb、ExitSpiderWeb进入退出蜘蛛网功能。
改变角色移动速度;
GetHurt执行受伤闪烁动画以及伤害值的显示;
Attack包含主角的技能攻击(普攻和化学试剂攻击之间的判断转换)。
3.8BOSS设计
Boss脚本控制boss状态与行为逻辑,BossRoom中,监控角色进入boss房间区域。
激活Boss进入战斗状态。
并调用“进入Boss房间”的UI提示。
通用方法GetHurt,hp为减伤害值。
当hp为0时,调用dead方法,播放Boss死亡动画,并且调用游戏GameManager胜利方法,此时通关成功,游戏结束。
StopMove停止移动。
BossWepon控制boss投掷品药剂的运动与触发逻辑。
判断触碰角色,触发角色受伤效果。
并执行自身效果方法。
BOSS状态如下:
1)idle:
进入设定idle持续事件。
时间到切换乘移动状态。
2)move:
AiMove根据角色方向与场景执行MoveLeftMoveRight进行向左或向右移动。
并播放移动动画。
3)jump:
Jump播放跳跃动画,并设置idletime为零。
执行JumpUp,boss刚体组件添加向上的力
:
rigi.velocity+=Vector2.up*jumpForce,实现BOSS的跳跃动作,用于躲避主角的攻击。
4)fall:
Fall播放下落动画并延迟执行IsJumpOver;
IsJumpOver播放idle动画并取消执行IsJumpOver。
5)attack:
Attack播放攻击动画并停止移动。
执行shoot方法。
AttackOver设定动画属性attck为fales。
并设定状态为idle。
第四章行为树与状态机的应用
4.1行为树
行为树(BehaviorTree),顾名思义,由根、分支、叶节点组成,具有不同特性的节点,由这些节点,便可以构成一颗树。
就以“D-Dragon”游戏中NPC的智能AI,我们可以大致描绘出以下行为树:
图4-1NPC行为树图
行为树(BehaviorTree)最早是由Dromey于2001年提出的对应在相关的系统应用程序的概念。
它以图形的形式展现了AI系统的结构,充分的描述了任务之间的转移。
行为树具有强大的建模能力,它可以将复杂的任务用简单的任务来构造创建,并且不用考虑其具体的执行过程。
通过查阅资料,我了解到,构成行为树的基础节点主要有以下四个:
1)顺序节点(Sequence):
按顺序执行子节点,只要顺序执行子节点返回false,则返回false,否则返回true,属于组合节点,该逻辑类似于程序逻辑中的“与”。
2)选择节点(Selector):
顺序执行子节点,只要碰到一个子节点返回true,则返回true,否则返回false,同顺序节点属于组合节点,该逻辑类似于程序逻辑中的“或”。
3)条件节点(Condition):
用游戏NPC状态中的常规攻击来举例,必须符合视野内发现目标以及目标是玩家的条件,才可以执行普通攻击,属于叶子节点。
4)执行节点(Action):
同条件节点,属于叶子节点,执行动作,一般返回值为true。
通过行为树的方式,我们能够很好地按照列出的节点不停的遍历,实现游戏的智能AI。
当然,我们必须明确前提条件,因为前提条件决定了改节点是否被行为树的遍历选择。
在我们游戏中,叶子结点是NPC的基础行为,记录NPC当前的状态,如NPC正在执行攻击或原地休息待机,而中间节点一旦被选择,则会使对应的基本行为被激活,如巡逻、召唤同伴及逃跑,而当行为节点如果执行失败的话,会导致中间节点去选择另外的行为节点。
由此可以看出,行为树具有严格的执行逻辑,因此行为树的绘制十分依赖于前提条件的逻辑正确性。
如果从编程实现的角度来看,可以为行为树总结一下优点:
灵活性:
行为树由许多节点构成,但这并不影响各个节点的修改与编辑,不需要改变复杂的连线,可以随意的添加删除节点,不必考虑状态切换的操作,具有强的的灵活性。
重用性:
行为树的节点编写好后可以反复的进行利用,由于分离了状态数据,可以随意改变逻辑,不影响节点的使用,因此,可以通过修改不同的逻辑内容来实现不同的AI而不需要改变节点的结构。
延展性:
行为树呈线性的方式延展,可以任意添加中间节点新增一种状态而不影响其他节点的遍历,易于延展。
清晰性:
对于简单的AI逻辑,我们能够很好的整理出状态之间的切换,而当我们面对复杂的智能AI实现的时候,我们并不能够快速的清晰地判断状态之间的关系,而行为树很好地为我们解决了这一问题,它不需要我们判断状态的切换,使我们的逻辑思维更加清晰。
4.2状态机
有限状态机(FiniteStateMachine),简称为状态机,是由多个状态构成的且状态之间相互转换的数学模型,状态机可以说基本存在于计算机的各个软件之中,而什么是状态机呢?
虽然这个名词看上去非常抽象,但在我们游戏编程中,许多地方都运用到了状态机,那么,我们怎么判断是否使用了状态机呢?
可以简单地理解为:
判断处理的对象是否需要处理2个事件以上的功能,例如:
判断游戏中的怪物NPC行为,他可以做到巡逻、攻击、召唤、躲避,因此,他就可以利用状态机进行程序编写,精确地描述对象的行为。
状态图(StateDiagram)用于描述状态机,状态图由状态与迁移构成,即为一个状态过渡到另一个状态的控制流,还是以游戏中怪物NPC为例,绘制了如图4-2的怪物NPC状态迁移图。
图4-2NPC状态迁移图
使用有限状态机编写智能AI可以说是人工智能编程的基本操作,即使在电子游戏产业迅猛发展的情况下智能体结构的不断普及,有限状态机仍然能够保持,这无疑归功于有限状态机的以下优点:
1)简快性:
状态间的关系能够直观的看到,易于调试。
2)编程快:
理清状态迁移图后,能够根据状态迁移图对智能AI进行快速的程序编写。
3)性能高:
与人类思维相似从而便于梳理,灵活且容易修改。
4.3怪物NPC的智能战斗
通过对行为树与状态机的相关知识的学习,我了解到了智能AI的实现并不像我想象之中那么遥不可及的。
因此,针对“D-Dragon”游戏开发,我将在科学家(NPC)上设计怪物的智能AI,通过对怪物之间的状态切换以及知识的研究,我将实现NPC的智能巡逻、休息、攻击、召唤同类、逃跑以及狂暴表现,由于地图及NPC属性的限制,NPC能表现的形态有所限制,因此我决定采用状态机来实现NPC的智能战斗:
召唤方法:
召唤呼唤距离内的科学家进入战斗状态,并将他们的战斗距离调大,直到进入攻击范围,讲战斗状态复原;
攻击方法:
遍历生成攻击药剂;
受伤方法:
监控判断碰撞触发角色子弹Tag攻击,执行受伤扣除伤害值血量,播放受伤动画;
死亡方法:
当血量低于零时,调用死亡方法。
播放死亡动画,并destory销毁自身;
转向方法:
移动过程走到场景平台尽头,或碰到障碍物执行转向;
当前状态
条件
状态转换
巡逻
发现目标(第一次)
普攻
发现目标(非第一次)
狂暴攻击
目标脱离范围
400<
血量<
500
召唤
400
逃跑
血量=0
死亡
附近NPC前往支援
脱离玩家视野
表4-1状态变更表
ScienceAI是科学家Ai脚本利用状态机框架实现状态切换与表现:
巡逻状态:
持续update:
判断角色是否进入攻击范围,若是进入战斗状态。
血量不满的情况下持续回血。
休息状态:
继承巡逻状态,与徘徊状态交互切换
1)进入状态事件:
随机一个状态时间值,修改角色动画为idle;
2)持续update:
判断时间值是否小于零,若是切换到徘徊状态。
徘徊状态:
继承巡逻状态,与休息状态交互切换
随机一个状态时间值,修改角色动画为run;
判断时间值是否小于零,若是切换到休息状态。
战斗状态:
角进入攻击范围,冷却事件内进行攻击。
普通战斗状态:
继承战斗状态
进入状态事件:
设置之角色攻击值为普通战斗状态攻击区间。
狂暴战斗状态:
设置之角色攻击值为狂暴战斗状态攻击区间。
帮忙状态:
中间过渡状态
判断周边是否有其他伙伴,若有执行召唤方法,进入巡逻状态。
逃跑状态:
进入状态事件,移动速度*2,持续update:
往角色相反方向逃离。
退出状态事件:
移动速度乘0.5.,逃跑过bool值为true。
第五章游戏测试与运行
5.1测试意义与目标
测试是任何游戏制作过程中必须进行的一项工作。
通过测试,可以发现游戏编程中的许多设计上不理想的地方,包括数值的设置,技能的体验情况,还有许多BUG的发现,都要通过后期的测试来修改、优化,同时,我们通过后期的测试,可以避免一些重大的问题,这些问题可能会影响玩家的用户体验,严重的可能会导致用户流失。
因此,对于游戏开发的后期,测试是很必要的一个阶段,我们需要通过对游戏的多方面测试,才能够使其更加完善,才能够达到游戏上线的标准,提高用户体验。
针对“D-Dragon”游戏项目开发,我将从以下方面对游戏进行测试:
1)测试游戏是否能够实现移动端与PC端的正常运行
2)测试游戏中的每个功能是否正常运行
3)游戏游戏数值的设置是否合理
4)NPC的状态切换是否正确合理
5)内存消耗是否合理
5.2.测试过程
5.2.1测试环境
测试平台:
Android平台、Windows平台
设备环境:
win10系统以及魅蓝Note3、小米8、OPPOR11、荣耀V20等
5.2.2测试主要内容以及结果
1)测试游戏是否能够实现移动端与PC端的正常运行,需要导出PC包以及安卓包在电脑端与手机端分别测试,主要看游戏是否能够正常运行。
测试结果:
导出的包均能在多个测试机上正常打开,运行。
2)测试游戏中的每个功能是否正常运行,主要通过检查主菜单物品、技能等管理类的读取是否正确,验证数据读取是否成功。
跑完整个游戏,发现制作道具成功后并没有增大主角的攻击值,通过后期的修改,解决了这一问题,并且增加了NPC的伤害值显示,可以更直观的看出制作道具前后伤害值的变化。
3)游戏游戏数值的设置是否合理,游戏前期设置的各项数值是在没有实践基础的情况下抽象设计的,需要后期的测试对数值进行调整。
通过体验导出的安卓包,发现前期主角设置的血量过低、狂暴状态的数值设定过高的情况,并对问题一一进行了调整。
4)NPC的状态切换是否正确合理,主要通过控制主角观察NPC的状态切换。
通过体验导出的安卓包,发现NPC攻击范围设置过短导致状态脱离、巡逻速度与攻击的移动速度没有做区分导致状态切换不明显的情况,并对问题一一进行了调整。
5)内存消耗是否合理,通过对FPS帧数检测以及CPU占用率,判断