UE4之Behavior Tree介绍
来源:互联网 发布:js修改div背景颜色 编辑:程序博客网 时间:2024/05/01 01:28
UE4中提供了很强大的可视化的Behavior Tree编辑器,再不用自己写一大堆状态机了,对游戏开发者来说乃一大福音,而且可以查看运行时状态,甚至可以看到当前执行那一条分支和条件判断结果,简直就是黑科技。
基本概念
先介绍一下BT中要使用的几个节点类型:
Composite:包括三种节点,定义了节点的执行规则,其中包括:
- Selector:从左到右依次执行子节点,直到有一个返回成功,则停止,返回父节点成功,否则返回失败,可以连接多个子节点。
- Sequence:从左到右依次执行子节点,直到有一个返回失败,则停止,返回父节点失败,否则返回成功,可以连接多个子节点。
- SimpleParallel:允许同时执行一个主任务和一颗子树,当Finish Mode设为Immediately时,主任务执行结束后中断子树,设为Delay时,主任务执行结束后等待子树执行结束。
Task:BT的叶节点,真正干活的。
Decorator:用来做条件判断,加在Composite节点上,决定是否执行该节点下的子树,或者加在Task上决定是否执行该Task。
Service:可以加在Composite节点上,当该节点及其子树被执行时,该Service按照指定时间间隔被重复调用,用来做一些状态检查或更新Blackboard。
Root:BT的起点,且每个BT只能有唯一的Root节点,只能连接一个子节点,不能添加Decorator和Service。
和BT协同工作的几个类:
AIController:和PlayerController的功能类似,用于电脑控制的Pawn,可以为BT提供一些方法封装,根据Pawn状态或周围环境做一些决定,每个Pawn实例都有自己的AIController实例。
Blackboard:用来存储BT所需的数据,在BT中的Service和Task或其他节点之间共享数据,或者用于其他类给BT共享数据。
Decorator
点击节点中的Decorator,可以在详细面板中看到一个ObserverAborts,当条件不满足时,可以中断当前执行的子树或任务。Abort Property有四个值可选:
- None,即不中断
- Self,会中断当前节点下的子树或任务
- LowerPriority,会中断比当前节点优先级低的兄弟节点下的子树或任务
- Both,就是Self和LowerPriority两种节点都会中断
编辑器中标记了相关节点的优先级,会受中断影响的节点还会变色。
对于设置了ObserverAborts的Decorator,引擎会不断检查其中的条件是否满足,即使是已经执行到下一个子树,也可能被之前的条件检查中断。如果没有设置ObserverAborts,则只有下一次从Service节点执行到该子树时才会检查Decorator条件。
引擎本身提供了一些常用的Decorator,如:
Blackboard:检查Blackboard上的某值是否赋值,或者做一些值的比较等
Loop:循环当前节点制定次数或无限循环
详情参见官方文档
Task
Task启动时,会收到EventReceiveExecute事件调用,作为执行Task的入口,Task执行完毕后需要手动调用FinishExecute,Task才算完成,否则BT会卡在当前Task,完成之前不会执行该Task之后的节点。比如,像移动到某位置的操作,需要等移动到目的地后,再调用Finished Execute,否则就会执行到后面的节点,扰乱或中断移动操作。FinishExecute有一个bool的返回值,Composite节点根据该返回值决定是否执行后续节点还是返回父节点。
Task可以被上文提到的Decorator中断,被中断时会收到EventReceiveAbort事件,可以做一些中断处理,比如停止移动等,然后手动调用FinishAbort。
引擎本身提供一些常用的Task,如:
MoveTo:让拥有CharacterMovement组件的Pawn根据NavMesh移动到Blackboard中指定的位置
PlaySound:播放声音
RunBehavior:执行其他的BehaviorTree
Wait:等待指定时间
WaitBlackboardTime:等待Blackboard中指定的时间
详情参见官方文档
创建节点
可以在Content Browser中右键,Miscellaneous分类中可以看到BehaviorTree和Blackboard。
创建Service、Decorator、Task等则选择BluePrint class,再选择相应的基类即可,也可以在BT的编辑器上方点击New XX的按钮。
Blackboard
Blackboard是BT中必不可少的功能,由于BT编辑器中不能直接给节点传入参数,或者获得节点运行结果,这些数据都需要通过Blackboard缓存起来,来完成节点与节点,节点与游戏逻辑之间的通讯。
选择Root节点时,可以在Details面板里选择Blackboard,可以在右上角的Blackboard按钮切换到Blackboard编辑器。
读写Blackboard有两种方法:
一种是在Service、Decorator、Task等节点蓝图中,添加Variable,类型选择BlackboardKeySelector,值通过BT编辑器传入,所以需要设置Editable设为True,这样就可以在BT编辑器的Details中看到,选择需要传入的BlackboardKey,就可以在蓝图中使用此Key读写Blackboard中的数据。
还有一种方法是获得BT所属的Actor,从中得到Blackboard组件,即可获得指定KeyName的值。一般情况下,使用AIController对应的Pawn,可以得到当前正在使用的Blackboard。
- UE4之Behavior Tree介绍
- Unity+Behavior Tree行为树 Behavior Designer TaskList介绍一
- Unity+Behavior Tree行为树 Behavior Designer TaskList介绍二
- Unity+Behavior Tree行为树 Behavior Designer TaskList介绍三
- Behavior Tree
- Unity+Behavior Tree行为树 Behavior Designer 行为树介绍(二)
- UE4 介绍
- 行为树(Behavior Tree)简介
- 行为树(Behavior Tree)
- C# Behavior Tree -- 行为树
- 行为树(Behavior Tree)
- 行为树(Behavior Tree)
- 一. Htmlayout之behavior
- Material之Behavior(1)
- Material之Behavior(2)
- CoordinatorLayout之Behavior使用
- CryEngine的Modular Behavior Tree简介
- 行为树(Behavior Tree)实践
- http://www.chengxuyuan.com/post/1838.html?ref=myread
- leetcode 20. Valid Parentheses
- linux下源码安装cmake
- SQL大数据量查询的优化
- leetcode 064. Minimum Path Sum
- UE4之Behavior Tree介绍
- Linux学习---shell编程(11-条件判断式)
- leetcode 334 ----字符串翻转
- Leetcode 37 Sudoku Solver 深搜基础题+位运算
- 对于汉诺塔递归的实现和步骤跟踪
- preempt_count
- Linux学习---shell编程(12-if语句)
- 通用的socket地址
- Unity ShaderLab学习总结