【Unity】Behavior DesignerにおいてTask間で変数を受け渡す方法まとめ

Behavior DesignerにおいてTask間で変数を受け渡す方法をまとめました。

Unity2018.3.9

普通に代入する方法

いま、下記のようにGameObjectがActiveだったらDestroyするBehavior Treeを考えます。

f:id:halya_11:20190401013027p:plain

対象のGameObjectを指定する場合、まずActive SelfのInspectorのTarget Game Objectに対象のGameObjectを指定します。

f:id:halya_11:20190401013345p:plain

そしてそのあとDestoyのInspectorのTarget Game Objectに先ほどと同様のGameObjectを指定します。

f:id:halya_11:20190401013425p:plain

これで正常に動作はしますが、同じGameObjectを指定する操作を2回行うのはミスが起こりやすいし、
スクリプトから動的に代入するときに面倒です。

Local Variables

これを回避するためにLocal Variablesという仕組みがあります。
Local VariablesはこのBehavior Tree内で共有される変数です。

Local Variablesを作るにはVariablesタブからNameとTypeを入力しAddボタンを押します。

f:id:halya_11:20190401013758p:plain

するとその下に作成された変数の情報が追加されるので、ここに前節のGameObjectを指定します。

f:id:halya_11:20190401013952p:plain

あとはこれをTaskから参照します。
TaskのInspectorの黒丸が表示されているボタンをクリックします。

f:id:halya_11:20190401014212p:plain

するとオブジェクトのフィールドがドロップダウンに切り替わるので、
ここから先ほど作ったLocal VariablesであるTargetを選択します。

f:id:halya_11:20190401014316p:plain

これでTaskからLocal Variablesが参照できるようになりました。

f:id:halya_11:20190401014402p:plain

Dynamic Variables

Local Variablesと似たような機能にDynamic Variablesがあります。
Dynamic Variablesを使うにはまず変数フィールドのドロップダウンからをDynamicを選択します。

f:id:halya_11:20190401014759p:plain

そして任意の文字列を入力します。

f:id:halya_11:20190401014921p:plain

そしてこれと同じ変数を使いたいTaskのフィールドにも同じ操作を行います。
これによりTask間で同じ名前の変数が共有されます。

ただしこのままでは、Local Variablesと違ってこの変数に何も代入されていません。
従って、下図のようにFindタスクで代入したり、スクリプトから代入する必要があります。

f:id:halya_11:20190401015224p:plain

Dynamic Variablesは少数のTaskでだけしか共有しない変数を定義するのに便利ですが、
結局変数名をすべてのTaskに入力しなければならないため、
Local Variablesのほうがわかりやすくてミスは起こりづらいかと思います。

Global Variables

他のBehavior Treeとも値を共有できるGlobal Variablesというものも存在します。
Global Variablesを作るにはVariablesタブからGlobal Variablesボタンを押します。

f:id:halya_11:20190401015629p:plain

するとGlobal Variables設定用のウィンドウが開かれます。

f:id:halya_11:20190401015705p:plain

あとの要領はLocal Variablesと同様です。
ちなみにGlobal VariablesはAssets/Behavior Designer/ResourcesにScriptable Objectとして保存されています。

f:id:halya_11:20190401015848p:plain

スクリプトから操作する

これらの変数はスクリプトからも代入/取得できます。

Behavior behavior;
GameObject targetObj;

// Local or Dynamic
var target = behavior.GetVariable("Target").GetValue() as GameObject;
behavior.SetVariableValue("Target", targetObj);
        
// Global
var target = GlobalVariables.Instance.GetVariable("Target").GetValue() as GameObject;
GlobalVariables.Instance.SetVariable("Target", targetObj);

関連

light11.hatenadiary.com

light11.hatenadiary.com

light11.hatenadiary.com

参考サイト

opsive.com