Behavior DesignerにおいてスクリプトでBehavior Treeとイベントをやり取りする方法です。
Unity2018.3.9
Behavior Treeからイベントを受け取る
Behavior TreeのAction Taskの一つであるSend Eventを使うとEventを発行することができます。
イベント名と、引数を3つまで指定できます。
このようなBehavior Treeイベントにはスクリプトからリスナを登録できます。
using BehaviorDesigner.Runtime; using UnityEngine; public class Example : MonoBehaviour { [SerializeField] private BehaviorTree _tree; private void Awake() { // 引数は必ず明示的にobject型に _tree.RegisterEvent<object>("TestEvent", ReceiveEvent); } // 引数は必ずobject型 public void ReceiveEvent(object value) { Debug.Log(value); } }
これでBehavior TreeのSend Eventが実行されたときにReceiveEvent()が呼ばれるようになります。
引数のやり取りはobject型にしなければならない点に注意が必要そうです。
ちなみにイベントの解除は下記のように行います。
_tree.UnregisterEvent<object>("TestEvent", ReceiveEvent);
Behavior Treeにイベント送る
反対にBehavior Treeにイベントを送るにはBehaviorTree.SendEvent()を使います。
using BehaviorDesigner.Runtime; using UnityEngine; public class Example : MonoBehaviour { [SerializeField] private BehaviorTree _tree; private void Update() { if (Input.GetKeyDown(KeyCode.A)) { // 引数の型をGenericで指定するが、明示的にobject型にする必要がある _tree.SendEvent<object>("TestEvent", 50); } } }
こちらも引数は明示的にobject型を指定する必要があるので注意が必要です。
こうして送られたイベントはBehavior TreeのConditional TaskであるHas Received Eventで受け取ります。
Has Received EventはConditional Taskなのでイベントを受信して始めて成功判定となります。
そのため実際には次のような感じで使うことになります。
以上、スクリプトでBehavior Treeとイベントをやり取りする方法でした。