今回のテーマは「キャラに追尾してくるCPUを作る方法」です。
ゲームなどでよくある操作キャラクターに追尾してくるCPUを作成してみたくてNavimeshで試してみたら簡単にできたので紹介します。
開発環境と前準備
開発環境
これじゃないとだめという訳ではありませんが、画面などは同じ見た目になります。
- Unity 2020.3.30f1
- Visual Studio 2022
Standard Assets
キャラの動作用にいつも利用している「Standard Asset」を利用します。
Assetをサイトより入手して、UnityのプロジェクトにWindows>Package ManagerよりDownload及びImportをしておいて下さい。
また、少し古いAssetのためそのまま利用しようとエラーになりますが、数行変更するだけで治ります。以前の記事で直し方を紹介しているのでそちらを参考にして下さい。
各アセットの読み込みと配置
Hierarchyから「3D Object>Plane」で床を作成します。
移動しやすいように広くしておきます。
PlaneのインスペクターからTransform>Scaleの値を3:3:3にします。
また、後に説明するNavimeshで必要な設定として、「Static」にチェックを入れておきます。
操作キャラの配置
Package Managerで読み込んだ「Standard Assets」から、「Assets>Standard Assets>Characters>ThirdPersonCharacter>Prefabs」より「ThirdPersonController」をドラッグアンドドロップで実体化します。
さらにStandard Assetsのカメラを配置します。「Assets>Standard Assets>Camera>Prefabs」より、「FreeLookCameraRig」をHierarchyにドラッグアンドドロップします。
そしてインスペクターの「Free Look Cam(Script)>Target」に先程実体化した「Hierarchy>ThirdPersonController」をドラッグアンドドロップでセットします。
初期からHierarchyにあったカメラは不要なので削除します。
これで以下のような状態になりました。
追尾してくるキャラの配置
追尾してくるキャラも「StandardAssets」のものを利用します。
「StandardAssets>ThirdPersonCharacter>Prefabs」の「AIThirdPersonController.prefab」をドラッグアンドドロップします。
これが追尾してくるので、端っこあたりに置くと良いかもしれません。
追尾に必要なNavigationの設定
まず、「Window>AI>Navigation」をクリックします。
インスペクターの横に「Navigation」のタブができます。その中の「Bake」をクリックします。
色々なステータスが出てきます。今回は特に操作せずに「Bake」をクリックします。
Bakeをクリックすると以下のように水色の膜ができます。
※今回はPlaneをstaticにしました。staticになっている対象がない場合、Bakeできません。
今回はそのままにしますが、各項目の意味は以下の通りです。
- Agent Radius : エージェントの半径
- Agent Height : エージェントの高さ
- Max Slope : エージェントが登れる最大の坂道の角度
- Step Height : エージェントが越えられる段差の最大の高さ
- Drop Height : 落下を行う高さの最高値
- Jump Distance : ジャンプを行う最長距離値
AIThirdPersonControllerの設定
「AI Character Control」のTargetにHierarchyの「ThirdPersonController」をドラッグアンドロップします。
これでついてくる機能が実装できました。試しに実行してみましょう。
これでもついてくるようになりましたが、ずっとキャラに当って押してくる感じになってしまっているので、これを直していきます。
「AIThirdPersonController」のインスペクターから「Navi mesh Agent>Stopping Distance」の値を1に修正します。
これでキャラとの距離が少し離れたところに止まるようになりました。
これで完成です。
試しに障害物と坂を置いて、Navigationを調節してBakeし直してどんな感じになるか見てましょう。
これだけで自動でついてくるなんてすごすぎる!!
坂を登るところが少しおかしいですが、これはNavimeshとRigidbodyを併用するとこうなってしまうらしいです。公式で非推奨らしいです。
かといってRigibodyを使わずにこの動きを実装するのは難しいので今回は目をつぶります。
Navi mesh Agentについて深く触れなかったので項目の説明をしておきます。
- Agent Type:エーゲントのタイプ
- Collect Obje:トランスフォームピボットポイントに対するコリジョンシリンダー(円筒)のオフセット
- Speed:動きの最高速度(単位: メートル/秒)
- Angular Speed:回転の最高速度(単位: 度/秒)
- Acceleration:最高加速度(単位: メートル/秒の2乗)
- Stopping distance:ゴール位置、この設定距離まで近づいたらエージェントが停まります
- Auto Braking:有効になっていると、目的地点の到着時にエージェントの移動速度が減速します。巡回のような、エージェントが複数のポイント間をスムーズに移動する必要がある場合には無効にする必要があります。
- Quality:障害物回避の品質 エージェントの数が多い場合には障害物回避の品質を落とすことで CPU 時間を節約することができます。回避を None に設定するとエージェント同士が衝突しなくなりますが、他のエージェントが障害物を積極的に回避するようになるわけではありません。
- Priority:エージェントは、この数値より低いエージェントを無視して回避するようになります。値は 0~99 の間で設定し、数字が小さいほど優先度が高いことを意味します。
- Auto Traverse OffMesh Link:オフメッシュリンクを自動で越えるようにしたい場合はオンにしてください。オフメッシュリンクを越えるのにアニメーションなどの特定の方法を使用したい場合はオフにしてください。
- Auto Repath:有効になっていると、エージェントは部分的な経路の終了地点へ到達した際に、再度経路の探索を行います。目的地への経路がない場合は、目的地にもっとも近い到達可能場所への部分的な経路が作成されます。
- Area Mask:Area Mask は、エージェントが経路を探索する際にどのナビゲーションエリアとコスト を確認するかを設定します。ナビメッシュのメッシュをベイクする際に、各メッシュにエリアタイプを設定できます。例えば、階段を特殊なエリアタイプでマスクし、一部のキャラクターはその階段を使えないようにしたりすることが可能です。
参考:ナビメッシュエージェント
AICharacterControl.csの確認
キャラクターへの移動に関するプログラムは非常にシンプルです。
プログラムの重要なUpdateの部分に軽くコメントを入れてみたので確認してみて下さい。
private void Update()
{
if (target != null)
//移動先ターゲットをセットする
agent.SetDestination(target.position);
//remainingDistance:エージェントの位置および現在の経路での目標地点の間の距離
//stoppingDistance:回避行動による潜在的な移動も含むエージェントの期待速度(読み取り専用)
if (agent.remainingDistance > agent.stoppingDistance)
//移動速度をセット
character.Move(agent.desiredVelocity, false, false);
else
//移動速度を0にする
character.Move(Vector3.zero, false, false);
}
まとめ
今回、「キャラに追尾してくるCPUを作る方法」を紹介しました。
- AIThirdPersonControllerの配置
- AIThirdPersonControllerの設定
- Navigationの設定
- Navi mesh Agentの設定
細かな部分まで気にすると色々困る部分も出てくると思いますが、シンプルな作りであればすごい簡単に作ることができます。
Navimeshは敵キャラが近づいてくることに使うことが多いのでそういったサンプルを見ると色々参考になると思います。
※3D Game Assetsの犬など
今回の記事が、皆さんの技術力向上につながると嬉しいです。
以上、おつかれさまでした!