【Unity】学习使用Behavior Designer

      为了制作一个简单的怪物AI(回合制为什么也要用行为树啊啊啊啊啊),今天要被迫学习一波Behavior Designer了!
      下载插件后一头雾水,不过好在插件内有一个详细的说明文档(Documentation)。不过全是英文文档,看起来很费时间,于是我在网上找到了一个翻译成中文的文档(有的代码是截图的很模糊,还好有原版文档可以两边对照着看):Behavior Designer 中文版教程。然后下面就写一点学习过程中用到的文档上的东西吧~

1.BehaviorTree与BehaviorManager

      打开工具栏中的Tools/Behavior Designer/Editor可以打开行为树的编辑界面,选中一个GameObject后在编辑界面右键可以创建一个行为树实例。对应的会在GameObject上挂载一个BehaviorTree脚本,这个脚本用来管理整个行为树实例。
      在游戏运行后,如果存在BehaviorTree实例且没有BehaviorManager实例的话,会自动创建一个全局的用来管理所有行为树的BehaviorManager实例。BehaviorManager中可以修改行为树的更新频率,默认是每帧更新,因为我们不需要每帧进行行为树的更新,所以这里改成了手动更新:

BehaviorManager

      修改为手动更新后要通过代码调用下面的函数才会更新行为树的行为。(上面的是更新所有行为树,下面的是更新指定某个行为树)

BehaviorManager.instance.Tick();
BehaviorManager.instance.Tick(BehaviorTree);

2.编写自己的Condition与Action

      由于插件写的非常牛逼,所以在自定义Condition和Action的时候变得异常方便,只要继承对应的接口,然后在代码里写一些类似unityMonoBehavior的生命周期函数就可以实现了:
Condition:

using BehaviorDesigner.Runtime.Tasks;
using UnityEngine;

public class TestCondition : Conditional
{
    public int number;
    public override void OnAwake()
    {
        Debug.LogError(number + "enter awake");
        base.OnAwake();
        
    }

    public override TaskStatus OnUpdate()
    {
        Debug.LogError(number + "update");
        return base.OnUpdate();
    }
}

Action:

using BehaviorDesigner.Runtime.Tasks;
using UnityEngine;

public class TestAction : Action
{
    public override TaskStatus OnUpdate()
    {
        Debug.LogError( "action update");
        return base.OnUpdate();
    }
}

      有了这两段代码,在Behavior编辑器中右键菜单的Action和Condition页签中就会出现刚刚自己定义的类型了。刚刚的Condition中有一个额外的公共变量,这样在编辑Behavior的时候还可以根据不同的需求给相同的Condition不一样的变量值。

3.Variables

      除了上面提到的Action与Condition中的变量值以外,BehaviorDesigner还提供了给BehaviorTree使用的公共变量。

Behavior Tree Variables

      这里可以添加针对整个BehaviorTree使用的变量(使用代码绑定行为树的目标或者做些其他的什么)。此外下面还有一个GlobalVariables,目前没有需求使用这个,不过应该是那种所有行为树都共用的变量吧~
      然后接下来就是变量和我们的Condition或者Action结合操作了!
      让我们稍微改一下之前的Condition:

using BehaviorDesigner.Runtime;
using BehaviorDesigner.Runtime.Tasks;
using UnityEngine;

public class TestCondition : Conditional
{
    public int number;
    public SharedInt sharedInt; //Add!!!
    public override void OnAwake()
    {
        Debug.LogError(sharedInt + "enter awake");
        base.OnAwake();
        
    }

    public override TaskStatus OnUpdate()
    {
        Debug.LogError(sharedInt + "update");
        return base.OnUpdate();
    }
}

      然后把我们刚才index变量填充到Condition的SharedInt中。

添加变量

      最后添加一个修改变量的脚本

using BehaviorDesigner.Runtime;
using UnityEngine;

public class TestBehaviorTree : MonoBehaviour
{
    public BehaviorTree bt;
    private void OnGUI()
    {
        if (GUI.Button(new Rect(20, 40, 80, 20), "修改变量!"))
        {
            bt.SetVariableValue("index",1);
            BehaviorManager.instance.Tick(bt);
        }
    }
}

      点击ongui上的按钮后就会看到下面的log(输出了两次是因为我加了两个Condition上去emmm)

结果

4.Composites

      组合节点中必须要存在子节点,组合节点大概分为三种类型:Selector、Sequence、Parallel。他们的特性分别为:

Selector:选择执行,当执行到第一个成功执行的节点时,结束执行
Sequence:顺序执行,会将下面的节点依次执行,当全部执行成功或有执行失败时结束执行
Parallel:并行执行,会将下面的所有节点同时执行,多用于播放动画音效等

节点

      看了小半天文档就总结出这点东西,因为还没有具体落实到项目中,目前只是在看文档学习阶段,所以肯定有不少理解不深的地方,如果有大大看到了希望帮忙指正。后面落实到项目的时候如果遇到坑也会回来补充的!呐,马大内!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352