【Unity】Behavior DesignerでカスタムTaskを作る方法まとめ

Behavior Designerで独自のTaskを作る方法です。

Unity2018.3.9

Action / Conditional Taskを作る

まずAction Taskを独自で作ってみます。
Action Taskを作るには、Actionクラスを継承します。

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

public class ExampleAction : Action
{
    // Tick毎に呼ばれる
    public override TaskStatus OnUpdate()
    {
        // 成功
        return TaskStatus.Success;
        // 失敗
        return TaskStatus.Failure;
        // 実行中
        return TaskStatus.Running;
    }
}

これだけで右クリックメニューからTaskが作れるようになります。簡単。

f:id:halya_11:20190404001330p:plain

オーバーライドできる主要なメソッドは以下のようなものがあります。

// Behavior Treeが有効になった時に呼ばれる
public override void OnAwake()
{
}

// Taskが処理される直前に呼ばれる
public override void OnStart()
{
}

// Taskが失敗or成功した時に呼ばれる
public override void OnEnd()
{
}

// Behavior Treeが終了した時に呼ばれる
public override void OnBehaviorComplete()
{
}

Conditional Taskのカスタムの場合も要領は同じです。

using BehaviorDesigner.Runtime.Tasks;

public class ExampleConditional : Conditional
{
    // 更新時に呼ばれる
    public override TaskStatus OnUpdate()
    {
        return TaskStatus.Success;
    }
}

Composite / Decorator Taskを作る

Composite TaskやDecorator Taskを作るにはそれぞれComposite / Decoratorクラスを継承します。

using BehaviorDesigner.Runtime.Tasks;

public class ExampleComposite : Composite
{
}

public class ExampleDecorator : Decorator
{
}

これらのクラスは子Taskを持てるという点で前節の二つとは異なっているのでParentTaskを基底クラスとしています。
オーバーライドできるメソッドには以下のようなものがあります。

// 実行可能状態か
public override bool CanExecute()
{
    return true;
}

// 子Taskの最大数
public override int MaxChildren()
{
    return 3;
}

// 子Taskを並列実行できるか
public override bool CanRunParallelChildren()
{
    return false;
}

// 子Taskが実行されたときに呼ばれる
public override void OnChildExecuted(int childIndex, TaskStatus childStatus)
{
}

// 子Taskが開始した時に呼ばれる
public override void OnChildStarted()
{
}

この辺りは実際に実装されているTaskのソースコードを見るのがわかりやすいです。

SharedXxx型の変数を作る

Taskには変数を定義できます。
通常のInspectorと同様、SerializeFieldアトリビュートを付ければTaskのInspectorに表示されます。

このときもしGlobal VariablesやLocal Variables、Dynamic Variablesといった
Behavior Designerの機能を使いたい場合にはSharedXxx型として宣言する必要があります。

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

public class ExampleAction : Action
{
    // SharedXxx型でフィールドを定義すると
    // Local VariableとかGlobal Variableとかが設定できる
    [SerializeField]
    private SharedGameObject _target;

    public override TaskStatus OnUpdate()
    {
        return TaskStatus.Success;
    }
}

するとこんな感じで表示されます。

f:id:halya_11:20190404001523p:plain

アイコンを変える

次にカスタムTaskがBehavior DesignerのEditorで表示される際のアイコンを設定します。
アイコンを指定するにはTaskIconアトリビュートを指定します。

using BehaviorDesigner.Runtime.Tasks;
using UnityEngine;

// 引数は画像パス
// {SkinColor}にはUnityのスキンに応じて Light か Dark が代入される
[TaskIcon("Assets/{SkinColor}_ExampleIcon.png")]
public class ExampleAction : Action
{
    [SerializeField]
    public int exampleInt;

    public override TaskStatus OnUpdate()
    {
        return TaskStatus.Success;
    }

}

引数にアイコン画像へのパスを渡します。
Unityのスキンに応じて変えたい場合は上記のようにSkinColor変数を使います。

カテゴリを指定する

Taskのカテゴリを指定すると、Taskを作るときに使いやすくなります。

f:id:halya_11:20190404005019p:plain

このようにカテゴリを指定するにはTaskCategoryアトリビュートを使います。

using BehaviorDesigner.Runtime.Tasks;
using UnityEngine;

[TaskCategory("Common")]
public class ExampleAction : Action
{
    [SerializeField]
    public int exampleInt;

    public override TaskStatus OnUpdate()
    {
        return TaskStatus.Success;
    }

}

説明文を設定する

Behavior Designerでは、Taskを選択した時にEditorの左下に説明文が表示されます。

f:id:halya_11:20190404005155p:plain

これにより直感的に使い方が理解できる非常に重要な機能です。

もちろんカスタムTaskにもこの説明文を設定できます。
設定するにはTaskDescriptionアトリビュートを使います。

using BehaviorDesigner.Runtime.Tasks;
using UnityEngine;

[TaskDescription("This is example action.")]
public class ExampleAction : Action
{
    [SerializeField]
    public int exampleInt;

    public override TaskStatus OnUpdate()
    {
        return TaskStatus.Success;
    }

}

参考

opsive.com

opsive.com

opsive.com

opsive.com

opsive.com

関連

light11.hatenadiary.com

light11.hatenadiary.com