のぼるゲーム開発備忘録

ゲーム開発のプログラマーです。ゲーム開発関連、調べた内容をアップしていきます。Unityを使用して個人開発を行っています。

【Unity】【Corgi Engine】CPUの敵AI調査まとめ

f:id:ikeball:20210214233240p:plain

はじめに

今回はCorgi EngineのCPUの敵AIの実装について確認してみました。

AIを設定する上で、用意するマップの形も重要と感じました。

Advancedの方は調査時間がまだ取れておらず、後ほど追加するかもしれません。

 

AIスクリプトの使い方に設定方法を記載しています。

LegacyAIAdvancedAIに各思考のパラメータについてまとめました。

使用アセット

Corgi Engine - 2D + 2.5D Platformer

作業環境

Unity 2019.4.16f1

敵AI設定の場所

Assets/CorgiEngine/Demos/Corgi3D/NewCorgi3Dのシーンで確認しました。

f:id:ikeball:20210124212502p:plain

NewCorgi3D / Level / Enemies / Bear3D に敵がいます。

f:id:ikeball:20210214123414p:plain

Bear3Dのプレハブを開くと、AIWalkというコンポーネントが設定されています。

これがAIの設定となります。

f:id:ikeball:20210214170333p:plain

AIのスクリプト

CorgiEngineで用意されているAIはLegacyフォルダに入っている簡易的な思考と、状態を判断して行動を切り替えるAdvancedフォルダに入っている思考処理があります。

ただ歩いて崖を判定して判定等簡素な設定はLegacyフォルダのScriptを設定することで対応ができます。

f:id:ikeball:20210214172814p:plain

Advancedの方は、設定は複雑になりますがHPが半分以下になったらダッシュを使用するようになる等、条件を見て行動を切り替えることができるようになっています。

f:id:ikeball:20210214173026p:plain

AIスクリプトの使い方

コーギエンジンのAIスクリプトにはLegacy, Advancedの2種類で設定方法があります。

CorgiControllerのついているコンポーネントに思考コンポーネントを追加することで設定できます。

Legacy ... 簡単な思考設定。簡易な動きの場合はこちらが便利です。

AIWalk(歩き), AIFollow(追従), AIShootOnSight(射撃)の三つが用意されいます。思考するコンポーネントを追加すれば機能します。

Advanced ... AIBrainコンポーネントをベースに条件と行動を組み合わせて思考を設定します。詳細な動きが可能な分設定が多くなります。

Legacy AI の設定方法

必要な思考を追加すればOKです。

 

動かないCPUの場合、設定をしないといったことも選択肢となります。

移動を行う場合、AIWalkか、AIFollowを設定し

射撃攻撃が必要な場合は、AIShootOnSightを追加します。

移動が必要なく、射撃を行う場合はAIShootOnSightのみ設定します。

 

各思考の詳細はLegacyAIの項目をご確認ください。

f:id:ikeball:20210216215220p:plain

Advanced AI の設定方法

Advanced AIでは、AIBrainにAIAction(行動)、AIDecision(条件)を設定し思考を行います。

AIAction, AIDecisionの詳細パラメータはAdvancedAIにまとめています。

f:id:ikeball:20210216223006g:plain

ここでは「2秒停止」→ 「2秒歩行」を繰り返す設定にて設定の仕方を紹介します。

f:id:ikeball:20210216224148p:plain

Assets/CorgiEngine/Demos/Corgi3D/Prefabs/AI/Bear3Dにて設定を行います。

f:id:ikeball:20210216224429p:plain

AIWalkのスクリプトを外す

②AIBrainのスクリプトを追加

③AIActionDoNothingを追加 ... 停止の行動

④AIActionPatrolを追加 ... 歩行の歩行

 パラメータ設定を調整し、穴が見つけたら反転するようにしました。

⑤AIDecisionTime in Stateを追加

 2秒で条件を満たすようにしました。

f:id:ikeball:20210216230541p:plain

①AIBrainのStatesの+ボタンを遷移する状態の数である2回押します。

②Actions, Transitionsをそれぞれ1回づつ押します。

 行動や、条件を複数設定する場合はその数に合わせます。

③State Nameの設定を行います。今回はWait(待機)、Walk(歩行)を設定します。

④WaitのActionsにはAIActionDoNothingをドラッグで設定

 WalkのActionsにはAIPatrolをドラッグで設定

 WaitのTransitionsにAIDecisionTime in Stateを設定し、TrueStateに「Walk」を設定

 WalkのTransitionsにAIDecisionTime in Stateを設定し、TrueStateに「Wait」を設定

 

