Unity3D上,实现简单AI最好的工具,莫过于BehaviorDesigner了。

虽然我自己也写过行为树,虽然也用过别的小伙伴写的行为树,虽然也用过企鹅社公开的行为树,虽然一大堆,但是的确没有哪个插件,比BehaviorDesigner更好用了。

支持可视化编辑。支持可视化调试。虽然还没有UE4那个内置的行为树那么强大,但是现阶段来看,至少在Unity官方出行为树之前,是Unity平台的最优解决方案了。

然而当你打开BD提供的那个又臭又长而且是英文是说明书的时候。是不是有一种血压升高,眼冒金星,口吐白沫的赶脚。其实听力够用,还会翻墙的话,直接看看官方提供的视频比较快入手。为了方便那些不精鸟语或者不善翻墙的(程序员哪有不会鸟语,不会翻墙的。。。。。。其实主要是方便那些懒货!)程序猿,我把一些干货总结出来。希望能对大家有帮助。

【1】创建行为树

选择一个你想要为之添加行为树的 GameObject

点击 Tools-》Behavior Designer-》Editor,打开行为树编辑器。界面图太大了,不全截图了。

点击加号可以建立一个新的行为树。

【2】建立行为树。
先说明一下,如果不了解行为树的原理,建议自己写一个行为树,不然很难真正透彻理解行为树的原理。
这里的讲解,是建立在你已经写过行为树,或者起码了解行为树的原理的基础上的。
我会另起一片文章介绍行为树基础知识,但不是这一篇。
【2.1】右键单击编辑区,选择一个节点类型,即可添加节点。这个要是摸索不出来,我觉得,可以不用往下看了,所以,不截图了。
下面是一个未完成的行为树,但是拿来讲解应该足够了。
想必BombMan大家都玩过,没玩过可以下个FC模拟器玩玩。
我这个是想要实现一个PVP的炸弹人的AI部分。
这个图实现了部分功能,用人话翻译过来就是:
如果周围有可以炸掉的墙,并且我有炸掉,那么扔个(╯‵□′)╯炸弹!•••*~●(强大的输入法......)
否则如果我站在拐角处,那么选择一个方向,并且走到下一个格子。
看图我们需要确认以下几件事情。
(1)不要指望内置的Tasks能满足你的需求,99%的情况下,你只能用到Composite,其他的Task
你都得自己写。
(2)掌握Task的粒度是关键,比如SelectDirection,本身就可以写成一个非常复杂的行为树。我以后会扩展它的。
(3)BehaviorTree能做的,硬编码一定都能实现,只不过,你要想调试,修改,维护你的硬编码AI,准备累死吧。
【3】几个重要的选项
【3.1】Start When Enable
建议不要选上,否则你很难控制并保证前期初始化工作,会在AI启动之前完成。
【3.2】Paused When Disable
当GameObject被Disable掉时候,停掉AI,这个可以选上。
如果不选上,当你Disable掉GameObject的时候,行为树是被停止,而不是暂停。
选上他,当你再次激活GameObject的时候,行为树会被自动启动。
【3.3】Restart When Complete
这个我选上了,不选上的话,你就得在Update或自己写事件驱动BTree,否则他执行一遍就不再执行了。
【3.4】Reset Value When Restart
这个我也选上了,因为我的行为树,每次都会重新计算值,所以不需要继承原来的值。如果有需要利用上一次的计算结果,你可以不用点上它。
【4】如何手动启动行为树
命名空间:
using BehaviorDesigner.Runtime;
调用代码:
BehaviorTree ai_tree =GetComponent<BehaviorTree>();
ai_tree.EnableBehavior();
【5】如何自定义Task
绝大多数情况下,Behavior Designer给你的行为树是不够你用的(别听官方瞎BB,说什么一行代码也不写,就能做出游戏来,你自己玩玩可以,这么忽悠老板等着被炒鱿鱼吧,一行代码不写还要你程序猿干屁)。尤其是你想写一个策略游戏什么的,那点玩意根本不够看的。
自定义Task,要点也就那么几个。多数情况下,我们要派生自Conditional 和Action 这两种Task。
因为不幸中的万幸,Decoration和Composite节点,足够你用的。
就拿比较复杂的Action为例吧,Condition比较简单。不浪费笔墨了。
[5.1] 继承自Action的正确姿势。
包含这些,基本够了。
using UnityEngine;
using System.Collections;
using BehaviorDesigner.Runtime;
using BehaviorDesigner.Runtime.Tasks;
[5.2]必须要override的事件,只有两个,其他的是可选。
OnAwake
在这里你要获得一些对象的引用,比如对我来说,我想获得的是我自己写的AI_Controller的引用。
大约这样写:
ai_ctrl = ((GameObject)owner_ojbect.GetValue()).GetComponent<BA_AIController>();
注意,owner_ojbect是一个SharedGameObject对象,不要试图直接通过GameObject或者你自己的脚本获得引用。
因为他们可以在Inspector里面被看到,但是你把场景中的GameObject拖进去,会报错的。
OnUpdate
这个是核心函数。如果是Conditional节点,你需要实现你的比较函数。
True 返回  TaskStatus.Success;
False 返回  TaskStatus.Failure;
如果是延迟的Action,不能直接返回成功或者失败的,要返回TaskStatus.Running。并且把Instant属性勾掉。
public override TaskStatus OnUpdate()
{
if( inner_timer != null && inner_timer.paused == false)   
{
inner_timer.Tick(Time.deltaTime);
return TaskStatus.Running;
}
ai_ctrl.DropBomb();
return TaskStatus.Success;
}
我这个写的比较草率,大意是,等播放放置炸弹的动画结束之后,逻辑上放置一个炸弹。
其他比较重要的可能需要override的方法:
OnStart和OnEnd分别在事件开始前,和事件结束后调用,如果是延迟事件,会等返回成功或失败后再调用OnEnd,返回Running的时候是不会调用它的。
比如我的移动到下个格子的Task是这样写的:
public override void OnStart()
{
move_to = ai_ctrl.player_object.last_stand_on.GetNeibhouor( ai_ctrl.current_direction );
}
public override void OnEnd()
{
ai_ctrl.player_object.last_stand_on = move_to;
}
public override TaskStatus OnUpdate()
{
Vector3 distance = move_to.transform.position - ai_ctrl.player_object.transform.position;
if (distance.magnitude < center_threshold) 
{
return TaskStatus.Success;
}
ai_ctrl.player_object.transform.position = Vector3.MoveTowards(ai_ctrl.player_object.transform.position, move_to.transform.position, ai_ctrl.delta_speed);
return TaskStatus.Running;
}
OnStart中,选择目标格子
OnUpdate中,一帧一帧的移动角色。
OnEnd中,将角色定位到下一个格子中,这对策略游戏可能更重要。即时战略是没有格子的设定的。
【6】Abort Type机制
这里顺便讲一下Instant这个选项,如果有Task是延迟事件,也就是需要运行一段时间的事件,那么他要被标记为非Instant,并且他的上层父节点,也要被标记为非Instant,否则他会在执行之后,立刻向上层报告,导致整个行为树重新计算。
给我的感觉,这是个短路机制。如果把整个行为树看成一个函数,那么abort机制相当于允许你在函数执行到最后之前就return掉。
None是不短路,直接运行到结束为止
Self是自己的子树完活之后,短路
LowerPriority,是比自己优先级低的子树完活之后,短路。
Both,是二者兼有之。

