[Unity插件]Lua行为树(一):BehaviorDesigner源码分析
BehaviorDesigner是Unity上的一款行为树插件,不过这个插件是用C#编写的,编写出来的行为树也是依赖于C#的,不利于热更,所以有必要写一个lua版本的。
首先下载BehaviorDesigner这个插件,其中部分源码编译在Behavior Designer\Runtime\BehaviorDesignerRuntime.dll中,可以使用.NET Reflector这个工具进行反编译,然后将反编译后的类文件保存,然后用VS打开,就可以方便地查看源码啦。这个插件是自带pdf文档的,所以这里的源码分析也是源码结合文档进行说明的。
1.Task
Task类有一套和MonoBehaviour相似的API(非继承MonoBehaviour),是所有节点的基类。
a.OnAwake:只会被调用一次,当行为树enable时调用,类似于构造器。
b.OnStart:在节点开始执行时会被调用,一般用于重置变量。
c.OnUpdate:每帧调用。
d.OnEnd:在节点执行返回成功或者失败时调用。
e.OnPause(bool paused):当行为树暂停或者恢复时调用。
f.OnBehaviorComplete:当行为树完成执行时调用。
Task的生命周期:

2.ParentTask
ParentTask类是Composite节点和Decorator节点的基类。
a.CanRunParallelChildren:当前节点是否为Parallel节点。
b.CurrentChildIndex:当前激活的子节点索引。
c.CanExecute:当前节点(父节点)能否执行。
d.Decorate:修改当前状态。
e.OnChildExecuted:子节点执行时调用。
f.OnChildStarted:子节点开始执行时调用。
3.BehaviorTree
BehaviorTree是挂在GameObject上的,同时也是行为树的入口。BehaviorTree继承Behavior,Behavior在Start方法会调用EnableBehavior,然后会创建一个空物体并且挂上Behavior Manager脚本。Behavior Manager会在Update方法中执行每一棵行为树(Behavior Manager管理整个场景的行为树)。
[Unity插件]Lua行为树(一):BehaviorDesigner源码分析的更多相关文章
- Lua官方文档与源码分析
https://www.lua.org/source/5.3/ http://www.cppblog.com/airtrack/archive/2012/09/19/191233.html https ...
- [Unity插件]Lua行为树(三):组合节点Sequence
Sequence的继承关系如下: Sequence->Composite->ParentTask->Task 上一篇已经实现了简单版本的ParentTask和Task(基于Behav ...
- [Unity插件]Lua行为树(十三):装饰节点完善
之前介绍了组合节点中三大常用的节点:BTSequence.BTSelector和BTParallel,一般来说,这三种就够用了,可以满足很多的需求. 接下来可以完善一下装饰节点,增加几种新的节点. 1 ...
- [Unity插件]Lua行为树(十二):行为树管理
之前运行的行为树,都是一颗总树,那么实际上会有很多的总树,因此需要对行为树进行管理. BTBehaviorManager.lua BTBehaviorManager = {}; local this ...
- [Unity插件]Lua行为树(十一):组合节点Parallel
Parallel节点类似Sequence节点,不同在于Parallel会每帧执行所有的节点.当所有节点返回成功时返回成功,当其中一个节点返回失败时,返回失败并且结束所有的子节点运行. 例如说,给Seq ...
- [Unity插件]Lua行为树(七):行为树嵌套
在上一篇的基础上,可以测试下行为树的嵌套,所谓的行为树嵌套,就是在一棵行为树下的某一个分支,接入另一棵行为树. 以下面这棵行为树为例: TestBehaviorTree2.lua TestBehavi ...
- [Unity插件]Lua行为树(六):打印树结构
经过前面的文章,已经把行为树中的四种基本类型节点介绍了下.接下来可以整理一下,打印一下整棵行为树.注意点如下: 1.可以把BTBehaviorTree也当作一种节点,这样就可以方便地进行行为树嵌套了 ...
- [Unity插件]Lua行为树(五):装饰节点Repeater
Repeater:重复执行子节点,直到一定次数 特点如下: 1.执行次数可以是无限循环,也可以是固定次数 2.一般来说,子节点的执行返回状态不会影响Repeater节点,但可以设置当子节点返回失败时, ...
- [Unity插件]Lua行为树(四):条件节点和行为节点
条件节点和行为节点,这两种节点本身的设计比较简单,项目中编写行为树节点一般就是扩展这两种节点,而Decorator和Composite节点只需要使用内置的就足够了. 它们的继承关系如下: Condit ...
随机推荐
- PHP破解wifi密码(wifi万能钥匙的接口)
新建wifi.php,复制粘贴 <?php $bssid = $_POST["bssid"] ; $ssid = $_POST["ssid"] ; if ...
- String的疑问
ss[]//var ss:String; 和 Pointer(ss)^ 是不是一个意思呢? 答:不是. ss[]表示第一个字符.如:ss:='abc' 则表示]=Length(ss); Pointer ...
- WEKA结果解读
红括号里面,左边是bad的数目,右边是good数目. TP Rate FP Rate Precision Recall F-Measure ROC Area Class 0.536 ...
- WPF Demo20 模板
<Window x:Class="控件模板.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/x ...
- HTML5 Canvas水波纹动画特效
HTML5的Canvas特性非常实用,我们不仅可以在Canvas画布上绘制各种图形,也可以制作绚丽的动画,比如这次介绍的水波纹动画特效.以前我们也分享过一款基于HTML5 WebGL的水波荡漾动画,让 ...
- 黄聪:C#如何Json转字符串;字符串转Json;Newtonsoft.Json(Json.Net)学习笔记(转)
Newtonsoft.Json,一款.NET中开源的Json序列化和反序列化类库(下载地址http://json.codeplex.com/). 下面是Json序列化和反序列化的简单封装: /// & ...
- HBase与Zookeeper数据结构查询
一.前言 最近一年了吧,总是忙于特定项目的业务分析和顶层设计,很少花时间和精力放到具体的技术细节,感觉除了架构理念和分析能力的提升,在具体技术层次却并没有多大的进步.因为一些原因,总被人问及一些技术细 ...
- ubuntu16.04 彻底卸载MySQL
以MySQL- 5.7.18为例: sudo apt-get autoremove --purge mysql-server-5.7 #sudo apt-get remove mysql-server ...
- Python——字符串2.0(实验)(python programming)
直接打s,是程序员看到的:打print(),是用户看到的 列表 ] #列表索引,与数组唯一不同:等号左端可修改 转载自:https://www.cnblogs.com/wwwwwei/p/104816 ...
- oracle数据库归档与非归档
oracle运行的时候至少需要两组联机日志,每当一组日志写满后会发生日志切换,继续向下一组联机日志写入. 如果是归档模式,则会触发ARCn进程,把切换后的重做日志文件复制到归档日志文件. 如果是非归档 ...