版权申明:

  • 本文原创首发于以下网站:
  1. 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123
  2. 优梦创客的官方博客:https://91make.top
  3. 优梦创客的游戏讲堂:https://91make.ke.qq.com
  4. 『优梦创客』的微信公众号:umaketop
  • 您可以自由转载,但必须加入完整的版权声明

行为树插件

优势:小兵不仅可以按照该固定动画路径行进,也可以按照指定的路点行进,也可以行进过程中其他行为(攻击,防御)



中断类型

Lower Priority:打断右边优先级执行

Self:只能中断自身的运行,进行判定,只有一开始can see object判定成功看到敌人执行seek,如果一开始就是直行seek就不进行判定,及时后面看到敌人也不能追踪因为不判定

Both:都会执行

MOVEMENT{

cover掩护

Evade躲避

Flee逃跑

Flock聚集

Leader follow跟随移动

Move towards向一个方向移动

Patrol 巡逻

Pursue 追逐

Queue 一个一个通过

Search 搜索

Seek 搜寻

Wander 闲逛

}

ACTIONS{

Log 输出文本

Idle 停一段时间

Wait 等待时间任务

}

Composites {

Sequence 从左往右执行,子任务执行成功才返回成功,有一个任务失败就返回失败

Selector 依次执行成功后面不执行

}

Coditionals /Basic/Mathf/Float Comparision:判断大小第一个和第二个数,返回true,false

Movement /partol :围绕点运动

Movement /Seek:控制到达目标点

Can See Object:看到东西

  1. using BehaviorDesigner.Runtime.Tasks;
  2. using BehaviorDesigner.Runtime;
  3. //这个任务脚本的作用就是控制游戏物体达到目标为止
  4. public class MySeek :Action{//这个任务的调用是behacior designe行为树控制
  5. public SharedTransform target;//这是我们要达到的目标位置
  6. //public float speed;
  7. public SharedFloat sharedSpeed;
  8. //public float arriveDistance = 0.1f;
  9. public SharedFloat sharedArriveDistance=0.1f;
  10. private float sqrArriveDistance;
  11. public override void OnStart()
  12. {
  13. sqrArriveDistance = sharedArriveDistance.Value * sharedArriveDistance.Value;
  14. }
  15. //当进入到这个人物的时候,会一直调用这个方法,一直到任务结束,你返回一个成功或者失败的状态,那么任务结束如果返回一个running状态,那这个方法会继续调用
  16. public override TaskStatus OnUpdate()
  17. {
  18. //这个方法的调用频率,默认是跟unity里面的帧保持一致的
  19. if (target == null||target.Value==null)//判断target是否有值
  20. {
  21. return TaskStatus.Failure;//失败状态
  22. }
  23. transform.LookAt(target.Value.position);//直接朝向目标位置
  24. transform.position = Vector3.MoveTowards(transform.position, target.Value.position, sharedSpeed.Value * Time.deltaTime);
  25. if((target.Value.position - transform.position).sqrMagnitude < sqrArriveDistance)
  26. {
  27. return TaskStatus.Success;//如果距离目标位置的距离较小,人未到达了目标位置,直接return成功
  28. }
  29. return TaskStatus.Running;//继续执行
  30. }
  31. }

定义速度,距离,要到达的位置。判断是否可以运行,计算目标与自身距离,向目标移动,达到目标点结束。

  1. public Transform[] targets;//判断是否在视野内的目标
  2. public float fieldOfViewAngle = 90;
  3. public SharedFloat sharedViewDistance;
  4. public SharedTransform target;//共享的变量
  5. public override TaskStatus OnUpdate()
  6. {
  7. if (targets == null) return TaskStatus.Failure;
  8. foreach(var target in targets)//遍历每一个目标是否满足调用
  9. {
  10. float distance = (target.position - transform.position).magnitude;//求距离目标减去当前自身坐标球的距离
  11. float angle = Vector3.Angle(transform.forward, target.position - transform.position);//求向量夹角,前方向减目标与主角之间的向量
  12. if (distance < sharedViewDistance.Value && angle < fieldOfViewAngle * 0.5f) {//夹角小于视野的一半,距离比视野距离小
  13. this.target.Value = target;//共享变量赋值
  14. return TaskStatus.Success;//成功
  15. }
  16. }
  17. return TaskStatus.Failure;//失败
  18. }

判断距离,是否在视野内(夹角小于视野的一半)

