今回は、目的地までの経路探索が出来るNavMeshを使って、プレイヤーを追跡させてみます。
過去の記事で、敵(スライム)のrotationとpositionを変えるスクリプトにてプレイヤーを追いかけるようにしていましたが、追跡途中に障害物などが出てくると厄介です。
このような状況の時は、NavMeshの機能を使った方がスムーズに移動出来るのでおすすめです。
NavMeshを使って敵にプレイヤーを追跡させる【Unity】
ナビメッシュでは、予め敵の大きさなどを決めておき、敵が動ける範囲をベイクします。
実際に追跡させる敵を動かすには、Navmesh Agentを使います。このコンポーネントに目的地を指定することで、ベイクした範囲を通って目的地を目指すようになります。
途中に何かしらの障害物がある場合は、ベイクによって通れない場所として計算されているので、障害物を避けて移動するようになります。
敵と障害物オブジェクトを配置する
追いかけてくる敵と障害物を準備しましょう。私は敵オブジェクトとして「Level 1Monster Pack」にある「Ghost_Lv1」を使います。
Cubeなどを作成してステージ上の適当な位置に障害物を設置しておきます。
障害物をNavMeshに反映させるために、インスペクターからStaticを開いて「Navgation Static」を選択します。
NavMeshをベイクする
下準備が出来たら、さっそくベイクしてみましょう。
「Window」→「AI」→「Navgation」を選択します。続いて「Bake」タブをクリックします。
Agent Radiusで半径、Heightで高さなどを調整できますが、とりあえずデフォルトのまま「Bake」ボタンを押してみましょう。
すると、青色の部分が表示されると思います。この領域が移動可能な範囲となります。
デフォルト状態だと、途中で範囲外となり移動できなくなってしまいそうですね。
Agent Radiusを「0.2」に変更して再びベイクしてみると良い感じになりました。
NavMeshAgentコンポーネントをアタッチする
NavMesh上で敵を動かすには、NavMeshAgentを使うので、インスペクターの「Add Component」から「Nav Mesh Agent」を追加します。
このコンポーネントの値を調整することで、敵の移動速度や回転速度を変更できます。
デフォルトのままでも問題ないのでこのまま進めていきます。
プレイヤーを追跡するスクリプトの作成
敵の移動に関するスクリプトは、SlimeControllerに記述していたので、こちらを修正しました。
スクリプトを敵にアタッチして、ターゲットとなるプレイヤーをインスペクタから設定してゲームを実行してみます。
良い感じですね。ベイクされた移動範囲内で追いかけてくるようになりました。