起動時は一番上の状態が実行され、対象の状態のActionsが実行され続けます。

実行中Transitionsの判定が行われ、条件を満たした(/満たしていない場合)に、遷移先の状態があれば、状態の変更が行われます。

 

今回の場合は下記状態が繰り返される形となっています。

①Wait状態で待機を行う

②2秒後の判定が満たされたタイミングでWalkへ

③Walk状態で歩行を行う

④2秒後の判定が満たされたタイミングでWaitへ

 

設定方法は以上となります。

LegacyAI

簡単な設定で思考の設定ができます。

単純な動作に対応しています。

Legacy

AIWalk

f:id:ikeball:20210214191922p:plain

歩く動作の思考

・歩く

・(設定次第)壁にぶつかったら反転する。

・(設定次第)落下を避ける。

・MoveOnSight にてプレイヤーの後ろを歩いてくる仲間の設定も可能

※マップの床の高さに気を付けて設定が必要な場合があります。

 

WalkBehaviour ... 動作の仕方

 Patrol:条件なく歩行

 MoveOnSight:目標を「見ている」場合のみ歩行

Obstacle Detection

壁にぶつかった時にキャラの向きを変えるべきかどうか、穴を避けようとするかどうか設定

ChangeDirectionOnWall ... trueの場合、壁にぶつかったときに方向を反転
AvoidFalling ... trueの場合、落下を避けようとする
HoleDetectionOffset ... 穴の検出を考慮する距離
HoleDetectionRaycastLength ... 穴を検出をするためのキャラの大きさ

Move on Sight

動作がMove On Sightに設定されている場合の設定、「視野」距離の設定

 

ViewDistance ... AIがターゲットを見ることができる最大距離
StopDistance ... 移動を停止する目標からの水平距離。その距離と歩行距離の間で徐々に減速していきます。
MoveOnSightRayOffset ... レイキャストの原点に適用するオフセット(デフォルトはオブジェクトの位置)
MoveOnSightLayer ... ターゲット対象となるレイヤー
MoveOnSightObstaclesLayer ... 視界障害物対象となるレイヤー

f:id:ikeball:20210214215602g:plain

Patrol, AvoidFalling = true の場合

f:id:ikeball:20210214215201g:plain

Patrol, AvoidFalling = false の場合

f:id:ikeball:20210214215929g:plain

Patrol, AvoidFalling = true, HoleDetectionOffset  x = 2の場合

f:id:ikeball:20210214221328g:plain

NG例 Patrol, AvoidFalling = true, HoleDetectionRaycastLength = 1の設定

床があるかどうかの判定で誤った判定をしてしまっている。

f:id:ikeball:20210214221807g:plain

Patrol, AvoidFalling = true, HoleDetectionRaycastLength = 0.3

f:id:ikeball:20210214222544g:plain

MoveOnSight, StopDistance = 1, MoveOnSightLayer = Playerを設定

f:id:ikeball:20210214223011g:plain

MoveOnSight, AvoidFalling = false, StopDistance = 1, MoveOnSightLayer = Playerを設定

AIShootOnSight

f:id:ikeball:20210214193955p:plain

CharacterHandleWeapon とセットで使用する。

プレイヤーが視界にいる間、武器を使用します。←プレイヤーが視界にいない場合、攻撃できません。

条件を見ず攻撃したい場合は、Advancedの設定を行う必要があります。

攻撃動作の思考

・正面にターゲットが入った場合、武器を使用します。

 

ShootDistance ... AIがプレイヤーに向けて撃つことができる最大距離
RaycastOriginOffset ... 視界の判定に使用するオフセット値
TargetLayerMask ... 攻撃対象のレイヤー

敵用の武器の作成

Bear3Dに装備できる武器を用意します。

f:id:ikeball:20210214224857p:plain

Assets/CorgiEngine/Demos/Minimal/Prefabs/Wepons/RegularWepons にある

MinimalShotgun をコピーし MinimalShotgunEnemy としました。

f:id:ikeball:20210214225214p:plain

Bear3D AI 向けに2点変更しています。

①ProjectaileWeapon の Position/WeponAttachmentOffset.y を 0.5

→Bear3Dは背が低いため発射と同時に床に当たってしまうことを防ぎます。

②WeaponAim の AimControlを Script

→キーボードやパットで入力で操作するわけではないため変更しました。

