Unity謹製ビヘイビアツリー「Unity Behavior」の使い方についてまとめました。
- Unity Behaviorとは?
- セットアップ
- 簡単なツリーを作る
- 実行する
- Blackboardを使う
- Blackboardを書き換える
- カスタムノードを作成する
- 列挙型とSwitchノードで状態を管理する
- 生成AI機能
- その他の機能
- 参考
Unity6000.0.25f1
Behavior 1.0.3
Muse Common Library 2.0.6
Unity Behaviorとは?
Unity Behaviorとは、Unity公式が開発しているビヘイビアツリーのパッケージです。
似たようなツールとして公式の Visual Scripting (元Bolt) がありますが、これにはビヘイビアツリーの機能が搭載されていないため、ビヘイビアツリーとしては初の公式実装となります(多分)。
元々、この Unity Behavior は Unity の AI ツール群である Unity Muse の一部として Muse Behavior という名前で開発されていました。
Unity Muse は有料ですが、Muse Behavior から AI の機能を除いた純粋なビヘイビアツリーを無料のパッケージとして公開したものが Unity Behavior となります。
本記事ではこの Muse Behavior パッケージについて紹介します。
なお、ビヘイビアツリー自体の基礎知識については割愛しますので、必要に応じて他のサイトを参照してください。
また、Muse Behavior には Unity6 が必要なのでご注意ください。
セットアップ
インストールは以下の手順で行います。
- Window > Package Manager
- 左上の「+」ボタン > Install package by name..
- com.unity.behaviorと入力
インストール方法は変わりそうな気もするので、もしうまく行かなかったらドキュメントを確認してください。
簡単なツリーを作る
それでは早速簡単なツリーを作ってみます。
まず、Projectビューで右クリック > Create > Behavior > Behavior Graph からビヘイビアグラフのアセットを作成します。
生成されたアセットをダブルクリックしてビヘイビアグラフウィンドウを開きます。
この画面でスペースを押下するとノード検索ダイアログが開きます。
今回は試しに Sequence と検索して Sequence ノードを追加し、OnStart ノードの下部からドラッグ&ドロップで接続します。
同様に Wait ノードと Log Message ノードを下図のように接続・設定し、「1秒おきにTestというログを出力する」グラフを作成します。
実行する
このグラフを実行するには、適当な GameObject に Behavior Agent コンポーネントをアタッチし、Behavior Graph プロパティに上記で作ったアセットをアサインします。
この状態でシーンを再生すると、1秒おきにTestとログ出力されることを確認できます。
なお、グラフのウィンドウの左上のDebugボタンを押下してから対象の GameObject の名前を選ぶと、その GameObject におけるグラフの実行状態をデバッグできます。
デバッグを有効にした状態でシーンを再生すると、実行中のノードが可視化されることを確認できます。
Blackboardを使う
次にBlackboardを使ってみます。Blackboard を使うとグラフで使う変数を格納しておけます。
グラフウィンドウの Blackboard パネルの+ボタン > Basic Types > Float から Float 型の変数を追加します。
名前は WaitSec にしました。
次に先ほど作った Wait ノードのインプットフィールドの右側にあるリンクボタンをクリックし、WaitSec 変数と紐づけます。
Blackboard に追加した変数は Behavior Agent コンポーネントの Blackboard Variables から値を変更できます。
今回は WaitSec を2に設定しました。
この状態で再生すると、2秒に一回ログ出力が行われることを確認できます。
Blackboardを書き換える
次に Set Variable Value ノードを追加して以下のように WaitSec を5に書き換えてみます。
この状態で再生すると、最初は2秒後にログ出力され、そのあとは5秒おきにログ出力されることを確認できます。
ちなみに Blackboard の変数の値は以下のようにスクリプトから書き換えることもできます。
using Unity.Behavior; using UnityEngine; public class Example : MonoBehaviour { [SerializeField] private BehaviorGraphAgent agent; private void Start() { // Blackboardの値を書き換える agent.BlackboardReference.SetVariableValue("WaitSec", 10.0f); } private void Reset() { agent = GetComponent<BehaviorGraphAgent>(); } }
カスタムノードを作成する
次にカスタムノードを作っていきます。
今回はシンプルに Blackboard の変数をインクリメントするだけのノードを作成します。
カスタムノードを作成するには、グラフウィンドウ上で 右クリック > Create new > Action を選択し、現れるダイアログで下図のように入力します。
Nextを押下すると次のページに遷移するので、下図のように入力します。
variable を Float にしておくことに注意してください。
Createボタンを押下すると、このカスタムノードのスクリプトを保存する場所を選択するパネルが出るので適当な場所を選択して保存します。
保存後、以下のような Action ノードのテンプレート処理が書かれたスクリプトが生成され、エディタが開かれます。
このスクリプトには実際のインクリメント処理は書かれていないので、コメントアウトした部分だけ追加します。ノードが実行された時の変数をインクリメントしています。
using System; using Unity.Behavior; using UnityEngine; using Action = Unity.Behavior.Action; using Unity.Properties; [Serializable, GeneratePropertyBag] [NodeDescription(name: "Increment", story: "Increment [variable]", category: "Action/Blackboard", id: "91ad4192c01dd4ffd18e105c5701b8fd")] public partial class IncrementAction : Action { [SerializeReference] public BlackboardVariable<float> Variable; protected override Status OnStart() { return Status.Running; } protected override Status OnUpdate() { Variable.Value += 1; // ここだけ追加 return Status.Success; } protected override void OnEnd() { } }
グラフウィンドウに戻って、作成した Increment ノードを追加し、WaitSec 変数を設定します。
このノードを Set Variable ノードと差し替えます。
これを再生すると、だんだんとログ出力までの時間が延びていくことを確認できます。
なおC#スクリプトはテンプレートを作成せずに直接作っても問題ありませんが、仕様変更など考えると上記の公式のフローで作っておいた方が無難かと思います。
列挙型とSwitchノードで状態を管理する
さて、AIを作る上で状態の管理は重要なので、次に状態を管理するための列挙型変数を作っていきます。
まず、Blackboard の「+」ボタン > Enumeration > Create new enum type を選択し、現れたダイアログに下図のように入力し、Createボタンを押下してスクリプトを保存します。
次に Blackboard 変数として、作成した ExampleState 型の変数を追加します。
次に Switch ノードを作成し、Enumとして上記の State を設定します。
すると State の状態により処理が分岐するグラフが生成されます。
これと今まで作成したノードを使って、下図のようにグラフを組みます。
これを実行すると、まず Wait 状態で待機を行ってから Increment 状態に遷移し、Increment 状態になるとログ出力をしつつ待機時間を追加してまた Wait 状態に戻す、という挙動を確認することができます。
生成AI機能
Unity Behavior を Muse(有料)と連携すると、自然言語で指示したグラフを作ることができます。
Muse との連携手順は以下のとおりです。
- Museに登録・課金(今後変わりそうなので詳細省略)
- Package Manager から com.unity.muse.common をインストール
- Behavior Graphウィンドウで右クリック → Generate branch from text を選択
- 自然言語で作りたいグラフを指示
試しに使ってみるために、実際に以下のように指示してみました。
- まず「WaitSec」の秒数だけ待機し、その後ExampleState型のBlackboard変数「State」を「Increment」に設定する
すると下図の結果が得られました。
AI の方は State を Increment に変えたいところが Wait になってしまっていますが、それ以外は期待する結果が得られています。
また、AI の生成物から、よりシンプルなノードの組み方ができることを学べました。
自分でノードを組む前の土台としてAIに作ってもらうという使い方は有効にできそうです(課金の価値があるかは人それぞれかな・・)。
その他の機能
以上、Unity Behavior の基本的なグラフの作成方法を紹介しました。
その他紹介していない機能として、グラフを入れ子にできるサブグラフや、メモを追加できるSticky Note、その他各種ノードなどがあります。