まきゼミ技事録!

とあるゼミのプログラマー達が送る技術ブログのようなもの

Behavior Designerについて

さんかくです。(/・ω・)/

今回はUnityのAIを簡単に実装できるアセット
「Behavior Designer」(有料)を紹介したいと思います。

assetstore.unity.com

お品書き
  • Behavior Designerとは
  • タスク紹介
  • 簡単な使い方の例

Behavior Designerとは

このアセットではビヘイビアツリーというAIの思考・行動などを決める手法をUnity上で簡単に実装することができます。
ビヘイビアツリーは思考・行動をツリー(木)構造にし、状況に合わせて分岐させ、行動を決めることができます。

例えば、
敵が近くにいたら 攻撃
敵が遠くにいたら 近づく
などをすることができます。
f:id:MakiZemi:20180719003505p:plain:w200
また視覚的にも見やすく、すでに用意されているタスクを組み合わせるだけで簡単にAIが作成できます。
下の画像の左側のようにタスクが様々用意されてます。
これをポチポチして画像右側に配置、後は線をくっつけるだけでできます。

また、すでに用意されているタスクだけでなく、もちろん自分でタスクを作ることもできます。
f:id:MakiZemi:20180719004132p:plain

ドキュメント(英語)や動画(英語)もあるので勉強しやすいですね!(動画、ドキュメントもちろんグーグル翻訳して見ました(;'∀'))

タスク紹介

ドキュメントを見れば大体わかるは思うので簡単に説明します。
f:id:MakiZemi:20180719005613p:plain

  • Sequence:

子タスクを左から順番に実行、
trueが出た場合次の子タスクへ、全てtrueの場合trueが返される。
falseの場合、即終了しfalseを返す。

  • Selector:

子タスクを左から順番に実行、
trueが出た場合即終了、trueを返す。
falseの場合、次の子タスクへ移る、全てfalseでfalseが返される。

  • Parallel:

全ての子タスクを同時に実行、falseが出たら全て終了される、trueが出た場合は他のタスクは継続される。

  • ParallelSelector;

(Parallelの逆)全ての子タスクを同時に実行、trueが出たら全て終了される、falseが出た場合は他のタスクは継続される。

  • ParallelComplete:

子のどれかが結果を返したら終了、false・trueは関係ない。

簡単な使い方の例

先ほど図にした
敵が近ければ攻撃、敵が遠ければ近づく というのをやりたいと思います。
またついでに敵が近い場合は、敵の方向を向いて攻撃させたいので、敵のほうへ向かせる処理も加えます。
本当はアニメーションなども必要ですが、今回は省略します。

敵との距離の比較は
「Float Comparison」という用意されているタスクを使います。
Conditionals/Basic/Mathにあります。
・↓FloatComparisonのInspector
f:id:MakiZemi:20180719012053p:plain
これのOperationでどのように値を比較するか設定できます。
今回は敵との距離が攻撃の当たる距離よりも小さくなって欲しいのでLessThanでFloat1がFloat2よりも小さかったらtrueにするようにします。
EnemyDistanceは敵との距離、HitSordDistanceは攻撃の届く範囲となっています。
数字を入力することもできますが、このように変数を使うにはVariablesタブで変数を作ることができます。
f:id:MakiZemi:20180719012621p:plain
作成した後FloatComparisonのInspectorでFloat1などの右にある丸を押して適用することができます。

攻撃が当たる距離なら相手のほうを向かせます。
それにはLookAtを使用します。こちらもInspecto上でTargetGameObjectに実際に向かせるもの、つまりAI自身を指定、TargetLookAtに向かせたい位置を設定します。この場合はプレイヤーを攻撃するということにして、プレイヤーの座標を指定します。

向き終わった後は攻撃アクションをさせますがこれは個々で違うと思うので省略させてもらいます。

もし、敵に遠い場合は近づくにはSet Destinationを使います。
この場合、ナビメッシュなどを使いますがいいサイトさんがあるので説明は省略します。
www.asset-sale.net


そしてこちらの部品を組み合わせることによって完成するのが下の画像の通りです。
f:id:MakiZemi:20180719011231p:plain
動きとしては、Selector,Sequenceともに一番左側にあるFloatComparisonを判定します。これがもし成功でない場合はSequenceは即終了となります、ここでSelectorにfalseを返しますが、Sequenceはtrueが出るまで続けるので、無事に敵に近づくを実行することができます。
もし敵に当たる距離だった場合は次の相手に方向を向き、攻撃を行いことができSelectorにtrueを返すことができ、ここで終了します。

また普通に実装してしまうと、敵と遠くて近づくを実行した場合、武器が当たる距離になっても近づくを優先してしまいます。その場合はSelector,Sequenceについている記号、「AbortType」を設定することによって近づいてる最中でも武器が届く距離か再判定してくれます。それについてはこちらのサイトさんが説明してくれています。
kurihara-n.hatenablog.com

終わりに

そこまでこのアセットについて書いてある技術ブログがなかったので、しょうがなく公式サイトで勉強しました(笑)
様々な公式サイトの堅苦しい感じが苦手なのですが頑張って慣れていきたいです(/ω\)