【Unity】Behavior DesignerでスクリプトからBehavior Treeにイベントを送る&受け取る方法

Behavior DesignerにおいてスクリプトでBehavior Treeとイベントをやり取りする方法です。

Unity2018.3.9

Behavior Treeからイベントを受け取る

Behavior TreeのAction Taskの一つであるSend Eventを使うとEventを発行することができます。

f:id:halya_11:20190402014145p:plain

イベント名と、引数を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で受け取ります。

f:id:halya_11:20190402015143p:plain

Has Received EventはConditional Taskなのでイベントを受信して始めて成功判定となります。
そのため実際には次のような感じで使うことになります。

f:id:halya_11:20190402015252p:plain

以上、スクリプトでBehavior Treeとイベントをやり取りする方法でした。

参考

opsive.com

関連

light11.hatenadiary.com