C# Behavior Tree -- 行为树

(本博文可能比较老,如果发现插件运行不起来,那么可能是插件需要的U3D版,与你现在用着的不一兼容而导致)

在使用Unity 的插件中,官方提供的Assets Store中,提供了大量了资源下载,其中有一款,收费插件:Behavior Designer,这是收费的插件;

我让群友发了一份给我,这里不作商业应用;

Unity Behavior Designer 插件下载(点击)


不过这个插件,我在使用的时候,发现了一些问题:某个GameObject(MyPrefabObj)添加了BehaviorTree组件,添加自定义节点,该节并且公开部分字段;

在BehaviorDesigner视图的Inspector中设置了该节点的公开字段值之后,把这个GameObject(MyPrefabObj)设为预投之后;

然后使用代码:Instantiate方法实例该prefab(MyPrefabObj)后,发现,对应的BehaviorTree组件上对应的节点的公开字段值,又还原成未赋值状态;


Behavior Designer 的可视化编辑截图:



可以看到,左边的列表有好多种节点类类型;

粗略分为以下这几种:


  • 选择节点 : SelectorNode;
  • 顺序节点 : SequenceNode;
  • 条件节点 : ConditionNode;
  • 并行节点 : ParalleNode;
  • 等待节点 : WaitNode;
  • 开关节点 : ToggleNode;
  • 中继节点 : InterruptNode(看到这,是否有点想到了:就像是:电路板一样);

各节点特性:

  • 选择节点

在子节点中,找一个Success的,就不再往下执行;

for (child in children)
  if (child.update() == Success)
    return Success;
return Failure;


  • 顺序节点

与选择节点的条件上相反吧,就是中子节点中,找一个Failure的,就不再往下执行了;

除了以上这种特性,比较特殊的:要过了Conditions这关,再会处理Children;

onConditions():
for (condition in conditions)
  if (condition.excute() == Failure)
    return Failure;
return Success;

onChildren():
for (child in children)
  if (child.update() == Failure)
    return Failure;
return Success;

update:
result = onCondition();
if (result == Success)
  return onChildren();
return result;


  • 条件节点

也就是上面我们所说的顺序节点中的条件节点,具体的返回:Success/Failure的话,得依你自己的判断而定;


  • 并行节点

最简单的节点,就是内部所有子节点都会执行一次;不管子节点的返回值,最终都会返回Success;

等等,看你对自己的节点扩展,与分类的种类而定吧;


  • 等待节点

在指定时间后,就会运行指定nextNode节点;


  • 开关节点

对:中继节点.enable = !enable控制类;就是不断的开/关;


  • 中继节点

只有enable == true时,子节点才会继续执行,通常使用:WaitNode, ToggleNode来搭配使用;


上篇FSM的,感觉没啥人想了解;

这篇的BT(Behavior Tree)就不详细解说了,更何况,现在都是把一些空闲的时间挤出写来的;

从简单的DEMO中学习设计;是比较容易的;

如果从一个比较大的成品去研究,就比较麻烦了;


直接上代码,自己看去。

BehaviorTestingProject

BehaviorTestingProject_1.1(感谢:artist963 兄,只在原来基础上优化代码、结构,并放一些BT逻辑封装成类,方便阅读、理解)


这个DEMO中,是简单演示了,BOSS,寻找目标,靠近目标,自动攻击,与巡逻;

行为树结构大概是这样:



像上面的AttackTarget(ActionNode)中,我们完全可以再写成另一个嵌套的BT去处理;

总之,BT可以应用在,逻辑复杂度很高的系统都可以比较清晰的简单化;

如:上面的BOSS AI;

或是,任务系统中的自动跑任务;

他就有点像,我们生活中的一些处理事件的逻辑整理,然后按逻辑先后,有条不紊的执行;

猜你喜欢

转载自blog.csdn.net/linjf520/article/details/22280267