f:id:ikeball:20210214225756p:plain

Bear3D に、AIShootOnSightを追加し、TargetLayerMaskにPlayerを設定

CharacterHandleWeaponのInitialWeaponに用意した、MinimalShotgunEnemyを設定

f:id:ikeball:20210214230130g:plain

f:id:ikeball:20210214230924g:plain

上下の認識検証

AIWalk 無効化, AIShootOnSight のShotDistance = 20

AIFollow

f:id:ikeball:20210214194201p:plain

メインプレイヤーのキャラクターに追従させます。

対象キャラについているコンポーネントで追加動作

CharacterRun ... ターゲットから離れているときに走ろうとします。

CharacterJetpack ... 障害物の上をジェットパックをしようとします。

CharacterJump ... 障害物の上をジャンプしようとします。

Distances

RunDistance ... 走り出す距離。プレイヤーとの水平距離で判定
WalkDistance ... 歩き出す距離。プレイヤーとの水平距離で判定
StopDistance ... 移動を停止する距離。プレイヤーとの水平距離で判定
JetpackDistance ... ターゲットが上上空にある場合にジェットパッカー使用を開始する垂直方向距離

 Bear3D にジャンプ能力付加

f:id:ikeball:20210214233843p:plain

AIWalkを削除、AIFollow, CharacterJump を追加しました。

(パラメータは変更していません)

f:id:ikeball:20210214234210g:plain

AdvancedAI

状態を判断し、行動を設定できるようになっています。

AIBrain に AIAction(行動) / AIDecision(条件)を設定し思考を組み立てます。

Advanced AI一覧

行動 / 条件 動画

AIActionChangeWeapon

武器の切り替え

f:id:ikeball:20210217232130g:plain

AIActionDash

ダッシュ

f:id:ikeball:20210217132203g:plain

AIActionDoNothing

待機

f:id:ikeball:20210217135926g:plain

AIActionFlyPatrol

飛行

f:id:ikeball:20210217234215g:plain

AIActionFlyTowardsTarget

ターゲット方向へ飛行

f:id:ikeball:20210218000051g:plain

AIActionJump

ジャンプ

f:id:ikeball:20210217224954g:plain

AIActionMMFeedbacks

フィードバック実行

 

AIActionMoveAwayFromTarget

ターゲットから離れる

 

AIActionMoveTowardsTarget

追跡

f:id:ikeball:20210218002107g:plain

AIActionPatrol

歩行

f:id:ikeball:20210217104012g:plain

AIActionPatrolWithinBounds

拡張機能付き歩行

f:id:ikeball:20210218001204g:plain

AIActionShoot

射撃

f:id:ikeball:20210217221949g:plain

AIActionSwapBrain

思考切り替え

 

AIActionUnityEvents

スクリプト処理呼び出し

 

AIDecisionDetectTargetLine

直線で視野判定

f:id:ikeball:20210217104809g:plain

AIDecisionDetectTargetRadius

円で視野判定

 

AIDecisionDistanceToTarget

ターゲットとの距離で判定 

 

AIDecisionGrounded

地面に接触しているか判定

 

AIDecisionHealth

体力で判定

 

AIDecisionHit

指定回数で判定

 

AIDecisionLineOfSightToTarget

ターゲットとの間に遮るものがあるか判定

 

f:id:ikeball:20210218003302g:plain

AIDecisionNextFrame

次のフレームtrue

f:id:ikeball:20210218003302g:plain

AIDecisionRandom

乱数で判定

 

AIDecisionTargetFacingAI

ターゲットに見られているか判定

 

AIDecisionTargetIsAlive

 対象が生存しているか判定

 

AIDecisionTargetIsNull

対象がnullか判定

 

AIDecisionTimeInState

状態に入ってからの時間で判定 

f:id:ikeball:20210217102808g:plain

AIDecisionTimeSinceStart

シーンに入ってからの時間で判定 

 

AIAction

AIActionChangeWeapon

f:id:ikeball:20210214194518p:plain

武器を切り替えます。状態に入った際に一度切り替わりが行われます。

HPが少なくなったら攻撃方法が変わるなどに使えそうです。

NewWeapon ... 切り替える武器

f:id:ikeball:20210217232130g:plain

射撃状態に入ってから2秒後に武器を入れ変えるようにしました。

切り替えたタイミングでジャンプを入れています。

f:id:ikeball:20210217232557p:plain

