参考链接:

https://www.cnblogs.com/01zxs/p/9863715.html

https://blog.csdn.net/AcmHonor/article/details/123234763

https://blog.csdn.net/u012632851/article/details/89647097?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-89647097-blog-82943972.pc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-89647097-blog-82943972.pc_relevant_3mothn_strategy_and_data_recovery&utm_relevant_index=3

https://blog.csdn.net/wuming2016/article/details/116858357

BehaviorDesigner下载

https://gitcode.net/linxinfa/unitybehaviordesigner

一.制作一颗简单的行为树

如下,是一颗简单的怪物行为树,当看见主角时,向主角移动;否则保持站立状态

AICanSeeObj.cs

 1 using BehaviorDesigner.Runtime;
2 using BehaviorDesigner.Runtime.Tasks;
3 using UnityEngine;
4
5 public class AICanSeeObj : Conditional
6 {
7 public float distance = 2f;
8 public SharedTransform target;
9
10 public override TaskStatus OnUpdate()
11 {
12 if (Vector3.Distance(transform.position, target.Value.position) < distance)
13 {
14 return TaskStatus.Success;
15 }
16 else
17 {
18 return TaskStatus.Failure;
19 }
20 }
21 }

AIMoveTo.cs

 1 using BehaviorDesigner.Runtime;
2 using BehaviorDesigner.Runtime.Tasks;
3 using UnityEngine;
4
5 //移动到指定的目标
6 public class AIMoveTo : Action
7 {
8 public float speed = 1f;
9 public SharedTransform target;
10
11 public override TaskStatus OnUpdate()
12 {
13 if (Vector3.Distance(transform.position, target.Value.position) < 0.1f)
14 {
15 return TaskStatus.Success;
16 }
17 transform.position = Vector3.MoveTowards(transform.position, target.Value.position, speed * Time.deltaTime);
18 return TaskStatus.Running;
19 }
20 }

AIIdle.cs

1 using BehaviorDesigner.Runtime.Tasks;
2
3 public class AIIdle : Action
4 {
5 public override TaskStatus OnUpdate()
6 {
7 return TaskStatus.Running;
8 }
9 }

二.行为树的特点以及中断机制

在行为树中,一般一个节点返回Success或者Failure后,这个节点就不会再执行了(除非行为树重新执行或者该节点在Repeater节点下)

如下,白色是主角,红色是怪物,一开始两者距离较远,怪物处于Idle状态,即使后面拉近距离,AIIdle也不会被打断,不符合我们设定的AI逻辑(距离较近时向主角移动)

行为树的中断机制是通过设置组合节点的AbortType来实现的

None:不打断

Self:打断该组合节点下方的节点,如下,左上方有个"向下"的标记

Lower Priority:打断该组合节点右方(低优先级)的节点,如下,左上方有个"向右"的标记。一般来说,行为树是从上到下,从左到右执行的,左侧的节点优先级较高,右侧的节点优先级较低,所以低优先级指的是右方

Both:Self + Lower Priority的结合,如下,左上方有个"向下向右"的标记

中断机制:当给组合节点设置中断后(Self/Lower Priority/Both),行为树会(每帧)检测该组合节点已执行过的子条件节点,如果条件节点的状态发生变化,就会中断当前正在执行的Running节点,转而执行该条件节点

三.应用

1.设置中断为Lower Priority,运行游戏,一开始距离较远,所以一直在运行AIIdle节点

拉近距离后,AIIdle节点被打断,转而执行AICanSeeObj和AIMoveTo

2.上面的例子有个问题,就是进入AIMoveTo节点后,即使后面拉大距离,AIMoveTo节点也不会被打断

解决方法就是,设置中断为Both,这样Sequence节点下方的AIMoveTo和右方的AIIdle都能被打断了

