【Unity】Unity謹製ビヘイビアツリー「Unity Behavior」の使い方まとめ

Unity謹製ビヘイビアツリー「Unity Behavior」の使い方についてまとめました。

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 ノードの下部からドラッグ&ドロップで接続します。

Sequenceノード

同様に Wait ノードと Log Message ノードを下図のように接続・設定し、「1秒おきにTestというログを出力する」グラフを作成します。

グラフを作成

実行する

このグラフを実行するには、適当な GameObject に Behavior Agent コンポーネントをアタッチし、Behavior Graph プロパティに上記で作ったアセットをアサインします。

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に設定しました。

WaitSecを設定

この状態で再生すると、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 にしておくことに注意してください。

Actionを入力

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、その他各種ノードなどがあります。

参考

docs.unity3d.com