↑の動画で設定している項目になります。設定は多岐に渡るため重要なとこのみ載せています。ご不明な点がありましたらツイッターから問い合わせお願いします。

AIActionDash

f:id:ikeball:20210214194644p:plain

CharacterDash とセットで使用する。

ダッシュ1度行います。

f:id:ikeball:20210217131150g:plain

CharacterDashを付加し、AIActionPatrol 2秒後にダッシュした場合

...勢いよく飛んでいきます。。

f:id:ikeball:20210217132203g:plain

CharacterDashの勢いを抑え、歩きの時間を調整しました。

徐々に位置がずれますね。。高低差が激しいところでのダッシュは調整が大変そうです。平坦なマップや、一発の突撃、ボス部屋での行動などうで使えそうです。

f:id:ikeball:20210217134313p:plain

↑一つ上の動画のために設定したパラメータ、ポイントとして、AIDecsionTime in State を2つ追加し、歩行時は1.5秒、ダッシュ時は0.5秒で状態を切り替わるようにしています。

f:id:ikeball:20210217134718g:plain

ダッシュ状態から切り替えない場合、ずっとダッシュを繰り返します。

動きが止まっているのは思考ではなく、キャラクター動作としての停止となります。

AIActionDoNothing

f:id:ikeball:20210214194714p:plain

何もせず待機です。

プレイヤーが視界に入るまで待機などに使えそうです。

f:id:ikeball:20210217135926g:plain

待機です。

AIActionFlyPatrol

f:id:ikeball:20210214194741p:plain

CharacterFly, MMPath とセットで使用する。

ターゲットの方向に指定された最小距離まで飛行させる。(壁や穴にぶつかるまで飛ぶ)

MMPathによる飛行ルートの指定が必要です。

ChangeDirectionOnObstacle ... trueの場合、障害物に当たった時に向きを反転

f:id:ikeball:20210217234215g:plain

2秒ごとに待機と飛行を繰り返します。MMPathの指定で右上に移動するようにしました。

f:id:ikeball:20210217235218p:plain

↑の動画での設定主要部。

CharacterFlyはAlwaysFlying = trueで常に飛行状態にしています。

飛行状態ではない場合は動けません。

MMPathで飛行ルートの設定を行います。

AIActionFlyTowardsTarget

f:id:ikeball:20210214194847p:plain

CharacterFly とセットで使用する。

ターゲットの設定が必要です。

キャラクターをターゲットの方向に指定された距離まで飛行させる。

MinimumDistance ... ターゲットとの距離

f:id:ikeball:20210218000051g:plain

AIActionFlyTowardsTargetのMinimumDistance = 2の設定

f:id:ikeball:20210218000536g:plain

AIActionFlyTowardsTargetのMinimumDistance = 0の設定

AIActionJump

f:id:ikeball:20210214195054p:plain

CharacterJump とセットで使用する。

設定回数のジャンプを行います。

NumberOfJumps ... ジャンプ回数

f:id:ikeball:20210217224954g:plain

待機、ジャンプを繰り返す設定

f:id:ikeball:20210217225722p:plain

↑の動画で行った設定

AIActionMMFeedbacks

f:id:ikeball:20210214195452p:plain

MMFeedbacksを再生します。

TargetFeedbacks ... 再生するMMFeedbacks

OnlyPlayWhenEnteringState ... falseの場合、フィードバックはPerformActionごとに再生(デフォルトでこの状態の間、毎フレーム再生される)

AIActionMoveAwayFromTarget

f:id:ikeball:20210214195628p:plain

CharacterHorizontalMovementでターゲットから離れるように移動させます。

MinimumDistance ... ターゲットとの距離

AIActionMoveTowardsTarget

f:id:ikeball:20210214195832p:plain

CharacterHorizontalMovementでターゲットの方向に移動させます。

ターゲットの設定が必要です。

MinimumDistance ... ターゲットとの距離

f:id:ikeball:20210218002107g:plain

MinimumDistance = 1にて設定、壁の判定がなくつまっています。

f:id:ikeball:20210218002317p:plain

↑の動画の主要部。ターゲットの設定はAIDecisionDetectTargetRadiusにて行っています。

AIActionPatrol

f:id:ikeball:20210214195951p:plain

壁や穴にぶつかるまで移動します。

Obstacle Detection

ChangeDirectionOnWall ... trueの場合、壁に当たった時、向きを反転
AvoidFalling ... trueの場合、落下を避ける
HoleDetectionOffset ... 穴の検出を考慮する距離
HoleDetectionRaycastLength ... 穴を検出をするためのキャラの大きさ

