Unity--行为树

行为树插件百度网盘

链接:https://pan.baidu.com/s/1hshIZPUw4pwv7pg-HZ1cRA 
提取码:4r32 

行为树顾名思义就是一棵由行为组成的树,它可以应用到游戏中敌人或其它物体的AI上,

行为树的注意事项:

  1. 是从上到下,从左到右依次执行
  2. 每个任务都有一个返回值,running,success,fail(conditional任务没有running)
  3. 每个任务都是一个脚本

导入unity后就可以在工具栏中找到BehaviorDesigner的编辑器

打开编辑器界面后,各个面板的简要介绍

1.Behavior面板

 

2.Tasks面板 

4.Variables面板

变量面板里面有个各种变量参数,是用来给行为树赋值的

 5.Inspector面板

当然学习行为树的重点就在与学习其行为任务节点的使用上,因此本文章主要介绍该内容

一、Composites复杂任务(自己不能成为一个单独的任务(要大于等于一个子任务),都是由其子任务复合而成的)

    1. Sequence,作用就是从左到右依次执行子任务,必须所有子任务成功才能返回成功

    2. Selector, 从左到右依次执行子任务,只要由一个子任务成功就会返回

二、Decorators 装饰器(都是对单个任务做操作的)

      1.Inverter 将人物的结果进行反转

三、Actions行为任务

  1. Log 输出log中的text
  2. Movement/Patrol(需要导入movement包),来回巡逻(需要用到navemesh,navemesh在2022版进行了更新,直接将navemeshcomponent的内容直接整合到了unity中,用法就和navemeshcomponent一样)
  3. Movement/Seek,追寻目标target
  4. Movement/Flee,远离目标,其中Fleed Distance远离目标的距离(也就是在执行逃离任务时与目标的距离要超过该值,该任务才能返回success,否在一直返回runing),Look Ahead Distance 就是向前看到的距离(这样理解,逃离时是向身后的某个点进行移动,这个距离就是逃离方向某个点距离你现在的距离,越大这个点越远,如果到达了该点后又会重新计算),注意这里只要到达了逃离距离就会返回success(即使没有到达计算的点也会中断该任务这才符合逃离的逻辑)

四、Condition条件任务(用来判断的)

  1. Math/Float Comparison,比较两个浮点数的大小
  2. Movement/Can See Object(需要导入movement包),用来判断是否看见目标对象,target object是目标对象,return object是返回值(看到目标对象后返回的值,一半就返回目标对象)

小知识点:

  1. 关于变量赋值

 

点击后面的小圆圈(在代码中就是share类型的变量)就可以用变量给它赋值

Can See Objec 和Seek和变量的运用

变量也分为局部遍历和全局变量

局部变量:在一个行为树种每个任务都能访问到的变量(也就是只在该行为树中能访问)

全局变量:每个行为树都能方位到的变量(所有行为树都能访问)

用代码获取变量的方法可以查看文档

2.关于Sequence的中断机制

    1)中断执行lower priority 就是当比自己优先级较低的任务在执行时(自己也在进行判断),如果自己满足判断条件就打断较低优先级的任务,执行自己

    2)自己就当在执行自己的任务时,如果自己的任务在执行时不满足判断条件了,就会打断自己的任务

    3)both就是两个融合的

3. 自己手写行为树中的任务方法

(1)创建一个新的脚本,并且继承自四大任务中的某一个任务,比如我自己手写一个Action中的Seek方法

这样就可以在Actions任务栏中找到该方法

案例一:敌人在巡逻,发现玩家后追寻玩家

这里分析一下敌人有两种状态1.巡逻,2.追击玩家。

案例二:夺旗大战,有夺旗者和守旗者;

夺旗者有两个状态:1.旗帜没有被拿:判断前方是否有敌人,如果有敌人的话就就远离敌人,如果前方没有敌人就像旗帜靠拢。2.旗帜被拿:如果自己有旗帜时就往终点前进,如果自己没旗帜时就向旗帜靠拢。

守旗者有两个状态:1.旗帜没有被拿时:到自己的防守位置,如果发现敌人就追击敌人2.旗帜被拿时:追击旗帜

这里就有两种行为树,拿到旗帜和没拿到旗帜,因此可以用脚本将攻击者和防御者拿到旗帜的行为树放在list中,同样攻击者和防御者没拿到旗帜的行为树也放进另一个list中,这样在拿到或者没拿到旗帜时直接激活对应list中的行为树就可以切换行为树的目的

猜你喜欢

转载自blog.csdn.net/qq_62947569/article/details/134914568