single.php

UEのビヘイビアツリーを簡単に説明してみる(その1)

Unreal Engine 5で開発する過程で、ビヘイビアツリー(Behavior Tree)を使ってキャラクターの移動に挑戦してみました。仕組みが遠回りすぎたので個人的な理解を備忘録的に投稿します。

ビヘイビアツリーの仕組み

Unreal Engineのキャラクターを移動させる場合に、ビヘイビアツリーを使ってAIを使う仕組みがあります。

以前は、Tickイベントなどでフレーム単位でプレイヤーに近づいていくノードを組み合わせて移動させていましたが、ビヘイビアツリーだと自然にプレイヤーを追いかける挙動が再現できます。

いざ使ってみると、新しいキーワードや設定が多すぎて訳が分からなくなりましたが、基本的な動作が理解できてくると敵キャラの挙動に幅が生まれます。

まず、ビヘイビアツリーの仕組みを実際の敵キャラの動きに例えると、こんな感じになります。

端的に説明すると、ツリーと言う名前が付いているので、矢印で枝に分かれてキャラクターの動作を切り替える仕組みです。

説明の都合で簡単な行動になっていますが、キャラクターがスポーンで[開始]から[行動選択]に移ります。

[行動選択]では、イベントグラフのTickイベントのように定期的に処理が実行されて行動を変化するための条件を作ります(図では「目標まで5メートル」が条件)。

作られた条件が評価(5メートル未満 OR 5メートル以上)されて、キャラクターの行動が実行されます。

これがビヘイビアツリーの基本的な仕組みです。

ビヘイビアツリーの使い方

UnrealEngineでビヘイビアツリーを動作させるための各種設定と用意する処理です。

先述のイメージ図の説明文を、UEで使われるキーワードにすると、こうなります。

  • [ルート(ROOT)]:ビヘイビアツリー処理の起点
  • [セレクター(SELECTOR)]:複数の行動を切り替えるための分岐点
  • [ビヘイビアツリーサービス]:評価を行う材料を作る処理
  • [デコレーター]:行動を切り替える評価を行う処理
  • [タスク]:キャラクターのアニメーション変更など行動を発生させる処理

また、実際にビヘイビアツリーではこんな形で行動を変化させています。

  • [ブラックボード]:[キー]を追加して、イベントグラフの変数のように値の取得や設定ができます。
  • [ビヘイビアツリーサービス]:[セレクター]や[タスク]に配置して、イベントグラフのように処理を行います。
  • [デコレーター]:処理したキーなどを基準に行動を切り替えるための評価を行います。

上の画像でビヘイビアツリーを動作させた場合、スポーンしたキャラクターの行動は次の様に決定します。

  1. [開始]から[行動選択]に遷移
  2. [ビヘイビアツリーサービス]が一定間隔(既定値は0.5秒)で処理され目標との距離を計測してキーに設定
  3. [デコレーター]がキーの値を評価して条件([キー]>5メートル)に合致した行動(走る)を決定
  4. [タスク]がキャラクターにアニメーションの再生などを実行

また、[キャラクター]のイベントグラフなどからも[ブラックボード]の[キー]を直接変更してビヘイビアツリーの行動を決定することも可能です。

その際は[キャラクター]ブループリントのイベントグラフから[AIコントローラークラス]→[Use Blackboard]ノードを使って[ブラックボード]の[キー]にアクセスできます。

こんな感じで、ビヘイビアツリーでキャラクターの行動を制御することが可能です。かなり複雑な構成になっています。

しかし、作ってしまうとイベントグラフでノードを組み合わせてキャラクターの動作を作るよりも遥かに自然なキャラクターの行動ができあがります。

次回は、実際にビヘイビアツリーを使ってキャラクターの行動を作るための手順を書いていきます。

まとめ

今回は、Unreal Engine 5で開発する過程で、ビヘイビアツリー(Behavior Tree)を使ってキャラクターを移動する仕組みについて個人的なな理解を書きました。

用意するブループリントや、設定などが多く仕組みも複雑で最初は、理解するのに時間がかかりますが、一度作ってみるとイベントグラフでキャラクターの移動を組み上げるよりも遥かに自然な行動をキャラクターに追加ができます。

Unreal Engine でビヘイビアツリー(Behavior Tree)を使ってキャラクターを移動したい人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です