【Unity】AI Behavior用マニュアル
こんにちは!ジェイです。アセットストアで敵AIを作る上で使えそうなAI Behavirorというアセットを見つけたので、マニュアルを作りました。具体的な使い方は、別にまた用意しますので、細かい機能の設定をしるためのものだと思ってください。
こちらなんと102.60$だったのが、無料になったものです。中身を空けてみるとボリュームにびっくりすると思います。
- 1. Setting up AI Behavior
- 2. 状態の種類
- 3. 攻撃状態とメカニム
- 4. Triggers
- 4.1. Global triggers
- 4.2. State triggers
- 4.3. General Trigger Settings
- 4.4. Types of triggers
- 4.5. Audio trigger
- 4.6. Within distance trigger
- 4.7. Beyond distance trigger
- 4.8. Check Variable Trigger
- 4.9. Current state trigger
- 4.10. Go to random state trigger
- 4.11. High health trigger
- 4.12. In same layer trigger
- 4.13. Is alive trigger
- 4.14. Is obstructed from players
- 4.15. Is on OffMeshLink trigger
- 4.16. Item count trigger
- 4.17. Key down trigger
- 4.18. Key up trigger
- 4.19. Low health trigger
- 4.20. Line of sight trigger
- 4.21. In player view trigger
- 4.22. No player in sight trigger
- 4.23. Path reachable trigger
- 4.24. Speed exceeded trigger
- 4.25. Timer trigger
- 4.26. Nesting triggers
Setting up AI Behavior
Components
最初に行うことは、空のGameObjectを作成し、それにキャラクター/アバターを追加することです。このゲームオブジェクトに「AIBehaviors」スクリプトを追加し、「NavMeshAgent」を配置します(いくつかのゲームオブジェクトとコンポーネントが自動的に追加されます)
また、レガシーアニメーションとメカニムアニメーションのどちらを使用するかに応じて、このゲームオブジェクトに「CharacterAnimator」または「MecanimAnimation」スクリプトを追加する必要があります。インスペクターでは、キャラクターが使用する様々な状態と、それぞれの条件とトリガーを設定できます。
General AI Properties
すべてのAIに適用される設定です。ここでは、AI、ヘルス、およびターゲットタグのサイトプロパティを設定できます(これはGeneral AI Propertiesで使用されるタグですが、各状態および各トリガーに特定のタグを設定することもできます)
また、ゲームで使用できるカスタム変数を追加し CheckVariableTriggerを呼び、特定の状態に入るときに変更したりすることもできます。許可されるタイプは、Floats、Integers、およびBooleansです。
Adding and Setting up States
状態を追加するには、緑色の[+]ボタンをクリックしてリストから使う状態の種類を設定します 。次に、状態ごとに、状態間で変更するプロパティとトリガーを設定します。注: これはデフォルトの状態です。カスタムの状態が必要な場合は、独自の状態を記述して(BaseStateを拡張して)、このリストに追加して表示されます。
アニメーションを設定するには、「AIAnimationStates」スクリプトに追加する必要があります(このスクリプトはAIBeahaviorsで自動的に追加されます)。MecanimアニメーションとLegacyアニメーションのどちらを使用するかによって、異なります。
Legacy animations
レガシーアニメーションでは、キャラクター/アバターにアニメーションを追加する必要があります。
次に、メインのGameObjectに戻り、アニメーションを「AIAnimationStates」スクリプトの「+」ボタンに追加し、先ほど設定したアニメーションと同じ名前を使用します。
最後に、各状態で使うアニメーションを選択します。複数のアニメーションを使用する事もできます。その場合、状態に入るたびにランダムなアニメーションが選択されます。
MecanimAnimations
MecanimAnimationは、アニメーターにcharacter/avatarのアバターを追加する必要があります。
このコントローラーでは、各レイヤーに「layers」と「states」があります。AIBehaviorスクリプトの状態を使用するには、アニメーションを「AIAnimationStates」スクリプトの「+」ボタンに追加し、レイヤーと状態の名前を指定する必要があります。(layer.stateの様に)AIが追加のコードなしでアニメーションを完全に制御できるようにする場合は、「cross fade in」および「cross fade out」オプションをチェックする必要があります。
最後に、各状態で、使用する必要のあるアニメーションを選択します。
様々なAIの動作を処理して、必要な数の状態を設定できます。また、同じ種類の複数の状態を設定することもできます(例:2つのAttackStates)
State Properties
State Propertiesは各状態ごとに設定します。まずは、編集する状態を左側の[Edit]ボタンをクリックし、インスペクターを、下にスクロールして設定を変更します。
General State Properties
すべての状態に共通するいくつかの設定があります。
- Is Enable : 状態を有効または無効にします(状態が無効の場合、AIは使用できません)
- Use Custom Tags : 1つの状態またはすべての状態のトリガーに使用されるタグ(独自のトリガーを除く)チェックしない場合、AIは一般的なAIターゲットタグを使用します)
- Triggers : ステータスを変更するトリガーの条件を指定できる
- Animations : 今の状態で再生するアニメーションを設定できる
- Movement Properties : 特定の状態でAIが移動および回転する速度を指定します。0にすると完全に移動や回転しなくなります。
- Audio:状態に入るときに再生されるサウンドを追加でき複数追加すると、ランダムに1つが選択されます。
- ItemSpawning:アイテムを出現する状態に入るときに、指定した場所に1つ以上のアイテムをスポーンできます。 「アイテムスポーンモード」オプションは次のとおりです。AI位置、特定の座標、または変換の受け渡し(スポーンポイントなど)
- Changing Variable Properties: カスタム変数(指定の値を変更できます)特定の値を設定するための[Change To]オプションと、[Increase by (増加)]と[Decrease by(減少)]があります。 intsおよびfloatの場合の変更は、状態に入るときに適用されます。
最後に、CooldownableStates、 Cooldownプロパティがあります。これには、状態を使用できなくなるする「Cooldown Time」を設定できます。
Start Cooldown On State Endにチェックを入れると、状態が終了したときにカウントを開始します。
チェックして、クールダウンを開始しない場合は、状態に入ったときに開始します。条件が一致していても、トリガーが無効にされてる場合、トリガーは発動しません。
状態の種類
Idle
アイドル状態は、AIはただその位置に留まります。唯一のオプションは、AIを常にプレーヤー/ターゲットに向けさせる「Rotate Towards Target」です。
Patorol
状態パトロール状態は、AIが特定のパスをたどって歩くようにするためのものです。「パトロールモード」では、4種類のパトロールから選択できます。
- Once(1回):パトロールを1回だけ実行してから、別の状態「パトロール移行の終了」に変更します。
- Loop(ループ):トリガーによって別の状態に変化するまで、常にパトロールを続けます。
- Ping Pong:パトロールは一方の方法で行い、終了するともう一方の方法で行います。
- Random(ランダム):ランダムに点を通るパトロール
- Reset(リセット):最初のポイントから開始
- Continue Previous(前): 最後に行ったポイントから前に進み続けます。
- Nearest Node(最も近いノード):AIに最も近いポイントを選択します。
- Nearest Next Node(最も近いノードの次):最も近いポイントの次のノードを選択します。
AIがパトロールするすべてのポイントを1つのGameObjectの下にグループ化し、「Patrol Points Group」にドラッグする必要があります。この時「Patrol Points Group」の親の座標がAIと同じ座標である必要があります。例として、以下のPatrolPathの座標とAIの座標が同じであるという意味です。
Distance Threshold(距離のしきい値)がポイントにどれだけ近づくかに従って決定します。Accurate Comering(正確なコーナリング)オプションがありますが、ポイントを通過する方法が気に入らない場合、またはポイントが欠落している場合(AIの動きが非常に速い場合など)にのみ使用してください。次にCornering Errorの値を設定します(通常は1)
Seek State
シーク状態は、プレイヤーを追いかけて攻撃したり、フォローしたり、オブジェクトを探したり、特定のポイントに移動したりするなど、さまざまな目的に使用できます。チェックする必要がある特定のポイントを設定できます。 [Seek Target]はドラッグすることによって、シークターゲットにします。そのオプションを選択しない場合、AIはターゲットタグを持つオブジェクトを検索します。
- NoSeekTarget Transitionは、ターゲットがない場合に変化する状態です。
- No Movement Transisionとは、何らかの理由(たとえば、ターゲットに到達できない)でAIが停止したときに入る状態です。
- SeekTargetReached Transitionとは、ターゲットに到達したときに変化する状態です(たとえば、AIがプレーヤーを追跡していて、プレーヤーに到達すると、AttackStateに変化します)
- Target Thresholdは、AIがターゲットにどれだけ近づくかを示す値です。
- Destroy Target When Reached 有効にすると、到達時にターゲットのGameObjectを破壊します。
- Distance To Target Thresholdは、AIがターゲットに近づく距離です。
Flee State
Flee Stateは、プレイヤーまたは他の何かから逃げるために使用されます。
Flee Modeは逃げる方法で以下の設定があります。
- Nearest Tagged Objectは「最も近いタグのついたオブジェクト」を示します。
- FixedTarget :逃げる場所をいくつか指定して、そのポイントを通って移動させることができます
- Direction:プレーヤー/オブジェクトがどこにあるかに関係なく、特定の方向に実行することです。
- Away from Nearest Tagged Object : AIが最も近いタグ付きオブジェクトから離れる方向に実行されます。
「Distance to target threshold(目標までの距離)」は、「safe space(安全な場所)」にどれだけ近づくかを示します。特定の方向で逃げる場合は、「StopFlee Distance」を設定する必要があります。
最後に、「FlightEnded Transition」は、行動が終了したときに入る状態です。
攻撃状態とメカニム
攻撃状態には、AIが攻撃したときに何をすべきかを知るための攻撃スクリプトが必要です。 「ExampleAttackComponent」を使用することも、独自に作成することもできます。それをルートGameObjectに追加し、AttackStateプロパティで、攻撃時に使用するメソッドを選択します。
攻撃プロパティでは、基本のAttack Damage(攻撃ダメージ)の量を設定し、追加できます。
- Plus Or Minus Damageはプラスまたはマイナスのダメージを設定
- Find Visible Targets Onlyは表示されるターゲットのみを検索(近接攻撃時には無効にする方がよい場合もあります)
- Inherit Previous State Movement(前の状態の動きを継承する)とは、前の状態が攻撃中に行うように指示したとおりにAIが動き続けることを意味します(たとえば、パトロールやシークを続ける)。
- Attack Based On(攻撃ベース)は、Attack Methodが呼び出されるます。アニメーションの特定のポイントに基づくことも、時間間隔を使用することもできます。
- Attacks Before Reload(リロード前の攻撃)は、リロード状態に変わる前に攻撃メソッドが呼び出される回数です。
- Attack countは、現在の攻撃数です。
- Reload Stateとは、攻撃限界回数に達したときの状態です。
- No Target Stateは、Targetが見つからなかったときに変化する状態です。
MecanimAttackStateは、Mecanimアニメーションを使用するように拡張したAttackStateとほぼ同じです。
LagacyAnimationの時には、AttackStateを使い、MecanimAnimationの時には、MecanimAttackStateを使うように注意してください!そうでなければ、AttackMethodが呼ばれないので注意してください。
Defend State
Defend Stateとは防御状態の事で、AIをDefend Positionに置き[Defensive Bonus]はダメージを計算のするためのボーナスのことです。
防御を開始および終了するときに呼び出すメソッドを備えた防御スクリプトが必要です。「ExampleDefendScript」を使用するか、独自のスクリプトを作成できます(このスクリプトは、防御中にダメージ乗数を防御ボーナス値に置き換えるだけです)。
Got Hit State
Got Hit Stateは、AI自身に攻撃がヒットしたときに発生するイベントのことです。
AIがこの状態にとどまる時間をHitStateDurationで設定できます
Return To Previous Stateにチェックを入れると、ヒットする前の状態に戻ります。
または「Change To State」で別の状態を選択することもできます。
Dead State
Dead Stateは、AIが死んだときに入る状態で、Destory Game Object のオプションは以下の通りです。
- Destory After Time : 指定された時間の後にゲームオブジェクトを破棄する
- Destory Colliders : Colliderを破棄して当たり判定を行わないようにする
- Destory Componets : その他のコンポーネントを破棄する。(ドラッグで破棄するコンボーネントをリストに追加できます)
- Change Tag : チェックをするとDead Tagに変更できる
Get Help State
Get Help Stateは、AIが他のHelp StateであるAIを呼び出すことができる方法です。(助けを求める)
注:他のAIは、呼び出しに応答できるようにHelpStateを持っている必要があります。
Help State
Help Stateは、Get Help Stateで呼び出してAIの方向に向かう状態です。(助けに行く)
- Number of Statesは、呼び出すAIの数です。
- Within Help Point Distanceは助けるAIの有効距離(この距離内にいるAIに助けに行きます)
- State When help point reachedはhelp pointに到達した時に移行する状態です。
注:他のAIは、呼び出しに応答できるようにHelpStateを持っている必要があります。
Off Mesh Link State
Off Mesh Link Stateは、AIをOffMeshLinkからジャンプさせるための状態です。
到達してから、AIの待機する時間を指定します。 Return To Previous Stateをチェックすると前の状態に戻るか、遷移状態ジャンプ後にAIが変化する状態を設定できます。
Change State
Change Stateは別のゲームオブジェクトを設定して全体のAIを交換できます。新しいGameObjectをまったく同じ位置と回転に配置します。
Change Tag State
Get Invisible State
Get Invisible Stateは、Disable Collidersは指定された時間AIを非表示にし、Durationで時間を指定します。
Return To Previous State はチェックされていた場合に、前の状態に戻ります。
Wander State
Wander Stateは、AIに具体的な目的地なしで歩き回らせます。レイキャストとAIの視覚特性を介して、AIが行くことができる場所を探します。
- Floor LayersにAIが歩けるLayerを設定できます。このレイヤーが設定されたゲームオブジェクトの上しかAIは歩けません。
- StayCloseToPointにチェックを入れると、歩く目標となる位置を設定できます。
- Anchor Pointは、移動の中心となる位置です。
- Max Distance From Anchorは、Anchor Pointで指定した座標からの最大距離を指定します。この値を大きくすればするほど行動範囲が広がります。
Step Back State
Step Back Stateは、プレイヤーまたは他のAIから距離を保つ必要があるAI(通常はNPC)用です。それはただターゲットに向かって後退します。
AIが離れプレーヤー/ターゲットとの距離がどれだけなのか指定できます。それは状態によって生成されたポイントを取得することを「stopThreshold」。平坦でない地形にいる場合は、おそらくこの値を増やす必要があります。距離に達すると、「Next Node」移行します。
Triggers
Global triggers
このトリガーは常にチェックされていて、条件が一致すると、AIが指定された状態に移行し、今の状態が何であれ中断されます。これは、State Triggerほど一般的には使用されません。任意の状態に適用される条件にのみ使用してください。Global Triggersを追加するには、[+]ボタンをクリックし、必要なトリガーの種類を選択して、プロパティを設定します。
State triggers
State triggersは、特定の状態内でチェックされる条件です。状態にトリガーを追加するには、インスペクターの「AIBehaviors」スクリプトで状態の左側にある編集ボタンをクリックし、トリガーセクションまでスクロールダウンします。次に、「+」ボタンをクリックしてトリガーを追加します。
General Trigger Settings
すべてのトリガーに共通の設定がいくつかありますが、各トリガーに個別に適用されます。
- Change to State : 条件が満たされたときにAIが変化する状態です。
- Use Custom Tags: チェックすると、特定のタグをトリガーに設定できます
- Invert Result : チェックすると、トリガーの結果が反対に変更されます。条件が満たされない場合は状態を変更します。
Types of triggers
Types of triggersには、それぞれに異なるプロパティと設定があります。
BaseTriggerスクリプトを拡張するだけで、特定の条件で独自のトリガーを作成することもできます。トリガーのリストに自動的に表示されます。
Audio trigger
AIが指定されたタグを持つGameObjectからのサウンドが「heard」かどうかをチェックします。音量トリガーレベルを聞きたい距離に応じて、Volume Trigger Levelを計算する必要があります。(この値が高いほど、聞こえにくくなります)。
「Audio Cache Point」は、シーンのソースがいつスキャンされるかを指定します。
「Set Audio Transform As Seek Target(オーディオ変換をシークターゲットとして設定)」オプションは、AudioSource GameObjectを選択し、それを特定のSeekStateのターゲットとして設定することです(この場合、Change to Stateで同じSeekStateを選択する必要があります)
Within distance trigger
指定されたタグを持つGameObjectが指定された距離よりも近いかどうかを確認します。CheckModeは、タグ付きのゲームオブジェクトまたはそれらすべてが距離内にあるかどうかを指定します。
Beyond distance trigger
AIターゲットタグを持つGameObjectが、指定されたDistanceよりも遠いかどうかをチェックします。 CheckModeは、タグ付きのゲームオブジェクトが距離を超えているかどうかを指定します。
Check Variable Trigger
AIカスタム変数を使用します。変数のタイプに応じて、さまざまなチェックを行うことができます。intおよびfloatの場合、「より大きい」、「より小さい」、または「等しい」をチェックできます。bool値の場合は「EqualTo」をチェックすることしかできません。他の場合は、意味がありません。
Current state trigger
AIが特定の状態にあるかどうかを確認します。これは、グローバルトリガーとして使用するだけの意味があります。
Go to random state trigger
ランダムに1つの状態に推移します。右側の数字は、各状態の確率です。この数値の合計は1以下である必要があります。
High health trigger
ヘルスが指定された量を超えているかどうかをチェックします。
In same layer trigger
AIが指定されたタグを持つGameObject / sと同じレイヤーにあるかどうかを確認します。
Is alive trigger
AIの状態をチェックして、AIが動作しているかどうかを確認します。通常、グローバルトリガー
として使用されます。
Is obstructed from players
AIとプレイヤー/ターゲットの間に何かがあるかどうかを、その向きに関係なくチェックできます。さらに最大距離を設定できます。
Is on OffMeshLink trigger
AIがOffMeshLink上にあるかどうかを確認します。
Item count trigger
指定されたタグでオブジェクトをカウントし、条件を比較します。
Key down trigger
キーが押されたかどうかを確認します。キーを押すと、指定した状態に変わります。
Key up trigger
キーを押すのを止めたかどうかをチェックします。
Low health trigger
BelowHealthの値を下回っているかどうかチェックします。
Line of sight trigger
指定されたタグを持つ対象がAIの視野内にあるかどうかを確認します(General AI propertiesでビューで設定する必要があります)。このトリガーだけに特定の視力変換を設定できます。
In player view trigger
AIがカメラ視野内にあるかどうかを確認します。AIの境界線を計算しなければならないオプションセットはキャラクターが変わらない場合は、「Awake」のままにしてください。
No player in sight trigger
LineOfSightTriggerの反対で、AIの視野にタグ付けされたオブジェクトがないかどうかをチェックします。 「TriggerAfterTime」の値は、AIがチェックを行う頻度です。
Path reachable trigger
Path reachable triggerはAIがターゲットに到達したかをチェックします
- Unreachable ThresholdはAIが取得できる最も近いポイントとターゲットの間の距離です
- Ignore Y PositionはチェックするとY軸を無視して、XとZのみをチェックします
Speed exceeded trigger
指定されたタグを持つオブジェクトがSpeed Thresholdより速く移動したかどうかをチェックします。MaxDistance From AIはAIからの最大距離。
SetTransform As Seek Targetオプションは、移動したGameObjectを選択し、それを特定のSeekStateのターゲットとして設定します(この場合、トリガーされたときに切り替えられるSeekStateを選択する必要があります)。
Timer trigger
時間が経過すると、指定された状態になります。 Randomを使用して、時間にランダム性を追加できプラスマイナス時間の設定をできます。
Nesting triggers
Nesting triggersは組み合わせることができこれは、次の2つの方法で実行できます。
- 2つ以上のトリガーを互いに近くに配置する
- 1つ以上のトリガーを別のトリガー内に配置する。トリガーを互いに近づけると、それらは別々に動作します。各トリガーには、条件が一致したときに変更する独自の状態があり、最初にトリガーされるのはAIの状態を変更するものです。これを行うには、トリガーの下(その外側)または右側の緑色の「+」ボタンをクリックします。
トリガーを他のトリガー内に配置することは、特定の状態に変更するための複数の条件が必要な場合に使用されます。これを行うには、トリガーの下部にある緑色の「+」ボタンをクリックするだけで、その中に新しいトリガーが作成されます(ifステートメントの条件を「&&」と組み合わせるようなものです)。すべての条件が一致すると、指定された状態に変わります。
これらのさまざまな組み合わせでトリガーを組み合わせる方法を作成して、AIに最適な動作を実現できます。