[UnityAI]行为树的中断机制的更多相关文章

  1. Unity 行为树-中断机制

    一.中断类型 设置了中断之后,行为树会检测执行过的子条件节点,当条件节点的状态发生变化时,会中断正在执行的Running节点,转而立即执行该条件节点. 行为树的打断类型有4种: None Self L ...

  2. lua行为树设计与实现

    项目需要,之前行为树用的是behaviorDesigner,要改成纯lua的 我先做了一版用递归实现,代码可读性高但是中断机制实现起来比较复杂,而且创建自定义action重写方法时需要调用父类的方法, ...

  3. B树——算法导论(25)

    B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...

  4. ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单

    前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...

  5. 再讲IQueryable<T>,揭开表达式树的神秘面纱

    接上篇<先说IEnumerable,我们每天用的foreach你真的懂它吗?> 最近园子里定制自己的orm那是一个风生水起,感觉不整个自己的orm都不好意思继续混博客园了(开个玩笑).那么 ...

  6. HDU1671——前缀树的一点感触

    题目http://acm.hdu.edu.cn/showproblem.php?pid=1671 题目本身不难,一棵前缀树OK,但是前两次提交都没有成功. 第一次Memory Limit Exceed ...

  7. 算法与数据结构(十一) 平衡二叉树(AVL树)

    今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...

  8. [C#] C# 知识回顾 - 表达式树 Expression Trees

    C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...

  9. bzoj3207--Hash+主席树

    题目大意: 给定一个n个数的序列和m个询问(n,m<=100000)和k,每个询问包含k+2个数字:l,r,b[1],b[2]...b[k],要求输出b[1]~b[k]在[l,r]中是否出现. ...

  10. bzoj1901--树状数组套主席树

    树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...

随机推荐

  1. PC端 图片宽度是百分比,动态设置图片高度为 6:9

    我们知道图片宽度可以设置  百分比,但是高度要给一个固定值  不然不生效,并且产品要求图片显示必须是9:6,这开始确实难倒我了 后面想了一下用js  获取图片宽度  动态的计算高度就行了,超简单 se ...

  2. Collections.synchronizedList使用方法

    ArrayList众所周知ArrayList是非线程安全的,在多线程的情况下,向list插入数据的时候,可能会造成数据丢失的情况.并且一个线程在遍历List,另一个线程修改List,会报Concurr ...

  3. iOS底层原理02-alloc源码分析

    首先,从最熟悉的入手 - 对象,看看这三个对象的内容,内存地址和指针地址. LGPerson *p1 = [LGPerson alloc];    LGPerson *p2 = [p1 init];  ...

  4. 模块二:os模块、sys模块、json模块、pickle模块,包

    os模块 1 os模块是与操作系统交互的一个接口 2 import os: 3 1.获取当前工作目录 4 print(os.getcwd()) 5 6 2.切换到D:\yuan文件目录 7 os.ch ...

  5. java-正确打日志

    使用 slf4j 使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一. 实现方式统一使用: Logback 框架 打日志的正确方式 什么时候应该打日志 当你遇到问题的时候,只能通过 debu ...

  6. linux开机启动执行脚本或命令

    添加到    /etc/rc.d/rc.local    给文件执行权限   /etc/rc.d/rc.local 用于用户自定义开机启动程序,可以往里写开机要执行的命令或脚本,线上的配置如下: [r ...

  7. async await和promise的区别,和使用方法

    async和promise都是异步方法,区别是async生成的结果是promise对象,async是promise的终结版. await只能在async中使用,await是阻塞的意思,就是暂停,你一起 ...

  8. mysql设置表名不区分大小写

    1.root登录,修改/etc/my.cnf2.在mysqld下加入:lower_case_table_names=13.重新数据库

  9. dos命令初学

    DOS命令 打开DOS命令方式 开始+系统+命令提示符 WIN键盘+R 输入CMD 打开控制台(推荐使用) 在任意文件夹下面,按住shift键加鼠标右键点击,在此处打开命令行窗口 自愿管理器的地址栏前 ...

  10. 使用cpu-z简单看处理器,显卡等

    心血来潮想了解一下自己的电脑.在网上搜索cpu-z,大小只有几百kb.下面以我自己电脑为例,上图: 某些地方我也不是很了解,不太了解的我就直接跳过了.在网上查阅相关资料后,有下面的认识: (1)处理器 ...