【Unity 6】新公式パッケージ「Unity Behaviur」の概要と拡張性を覗き見したい【Behaviourじゃないんかい】

# 自己紹介
サマーインターンで色々なところを周って、楽しい人
直近、CyberAgentでインターンさせてもらった記事が公開されているので、良かったらご覧ください。

https://t.co/XPXCDWqb4d

## 注意事項
この記事は、私がパッケージを知ってから日が浅く間違っている可能性もあります。
もちろん、なるべく間違っていない情報を出す努力をしますが、概要をサクッっと掴みたいという程度の意識で読んでください。

# Unity Behaviurとは
Unity公式が、Unity Muse（Unityの生成AI周りのツール）をリリースしたときと同時にリリースされたらしいBihaviur Treeのパッケージ。と紹介されているが、実際はノードベースの編集ツールの様子。
直近も更新が入った。

https://discussions.unity.com/t/behavior-package-1-0-1-is-released-update-1-0-2-is-out/1521797

LLM周り用として開発されていますが、全くそれ専用に設計されていないので、超スーパーエキサイティングなパッケージです。

## 使い方
マニュアルを見て～というのが一番早いですかね？

https://docs.unity3d.com/Packages/com.unity.behavior@1.0/manual/get-started.html

とはいっても、簡潔に書きたいと思います。
### アセットの編集
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083521/181263f3-cf58-be43-c5e0-18808d303fa8.png)

上記のような自然言語風のノードベースで編集するモノ。自然言語風なのは生成AIがこういったノードの名前を生成する想定だからって感じですね。
Blackboardは独自の変数を置く場所、Inspectorはノードなどの情報が表示されます。

### 動作させるには
動作させるときは`BehaviorAgent`というコンポーネントを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083521/1afc0316-7e69-ec90-9df8-ce7f5bb91b4e.png)

これによって、自動的に再生されます。

### Graph Viewとの違い
Graph Viewはあくまで、データをノードごとに移動して処理していくことで、最終的なアウトプットを出力するというノードでした。
しかし、Behaviurはノードベースのコーディングツールという印象で、処理を順番に実行していくことに向いています。詳細は拡張性についての部分で触れたいと思います。

# 拡張性について
ここからは、いくつかの点でこのパッケージが圧倒的に有用であると感じた点に触れつつ、拡張性について考察します。
## Unity Behaviurの凄さ
Behaviurは拡張性が圧倒的に高くなるように設計されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083521/2660a511-4cc4-d922-ef7b-795868293fb5.png)

右クリックメニューには`Create new Action...`というボタンがあり、ここで独自のアクションを生成できます。
ゲームオブジェクトをまっすぐ進ませることを想定したアクションを作成してみます。以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083521/0010744d-65cf-13f9-fa39-cdd3a84eebec.png)

ここが自然言語風になっているのもとても良いですね。
そうすると、CSスクリプトが生成されます。

```cs:Test.cs
using System;
using Unity.Behavior;
using UnityEngine;
using Action = Unity.Behavior.Action;
using Unity.Properties;

[Serializable, GeneratePropertyBag]
[NodeDescription(name: "Test", story: "[I] Go Straight", category: "Action", id: "39dd0085ca3c3dab35ee29c0dd9a8cd4")]
public partial class TestAction : Action
{
    [SerializeReference] public BlackboardVariable<GameObject> I;
    protected override Status OnStart()
    {
        return Status.Running;
    }

    protected override Status OnUpdate()
    {
        return Status.Success;
    }

    protected override void OnEnd()
    {
    }
}


```

ある程度のひな型がすぐ生成されるのです。
このひな形をもとに、処理を書いていきます。
「凄すぎ」

これだけで、圧倒的な凄さが分かると思います。

## Graph Agentの仕事
先ほど、`Graph Agent`というコンポーネントを使用して再生するという話をしました。
コイツはどのような仕事をしているのでしょうか。

正解は「ほぼなにもしていない」です。
インスペクターからアタッチする部分や、初期化など一般的な処理をしているようですが、サンプルを動かすだけなら以下のコードでも十分でした。（恐らく例外処理等、必要なことはまだまだあります。）

```cs
using System;
using Unity.Behavior;
using UnityEngine;

public class BehaviurGhraphTest : MonoBehaviour
{
    [SerializeField] private BehaviorGraph _graph;
    [SerializeField] private GameObject _self;
    private void Start()
    {
        _graph.BlackboardReference.SetVariableValue<GameObject>("Self", _self);
        _graph.Start();
    }

    private void Update()
    {
        _graph.Tick();
    }
}
```

ここから分かる通り、非常に汎用性が高くなにもAIにのみ使えるものではありません。
もちろん、`BehaviurGraph`自体もノードを実行する処理が書かれているだけであり、全て独自ノードを動かして、作成できます。

# その他共有
急に業務感ありますが、デバックする際にバグを踏んだので共有
- 自然言語風のものに`GameObject`という名前を付けて、`GameObject`型にすると死にました。

# おわりに
流石に出来が良すぎて、興奮してしまいました。
今後は少し実際にこれを使ってツールを開発してみようと思います。
ちょうど、`ConversationGraph`という私の独自パッケージがこれにとても相性が良さそうなので、GraphViewから移行して移行してみようかと…

https://github.com/PrashaltGames/Unity-ConversationGraph

ではでは！良いUnityライフを！！