Blog

R&D雑記

Unity Behavior 触った感想戦

「ゲームエンジンについての研究」の第1回目です。

プログラマーの藤原です。子どもが2歳になって、一緒に遊んだりできることが増え、今が楽しい時期です。ただ、しっかり自我が芽生えてきたので、色々説得するのも大変だったりします……。アイスクリームをとても欲しています。

さて、第1回目となる今回は、開発環境が Unity 6 をベースとするようになった今だからこそ、自分がまだ触れられていない「Behavior」について、調べながら紹介していけたらと思います。

環境
Unity 6000.0.32
Behavior 1.0.11


Unity Behavior とは?

ノードベースのビジュアルツールで、キャラクターやオブジェクトのAI挙動を直感的に構築・制御できるUnity公式のパッケージになります。

公式ドキュメント:About Unity Behavior
https://docs.unity3d.com/Packages/com.unity.behavior@1.0/manual/index.html

使用手順について

まず、Unity Package Manager → Unity Registry → Behavior でインストールします。次に、プロジェクトビューで右クリックし、Create → Behavior → Behavior Graph でグラフアセットを作成。ヒエラルキー内のGameObjectに Behavior Agent を追加し、グラフを割り当てれば動作します。

さすがUnity製。ここまでスムーズに対応できました。(駆け足)

Behavior Graph の主な要素

  • Blackboard:グラフ内で使用する変数(値やUnityオブジェクトなど)を定義。Agentから変更可能で、逆に変更不可にもできる。
  • Inspector:各ノードの詳細情報や設定を確認・編集。
LogMessage の文字列をログ出力してるだけ。

ノードの詳細は公式ドキュメントにまとまっているので、ここでは省略します。

公式ドキュメント:Behavior graph node types
https://docs.unity3d.com/Packages/com.unity.behavior@1.0/manual/node-types.html


とりあえず敵AIを作ってみよう

ビヘイビアツリーといえばやっぱり敵AI。簡単なサンプルを作って、シンプルな構成で動作確認します。

プレイヤー(赤)を追いかける敵(青)

思った以上に少ない構成でも、それっぽい挙動ができました。このあと各要素について、もう少し詳しく見ていきます。

開始時プレイヤーを見つける

Find With Tagアクションで、Playerタグのオブジェクトを検索し、Blackboardで定義したTargetPlayerにセットします。

Find ~ with tag: ~ って書いてあるから、最初はセットできるとは思わなかった。

プレイヤーを追いかける

Repeat フローによって続くノードをループ化して、Set Position To Target アクションで TargetPlayer の位置に向かって移動します。

敵がプレイヤーに向かって 1 秒かけて移動する。

デフォルトで用意されているノードが豊富なおかげで、ここまでは完全にノーコードで作成できました。特に BlackBoard と Inspector の関連付けにも慣れてきて、だんだん使い方がわかってきた気がします。


ゲーム性を加えて理解を深める

「中心に集まる敵を倒してコインを集めていく」のゲーム性を加えて、実践的な知識を学んでいこうかと思います。

もっとゲームっぽくしたかったけど、時間なくて素朴な感じになっちゃった。

今度はカスタムノードを作りつつ、いろいろなノードを使いました。同じく各要素について、詳しく見ていきます。

プレイヤーが見つかっているか判定

TargetPlayerが途中でDestroyされてMissingになるケースを考慮したチェックがデフォルトになかったため、カスタムコンディションを作成しました。

簡単に作れるぶん、チーム内共有しないと判定がかぶりそう。

プレイヤーが見つかってないので、移動しながら探索

Run In Parallelの並行処理で、TargetPlayerを探しつつ、カスタムアクションにより敵コンポーネントの移動処理によって画面中心に移動するようにしました。

画面中心に一定距離まで近づいたら、強制的にTargetPlayerをセットし、敵対行動に移行します。

UnityObject同士の距離判定はあるけど、座標指定がないのでカスタム条件を作成。

プレイヤーを見つけていたら攻撃

おなじみ Run In Parallel を使い、プレイヤーへ移動するカスタムアクションを実行しつつ、Cooldown フローで一定間隔(1秒ごと)にプレイヤーを攻撃する処理を並行して行います。

敵スポナーもBehavior Graphで制御

3〜8秒間隔で Random フローを使い、「普通なやつ」「速いやつ」「強いやつ」のいずれかの敵を生成するようにしました。

いろんな敵がでるのはゲームっぽい。

頑張れば、カスタムコンポーネントを使わずに、すべてBehavior Graphだけで完結できるかもしれないと感じました。


総評・まとめ

Unity Behavior は、開発内容によっては触れる機会自体がなかったかもしれないので、今回は良いきっかけになりました。実際に使ってみると、想像以上に癖がなく、不具合も見当たらず、使いやすい印象を受けました。

デフォルトノードの種類が豊富で説明も丁寧に記載されており、加えて中身のコードを直接確認できるため、仕組みの理解もしやすかったです。

カスタムアクションなどの拡張機能については今回は詳細を省きましたが、作成時にコードがほぼ自動生成される仕組みになっており、非常に手軽に作れると感じました。ただしその一方で、作成したカスタム機能をチーム内で適切に共有・整理しないと、スクリプトファイルが増えて管理が煩雑になる恐れもあると感じました。

現時点でも使い勝手がよく、開発時の選択肢として十分に取り入れられる機能だと感じました。今後はUnity公式のアップデートによってさらに機能が充実していく可能性もあり、今のうちに慣れておけば将来的な活用の幅も広がりそうです。

以上、長くなりましたが「ゲームエンジンについての研究」第1回はここまでとさせていただきます。
ここまでお読みいただきありがとうございました。

次の記事へ