Unity进阶:行为树 01的更多相关文章

  1. Unity进阶:行为树 02 夺旗战搭建场景,AI脚本,旗子拿起

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  2. LeetCode初级算法--树01:二叉树的最大深度

    LeetCode初级算法--树01:二叉树的最大深度 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.n ...

  3. 字典树&&01字典树专题&&对字典树的理解

    对于字典树和01字典树的一点理解: 首先,字典树建树的过程就是按照每个数的前缀来的,如果你要存储一个全小写字母字符串,那么这个树每一个节点最多26个节点,这样的话,如果要找特定的单词的话,按照建树的方 ...

  4. 字典树&01字典树算法笔记

    1]学习了字典树之后,觉得它很明显的就是用空间来换时间,空间复杂度特别大,比如字典数单单存26个小写字母,那么每个节点的孩子节点都有26个孩子节点,字典树中的每一层都保留着不同单词的相同字母. 2]0 ...

  5. Unity BehaviorDesigner行为树基础总结

    BehaviorDesigner——行为树,用于控制和实现AI逻辑,类似于这样: 上面这个行为树实现了这样的逻辑: 当Player有Input时按照Input值来移动,无Input时查找最近的可攻击目 ...

  6. Unity进阶技巧 - 动态创建UGUI

    前言 项目中有功能需要在代码中动态创建UGUI对象,但是在网上搜索了很久都没有找到类似的教程,最后终于在官方文档中找到了方法,趁着记忆犹新,写下动态创建UGUI的方法,供需要的朋友参考 你将学到什么? ...

  7. Unity进阶----Lua语言知识点(2018/11/08)

    国内开发: 敏捷开发: 集中精力加班堆出来第一个版本 基本没啥大的bug 国外开发: 1).需求分析: 2).讨论 3).分模块 4).框架 5).画UML图(类图class function)(e- ...

  8. Unity进阶----AssetBundle_02(加载依赖关系及网络资源)(2018/10/31)

    网络资源加载: string path ="file://"+ Application.streamingAssetsPath + "\\windows\\123&quo ...

  9. Unity进阶----AssetBundle_01(2018/10/30)

    AssetBundle作用和定义 1).AssetBundle是一个压缩包包含模型.贴图.预制体.声音.甚至整个场景,可以在游戏运行的时候被加载: 2).AssetBundle自身保存着互相的依赖关系 ...

随机推荐

  1. 你该怎么学习C++——思想层面

    Javascript是世界上最受误解的语言,其实C++何尝不是.坊间流传的错误的C++学习方法一抓就是一大把.我自己在学习C++的过程中也走了许多弯路,浪费了不少时间. 为什么会存在这么多错误认识?原 ...

  2. vue播放mu38视频兼容谷歌ie等浏览器

    <template> <div id="id_test_video" style="width:100%; height:auto;"> ...

  3. mysql数据库事务类型

    出自:https://blog.csdn.net/u014439239/article/details/78086729 数据库事务有不同的隔离级别,不同的隔离级别对锁的使用是不同的,锁的应用最终导致 ...

  4. panda读取Excel

    pandas读取Excel的第一种方法 方法一:默认读取第一个表单 import pandas print("\n方法一:") xls_data=pd.read_excel('ce ...

  5. VMnet1、VMnet8到底是什么?

    当我们安装VMware Workstation后,在宿主机(物理电脑)上会多出两个网卡,VMNet1.VMNet8,在虚拟机设置里会多出一个配置 VMNet0. vmnet1和vmnet8是两个虚拟网 ...

  6. JVM中的逃逸分析

    逃逸分析(Escape Analysis)是目前Java虚拟机中比较前沿的优化技术. 逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递 ...

  7. [转帖]redhat7.6Linux安装Oracle19C完整版教程

    redhat7.6Linux安装Oracle19C完整版教程 https://www.oracle.com/technetwork/database/enterprise-edition/downlo ...

  8. 图像变化之Laplacian()函数 and Schaar()滤波及综合例子

    先来  Laplacian()函数 #include<math.h> #include<opencv2/opencv.hpp> #include<string.h> ...

  9. 用Scratch制作一个Hello World程序

    网上出现了很多Hello World程序,看的小编心里也痒痒的,为此这次作为南京小码王Scratch培训机构的小编,就为大家来详细的了解下Scratch制作Hello World程序的过程,现在就和小 ...

  10. day47——css介绍、语法结构、选择器、css权重

    day47 今日内容 css介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素,给HTML设置样式,让它更加美观. 语法结构 div{ color:gree ...