f:id:ikeball:20210217104012g:plain

AvoidFalling = true, HoleDetectionOffset.x = 1, HoleDetectionRaycastLength = 1

f:id:ikeball:20210217104224g:plain

AvoidFalling = false

AIActionPatrolWithinBounds

 f:id:ikeball:20210214200205p:plain

AIActionPatrol を継承。キャラクターが超えられない左右の境界線を定義できる。

Obstacle Detection

ChangeDirectionOnWall ... trueの場合、壁に当たった時、向きを反転
AvoidFalling ... trueの場合、落下を避ける
HoleDetectionOffset ... 穴の検出を考慮する距離
HoleDetectionRaycastLength ... 穴を検出をするためのキャラの大きさ

Bounds

BoundsMethod ... 境界の判定方法

 BasedOnOriginPosition ... 配置位置を基準

 BasedOnStateEnterPosition ... 状態に入った時の位置を基準
BoundsExtentsLeft ... 左側の最大距離
BoundsExtentsRight ... 右側の最大距離

f:id:ikeball:20210218001204g:plain

BoundsMethod = BasedOnOriginPosition, BoundsExtentsLeft  = 0,

BoundsExtentsRight  = 2 の設定で、2秒ごとに待機、移動を繰り返す。

AIActionShoot

f:id:ikeball:20210214200413p:plain

CharacterHandleWeapon とセットで使用する。

ターゲットの設定が必要です。

使用できる武器は ProjectileWeapon が対象です。

武器を使って撃つ行動。武器がオートの場合、その状態を抜けるまで撃つことができ

セミオートでは1回撃ちます。武器にWeaponAimコンポーネントが付いている場合は、キャラクターをターゲットの左右に向けて照準を合わせます。

FaceTarget ... trueの場合、射撃時にターゲットを左右に向けます
AimAtTarget ... trueの場合、射撃時にターゲットを狙います
TargetOffset ... 照準時にターゲットの位置に適用されるオフセット

f:id:ikeball:20210217215450g:plain

セミオート銃で確認、ターゲットの設定にはAIDecisionDetectTargetRadiusを使用しました。セミート銃の場合は1状態につき1発しか発砲しないようです。

f:id:ikeball:20210217215536p:plain

↑の動画の設定はこちらです。使用した武器は AIShootOnSight の説明で使用したものです。

f:id:ikeball:20210217221949g:plain

武器の設定をオートに切り替えました。

Shoot状態である限り撃ち続ける挙動となります。

条件をみて別状態にし解除する必要がありそうです。

f:id:ikeball:20210217222155p:plain

オート設定はProjectileWeaponのTriggerModeで設定ができます。

AIActionSwapBrain

f:id:ikeball:20210214200727p:plain

実行時にAIBrainを入れ替える。

NewAIBrain ... 入れ替える思考

AIActionUnityEvents

f:id:ikeball:20210214201205p:plain

このアクションは、UnityEventのトリガーに使用されます。

TargetEvent ... 実行されるUnityEvent
OnlyPlayWhenEnteringState ... falseの場合、UnityイベントはPerformActionごとに実行されます(デフォルトではこの状態にある間はすべてのフレームでトリガーされます)

AIDecision

AIDecisionDetectTargetLine

 f:id:ikeball:20210214201532p:plain

TargetLayerレイヤーマスク上のオブジェクトが視線に入った場合にtrueを返す。

また、対象をターゲットとして設定する。

この場合、視線は実際の線になります(レイキャスト)。

また、レイの原点のオフセットと、それをブロックする障害物レイヤーのマスクを指定することもできます。

DetectMethod ... 検出方法
DetectionDirection ... 検出方向(Front 前方, Back 後方, Both 前後)
RayWidth ... キャストするレイの幅 (WideRay モードのみの場合)
DetectionDistance ... 射程距離
DetectionOriginOffset ... レイに適用するオフセット
TargetLayer ... ターゲットを検索したいレイヤー
ObstaclesLayer ... 障害物が設定されているレイヤーを指定

f:id:ikeball:20210217104809g:plain

DetectMethod = Ray, DetectionDistance = 10, TargetLayer = Playerの場合、正面に入ったタイミングでtrueを返す。

f:id:ikeball:20210217110053g:plain

DetectMethod = Ray, DetectionDistance = 10, TargetLayer = Player,