Behavior Designer 干货总结相关推荐

  1. Behavior Designer笔记

    1.总览 Behavior Designer是一个行为树程序.他为所有人设计-程序美工策划.Behavior Designer提供很好很强大的API,允许你愉快的进行玩耍.他和PlayMaker和uS ...

  2. Unity3D Behavior Designer 行为树1 认识

    环境:Unity2017.4 语言:C# 总起: 行为树,我很早就了解到了这个插件,不过对于它究竟是什么其实概念上比较模糊,这次正好趁机我们一起来学习一下(跟渲染一样AI也是个大坑). 本次教程基于插 ...

  3. Behaviac 和 Behavior Designer两者的区别

    PS:该篇文章主要记录了behaviac和behavior的区别,如果没有兴趣可跳过. 想了解behaviac可转至:[Behaviac与Unity整合使用] 想了解behavior designer ...

  4. 使用Behavior Designer插件简单制作NPC AI

    简单用Behavior Designer插件实现:当敌人发现玩家后开始追踪玩家,当追上玩家时发动攻击 Behavior Designer自带了一些Task,但是要实现自己的需求,必须动手写自己的Tas ...

  5. Unity Behavior Designer插件 任务模块

    写在前面 由于项目需要用行为树插件,在学习过程中发现网上关于行为树的资料实在太少,大部分都是蜻蜓点水般略过,就连官方的脚本文档和教学视频也是一般般,导致我在使用时不断采坑,故开一篇博客来完善大部分行为 ...

  6. Behavior Designer

    https://my.oschina.net/acitiviti/blog/621627

  7. Behavior Designer知识点

    1.AbortType: None:不被其它节点打断,非None时,每一个Tick都在判断其直接子节点中的条件节点的运行结果. Self:仅终结子节点中的操作,重新开始自己的第一个子节点 Lower ...

  8. Behavior designer 英文解释

    https://www.youtube.com/watch?v=YCMvUCxzWz8#t=1402.952655

  9. Behavior Designer插件解析

    选择节点和条件节点和并行节点这种非叶子节点都有一个中止类型 当某个分支下某一个节点处于running时,会向父节点返回running状态,并将父节点设为running状态,然后一直往上传递记录,传递完 ...

最新文章

  1. 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法
  2. CMap在用CString做key类型时,ARG_KEY要选LPCTSTR
  3. 过去式加ed的发音_过去式的变化规律,掌握诀窍了吗?
  4. 017-通过govendor管理依赖包
  5. 原来python中实现语音识别如此简单!
  6. CentOS7安装Nagios
  7. 8天入门wpf—— 第四天 模板
  8. 手机端输入键盘导致 position fixed
  9. Java基础面试题集(二)
  10. 将数据加载到datagridview_JVM系列(一)-- Java类的加载机制
  11. android 调用java webservice_Android在网络中与JavaWeb的项目进行交互的方法(Webservice)...
  12. 算法竞赛入门经典(第2版)紫书代码仓库-链接
  13. win7 插入鼠标自动禁用触摸板
  14. Building the main Guest Additions module
  15. requests模块
  16. java勾股数_勾股数计算的Java
  17. 出新书了!| 赠书啦,免费包邮
  18. 如何用Xinstall来做一款App运营推广?
  19. Linux中Python程序CPU占用高排查
  20. 怎样在应用中实现自助报表功能

热门文章

  1. Spine 动画完成后如何改变图片资源尺寸
  2. IntelliJ idea 必备 好用 优秀 插件 idea必备插件
  3. 刚入门,对于浮动float的作用、影响和解决方案和它们的缺点
  4. 科技爱好者周刊:第 92 期
  5. Hystrix中文开发手册-Hystrix简介(Home)
  6. 小数点后几位截取办法
  7. 掌握未来趋势的UI设计成长之路
  8. 没有签劳动合同离职要不要开离职证明
  9. JavaScript前端监听事件移除案例
  10. 套汇问题 Floyd