LoginSignup
22
33

More than 3 years have passed since last update.

Unity + Arborで敵AIを作るならこれだけは覚えておけ!集〜ビヘイビアツリー編〜

Last updated at Posted at 2021-01-31

Unityで敵AIを組む方法は様々ですが、Arborというアセットが便利です。
とても便利なアセットですが、自分で拡張して使っていく時の情報が少なく感じており、敵AIをビヘイビアツリーで組むときにポイントとなる要素をまとめました!
誰かの助けになれば幸いであります。

環境
Unity 2020.2.1f1
Arbor 3.7.8

前置きのいらない人は本編からどうぞー

ビヘイビアツリーとは

敵AIなどを作成する際の手法の一つです。
現在のゲームの敵AIの多くがビヘイビアツリーで組まれているそうです(参考:https://thinkit.co.jp/article/10012 )。

  • ツリー状の構造によって、次に行う行動を決定する
    • 「成功」が帰ってくるノードを順に探索し、子ノードを実行する(ArborだとSelector)
    • 「失敗」が帰ってくるまで子ノードを順に実行する(ArborだとSequencer)
    • などのノードから構成される

Arborとは

アセットストア:Arbor3
公式ページ:https://arbor.caitsithware.com

  • Unityのアセットで、ステートマシンやビヘイビアツリーを作成することができる
  • ビジュアルスクリプティング(GUIを使用して視覚的にスクリプトを組むこと)によって挙動を組んでいく
  • メリット

ちなみに入門するには?

公式ページのチュートリアルが充実しているのでオススメです!
これで十分!
https://arbor.caitsithware.com/tutorial/

Arborで敵AIを作るならこれだけは覚えておけ!集

ビヘイビアツリーの基本要素

実はこのページにまとまっているのですが、実例を交えてわかりやすく解説してみます。

コンポジットノード

Selector

image.png
子ノードを左から順に実行し、子ノードが成功を返した時点で終了するノード。

例えば子ノードに、それぞれHPが5割以下HPが8割以下という条件判定するノードが紐づいている場合を考えましょう。
敵HPが6割であれば、HPが5割以下は条件を満たさない、HPが8割以下は条件を満たすのでそのノードを実行して終わる、といった使い方ができます。

Sequencer

image.png
子ノードを左から順に実行し、子ノードが 失敗を返した時点で終了するノード。

基本的な使い方は、紐づいた複数の子ノードを順番に実行していきたいときに使います。
例えば、アニメーション再生ダメージ適用3秒待つなどの動作(Action)を紐づけて順番に実行することができます。

アクションノード

image.png
アクションを行うノードです。
ビヘイビアツリーを使うときは、アクションを拡張して量産することになると思います。

組み込みで入っているアクションは、~秒待つActiveを切り替える音を再生するなどなど。
敵AIに使う場合は、例えばダメージを与える攻撃アラートを表示するなど、自分で多彩な行動を作ることになると思います。

アクションノードの自作

ここのマニュアルが参考になります。
詳細には書きませんが、基本的な流れは以下のような感じです。

  • ActionBehaviourを継承したクラスを作成する
  • OnExecute()メソッドをオーバーライドし、挙動を自分で定義する
  • OnExecute()メソッドの最後にFinishExecute()を呼んでノードを終了する
    • これやらないと永遠にそのアクションを実行し続けるので注意!毎フレーム攻撃とかになるよ!

Decoratorスクリプト

スクリーンショット 2021-01-30 17.59.32.png
条件判定を行って実行中ノードの中断や割り込みを行ったりするスクリプトです。
アクションノードの頻度ほどではないかもですが、こちらも自作することが多くなると思います。

上の画像では、自作の死亡フラグチェックDecoratorがアタッチされています。
敵キャラの死亡フラグが立ったら条件を満たす という処理が書いてある感じです。

例ではアクションノードにアタッチされていますが、コンポジットノードにアタッチすることもできます。
このDecoratorが返す成功/失敗、アクションノードが返す成功/失敗でSelectorやSequencerで実行する処理が分岐します!

Decoratorの自作

ここのマニュアルが参考になります。
基本的な流れは以下の通りです。

  • Decoratorを継承したクラスを作る
  • OnConditionCheck()メソッドをオーバーライドし、成功/失敗を表すtrue/falseを戻り値として返す

自作するときに便利なやつら

Flexible~シリーズ

Actionノードにて、publicもしくは[SerializeField]な変数を追加すると、GUIのノード上で値が設定できるようになります。
が、生の型を使って定義するのはもったいない!
Flexibleシリーズがオススメです

例えば、攻撃力的な変数を定義するときにこんな感じで定義できます

// 引数は初期値
[SerializeField] private FlexibleInt power = new FlexibleInt(30);

こう書くと何が嬉しいのか...

  • 他のOutput系ノードから値を引っ張ってこれる
  • パラメータを直接参照できる
  • そのまま直接値を入力可能

...と、いろんな値の設定パターンができるようになります!
こんな感じ
image.png

上の例だと、PowerはFlexibleInt、RangeはFlexibleFloatで定義してあり、標準でよく使われる型のFlexible〜が用意されています。
設定の右の▼から設定タイプを変更できます。

スクリプト内で実際の値を使用する際は、valueを使用します。

power.value

OutputSlot〜シリーズ

入力値としてFlexibleシリーズはとても便利ですが、ここぞというときに出力を行うOutputSlotを使用すると、値を渡すことができてさらに便利です。

[SerializeField] private OutputSlotFloat castTimeOutput = new OutputSlotFloat();

image.png

上の例だと、castTimeOutputが出力されて、WaitのSecondsに値が渡されるようになっています。

OutputSlot~を使用するときのメリットはこんな感じでしょうか。()内が一番大事かも...

  • 値を流せるので、手動で値を入力しなくて良い(手入力が減ってミスが防げる)

OutputSlotにはちゃんと値を入れてあげましょう。
アクションノードのOnExecute()で値を入れてあげると良いと思います。

castTimeOutput.SetValue(castTime.value);

知っていると便利なチョイテクニック

一回だけ行動させる

例えば、HPが〜割切ったら一回だけ技を発動させる。みたいなパターンです。
もちろんそういうスクリプトを組んでしまえばいいと思うんですが、汎用性を高めるためにもarborの機能で作るのがオススメです。

arborには、一つのビヘイビアツリー内で使用できるパラメーターを設定することができ、コレを使用しフラグを作成して実現させます。
image.png
ArborEditorウィンドウの左のパラメータメニューから作成できます。
ここから、bool型のパラメータを追加します。
パラメータが追加できたら、組み込みのParameter CheckDecoratorを使用します。

パラメータの赤い(型によって色は変わります)図形をドラッグして、Parameter checkにドロップすればパラメータを参照することができます。
image.png
このDecoratorは、パラメータをチェックして、設定値と一致する場合は成功を返す挙動をします。
今回は、攻撃完了フラグがfalseなら成功を返すようにしています。

次に、アクション終了後にこのフラグをtrueにするSet Parameterアクションノードを追加してあげれば完了です。
こちらのノードにもパラメータをドラッグ&ドロップしましょう。
値はtrueにしたいので、Valueにチェックをするのを忘れずに。
全体だとこんな感じです。
image.png
これで1回だけ行動する(1回だけ成功をDecoratorが返す)ことができるようになりました!

グループ

ノードをグループ化できます。
これをやっておかないと、ノードを複数まとめて移動したいときに辛いです。
何もない空間で右クリック、グループを作成から作成できます。
灰色の枠が出てきたら、グループ化させたいノード達を覆うようにサイズを変更しましょう。
image.png

コメント

その名の通りコメントが残せます。

ノードコメント

image.png
ノードの歯車マークから追加できます。
ノードに対するコメントに使用しましょう。

コメントノード

image.png
ノードとしてコメントを残せます。
ビヘイビアツリー全体に関してのコメントや、目立たせたいコメントに使えそうです。

グループコメント

image.png
グループに対してコメントを残せます。

まとめ

Arborで敵AIを自作するときに使えそうな事柄をまとめてみました。
これだけ知っていれば、自作のビヘイビアツリーもいい感じに組めるかと思います!

さらなるテクニックとして、挙動をまとめてプレハブ化、再利用しやすくするというのがあるんですが、チョイ複雑なので別の機会に解説できればと思います!

[追記]ビヘイビアツリーでの敵AIデータ再利用方法を解説した記事はこちら

22
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
33