Behavior DesignerにおいてTask間で変数を受け渡す方法をまとめました。
Unity2018.3.9
普通に代入する方法
いま、下記のようにGameObjectがActiveだったらDestroyするBehavior Treeを考えます。
対象のGameObjectを指定する場合、まずActive SelfのInspectorのTarget Game Objectに対象のGameObjectを指定します。
そしてそのあとDestoyのInspectorのTarget Game Objectに先ほどと同様のGameObjectを指定します。
これで正常に動作はしますが、同じGameObjectを指定する操作を2回行うのはミスが起こりやすいし、
スクリプトから動的に代入するときに面倒です。
Local Variables
これを回避するためにLocal Variablesという仕組みがあります。
Local VariablesはこのBehavior Tree内で共有される変数です。
Local Variablesを作るにはVariablesタブからNameとTypeを入力しAddボタンを押します。
するとその下に作成された変数の情報が追加されるので、ここに前節のGameObjectを指定します。
あとはこれをTaskから参照します。
TaskのInspectorの黒丸が表示されているボタンをクリックします。
するとオブジェクトのフィールドがドロップダウンに切り替わるので、
ここから先ほど作ったLocal VariablesであるTargetを選択します。
これでTaskからLocal Variablesが参照できるようになりました。
Dynamic Variables
Local Variablesと似たような機能にDynamic Variablesがあります。
Dynamic Variablesを使うにはまず変数フィールドのドロップダウンからをDynamicを選択します。
そして任意の文字列を入力します。
そしてこれと同じ変数を使いたいTaskのフィールドにも同じ操作を行います。
これによりTask間で同じ名前の変数が共有されます。
ただしこのままでは、Local Variablesと違ってこの変数に何も代入されていません。
従って、下図のようにFindタスクで代入したり、スクリプトから代入する必要があります。
Dynamic Variablesは少数のTaskでだけしか共有しない変数を定義するのに便利ですが、
結局変数名をすべてのTaskに入力しなければならないため、
Local Variablesのほうがわかりやすくてミスは起こりづらいかと思います。
Global Variables
他のBehavior Treeとも値を共有できるGlobal Variablesというものも存在します。
Global Variablesを作るにはVariablesタブからGlobal Variablesボタンを押します。
するとGlobal Variables設定用のウィンドウが開かれます。
あとの要領はLocal Variablesと同様です。
ちなみにGlobal VariablesはAssets/Behavior Designer/ResourcesにScriptable Objectとして保存されています。
スクリプトから操作する
これらの変数はスクリプトからも代入/取得できます。
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);