Obstacles = Platforms ← 壁ブロックのレイヤー

壁で視界を遮る設定を設定した場合。壁越しには判定されない

f:id:ikeball:20210217110608g:plain

DetectMethod = Ray, DetectionDistance = 10, TargetLayer = Player,

Obstacles = Nothing

壁で視界を遮る設定をしなかった場合、壁越しも判定が行われる。

AIDecisionDetectTargetRadius

 f:id:ikeball:20210214201556p:plain

TargetLayerのオブジェクトが半径内にあればtrueを返す。

対象をターゲットとして設定する。

Radius ... 検索する半径
DetectionOriginOffset ... 探索円の中心
TargetLayer ... ターゲット対象のレイヤー

AIDecisionDistanceToTarget

 f:id:ikeball:20210214201619p:plain

ターゲットが指定範囲内であればtrueを返す。

ComparisonMode ... 距離の比較に使用するメソッド
Distance ... 判定距離

AIDecisionGrounded

 f:id:ikeball:20210214201645p:plain

地面に接地している場合trueを返す。

GroundedBufferDelay ... 地面にいる時間(秒単位)、この指定分判定を無視する

AIDecisionHealth

f:id:ikeball:20210214201708p:plain

ライフ条件が満たされた場合true返します。

TrueIfHealthIs ... 比較方法
HealthValue ... 比較する値
OnlyOnce ... この判定は一度だけか

AIDecisionHit

 f:id:ikeball:20210214201726p:plain

指定回数条件が満たされた場合trueを返す。

NumberOfHits ... true を返すのに必要なヒット数

AIDecisionLineOfSightToTarget

 f:id:ikeball:20210214210911p:plain

このAIとターゲットの間に遮るもののない場合trueを返す。

ObstacleLayerMask ... 視界を遮る障害物として考慮するレイヤーマ
LineOfSightOffset ... 適用するオフセット

f:id:ikeball:20210218003302g:plain

追跡の設定でプレイヤーとの間に壁がある場合ジャンプするように設定

AIDecisionNextFrame

 f:id:ikeball:20210214210933p:plain

この決定がオンになっている状態に入るとtrueを返す。

f:id:ikeball:20210218003302g:plain

ジャンプした後、もとの状態に戻すように使用

f:id:ikeball:20210218003603p:plain

ジャンプを行ったら元の状態に戻し、次の判定待ちとしています。

AIDecisionRandom

 f:id:ikeball:20210214210956p:plain

乱数を判定して、結果がオッズ値以下であれば真を返します。

TotalChance ... 試行値
Odds ... 判定するオッズ

AIDecisionTargetFacingAI

 f:id:ikeball:20210214211013p:plain

ターゲットがこのキャラクターに向いている場合trueを返す。

AIDecisionTargetIsAlive

f:id:ikeball:20210214211030p:plain

ターゲットが生存している場合trueを返す。

AIDecisionTargetIsNull

f:id:ikeball:20210214211047p:plain

ターゲットの設定がnullの場合trueを返す。

AIDecisionTimeInState

 f:id:ikeball:20210214211105p:plain

Brainがこの決定の状態になってから指定された時間(秒単位でminとmaxの間でランダムに選ばれた値)が経過した後に真を返します。何か他のことをしてからX秒後に何かをするときに使います。

AfterTimeMin ... 真を返すまでの最小持続時間を秒単位で指定します。
AfterTimeMax ... 真に戻るまでの最大持続時間を秒単位で指定します。

f:id:ikeball:20210217102808g:plain

AfterTimeMin = 1, AfterTimeMax = 1を設定した場合、1秒でtrueとなります。

f:id:ikeball:20210217103221g:plain

AfterTimeMin = 1, AfterTimeMax = 3を設定した場合、対象の行動に移った際に1秒~3秒の間でランダムに決まり。その時間後trueとなります。

AIDecisionTimeSinceStart

 f:id:ikeball:20210214211124p:plain

シーンがロードされてから指定された期間 (秒単位) が経過した後に true を返す。

AfterTime ... 真を返すまでの時間 (秒単位)

おわりに

AI向けのアセットは色々ありますが、CorgiEngineに入っている仕組みでもそれなりのことは出来そうだと感じました。すごく凝ったものを作る場合は別の手法を含め検討の必要がありますが、一度CorgiEngineの仕組みを使ってみようと思います。

今後も記事アップしていきたいと思います。

関連記事

ikeball.hatenablog.com

ikeball.hatenablog.com