Behavior Designerで独自のTaskを作る方法です。
- Action / Conditional Taskを作る
- Composite / Decorator Taskを作る
- SharedXxx型の変数を作る
- アイコンを変える
- カテゴリを指定する
- 説明文を設定する
- 参考
- 関連
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が作れるようになります。簡単。
オーバーライドできる主要なメソッドは以下のようなものがあります。
// 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; } }
するとこんな感じで表示されます。
アイコンを変える
次にカスタム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を作るときに使いやすくなります。
このようにカテゴリを指定するには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の左下に説明文が表示されます。
これにより直感的に使い方が理解できる非常に重要な機能です。
もちろんカスタム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; } }