下面用行为树创建一个简单的AI角色,没有玩家靠近时随机巡逻,当有玩家角色靠近时跑到玩家附近,模拟游戏中怪物攻击玩家的行为(没有实际的攻击动作),是官方示例的简化版,官方完整实例参考:
https://docs.unrealengine.com/zh-CN/Engine/ArtificialIntelligence/BehaviorTrees/BehaviorTreeQuickStart/index.html
1、创建第三人称模板蓝图工程
2、创建AI角色,选择第三人称角色骨骼和动画,命名为AICharacter
3、在内容浏览器中,右键创建BehaviorTree资源,命名为BT_AI,然后创建Blackboard资源,命名为BB_AI,用于存放行为树使用的变量
4、打开黑板BB_AI,创建三个变量NearToPlayer:bool(是否有玩家靠近),RandomLocation:Vector(随机走动位置)和Player:Object(靠近的玩家),Player的BaseClass选择Actor
5、打开行为树BT_AI,选中ROOT节点,将BlackboardAsset设置为BB_AI
6、从ROOT拖出引脚选择Selector创建一个选择器节点命名为AIRoot,作为AI角色执行行为的根节点
Selector、Sequence和SimpleParallel的详细说明见官方文档,简单地说Selector就像if-else if语句,从左往右执行一系列节点,有一个节点执行成功就不往下执行,而Sequence是在有节点执行失败时就不往下执行了。Selector、Sequence和SimpleParallel属于Composites,类似于编程中的流程控制语句,还有一类节点属于Tasks,是实际执行的动作。
7、通过拖动或右键从左到右分别添加下列节点,AttackPlayer为Sequence节点,在玩家靠近AI时,执行AI角色攻击玩家的行为,Patrol为Sequence节点,在没有玩家靠近时随机巡逻,Wait属于Tasks,在前面两个节点执行失败时等待指定的时间
8、在AttackPlayer上右键,移到AddDecorator菜单,选择Blackboard,添加黑板类的装饰器
9、选中装饰器,在右侧Blackboard Key属性选择NearToPlayer,这个装饰器就是一个条件语句,能判断NearToPlayer变量是否置为true,如果是就会执行该节点;Observer aborts选择both,即黑板键NearToPlayer改变时,中止本身和任何低优先级的任务,转而执行Patrol;Key Query选择Is Set,当NearToPlayer变为true时会执行该节点;最后改一下NodeName。
10、在AttackPlayer和Patrol节点下添加任务节点,当要攻击玩家的时候调用MoveTo移动到玩家的位置,MoveTo移动到一个黑板键的目标位置,这个MoveTo选择Player,Patrol下的MoveTo选择RandomLocation,Patrol下在添加一个Wait,到达一个巡逻位置后等待2到4秒的时间
11、上面的Patrol节点下MoveTo的目标位置并没有设置,我们要新建一个任务更新RandomLocation的值,点击NewTask按钮新建一个任务蓝图,保存为BTTask_FindLocation
12、在上面新建的任务蓝图中,选择重载RecevieExecuteAI事件
13、首先判断ControlledPawn是不是AICharacter,如果是就使用GetRandomReachablePointInRadius获取一个半径为500的范围内的随机位置,通过SetBlackboardAsVector设置给黑板中的RandomLocation,在Key引脚上右键选择提升为变量,新建一个黑板键类型的变量,命名为RandomLocationKey,并勾选Instance Editable属性(或者点击变量后的眼睛),使之能在行为树中修改,最后添加FinishExecute,勾选Success表示该任务执行成功,否则执行失败,如下图所示
14、在行为树中点击右键找到刚新建的任务,并添加
15、如下图所示,将RandomLocationKey设置为RandomLocation
16、到此为止,行为树的部分都完成了,但是上面NearToPlayer和Player变量都还没有更新,这两个值在控制器中完成,新建一个蓝图类,基类选择AIController,命名为Controller_AI,打开该蓝图,添加AIPerception组件
17、选中AIPerception组件设置SensesConfig属性,我们只要视觉感知,所以添加一个AI Sight config配置,调整视野范围Sight Radius和Lose Sight Radius,勾选DetectNeutrals,没有特殊设置应该都是中立生物,所以要勾选
18、添加OnTargetPerceptionUpdated事件处理函数
19、按下图连接蓝图节点,OnTargetPerceptionUpdated中判断感知的角色是不是ThirdPersonCharacter,如果是将NearToPlayer设置为true,并将Player设置为感知到的玩家,Blackboard能在AIController中直接获取,NearToplayer和Player变量为Text类型,分别是黑板中对应变量的名称。在OnPossess事件中调用RunBehavior Tree运行BT_AI行为树
20、上面创建的所有资源如下图所示
20、将AICharacter拖入关卡中,AIControllerClass选择Controller_AI
21、最后别忘了将NavMeshBoundsVolume体积拖入关卡,使其包围所有AICharacter可能行走的区域
一个简单的AI角色就完成了,当玩家靠近他时,他会朝玩家跑过去,远离他时他会自己在随机的位置来回跑。更完整的例子可以看官方文档。