UnityのNavMeshObstacleを使用すると、移動中のNavMeshAgentが障害物に対して回避行動をとるようにできます。
ここでは、NavMeshObstacleの追加と設定手順について説明します。
1. プロジェクトの準備
まず、NavMeshAgentを使用したプロジェクトを作成していることを前提にします。
もしまだNavMeshAgentの設定ができていない場合は、まず先に前回記載した「【Unity】NavMesh、NavMeshAgentの使用方法」の記事を参考にしてください。
2. NavMeshObstacleの基本
「NavMeshObstacle」は、NavMesh上に障害物を配置し、NavMeshAgentがその障害物を回避できるようにするためのコンポーネントです。
この機能は、静的な(動かない)オブジェクトだけでなく、動的に移動する障害物にも適用できます。
3. 障害物オブジェクトの作成
まず、NavMeshAgentが回避する障害物となるオブジェクトを作成します。
簡単な例として、次の手順でキューブ(Cube)をシーンに追加します。
1.障害物の作成
Unityのメニューから「GameObject」→「3D Object」→「Cube」を選択して、シーンにキューブを追加します。このキューブがエージェントにとっての障害物になります。
2.NavMeshObstacleの追加
障害物となるキューブを選択し、インスペクタで「Add Component」ボタンをクリックして「NavMeshObstacle」を追加します。
4. NavMeshObstacleの設定
次に、追加したNavMeshObstacleのパラメータを設定します。
1.Shape(形状)
「Shape」は、障害物の形状を設定します。
「Capsule」や「Box」などが選択できます。
この形状によって、NavMeshAgentが障害物をどう認識するかが決まります。
2.Carve(削り込み)
「Carve」オプションを有効にすると、障害物が動的にNavMeshを削り、障害物の周りにエージェントが進入できないエリアが作成されます。
これは、障害物が移動する場合に特に便利です。
「Carve Only Stationary」を有効にすると、動かない障害物に対してのみNavMeshの再計算を行います。動的な障害物に使用する場合は無効にします。
3.サイズの調整
NavMeshObstacleの形状やサイズは、障害物に合うように調整します。
インスペクタの「Size」パラメータなどを調整することで、NavMeshObstacleが正しくキューブ全体を覆うようにします。
5. 動的な障害物
NavMeshObstacleは動的に動く障害物にも対応しています。
たとえば、障害物をスクリプトで動かすことで、NavMeshAgentが移動する障害物を回避する動作を確認できます。
以下は、キューブを前後に移動させるシンプルなスクリプトです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestCube : MonoBehaviour
{
public float speed = 3.0f;
public float distance = 5.0f;
private Vector3 startPos;
void Start()
{
startPos = transform.position;
}
void Update()
{
// 障害物を前後に動かす
transform.position = startPos + new Vector3(0, 0, Mathf.PingPong(Time.time * speed, distance) - distance / 2);
}
}
このスクリプトを障害物にアタッチし、シーンを再生することで、NavMeshAgentが動的に動く障害物を回避する動作を確認できます。
6. 実行と確認
シーンを再生して、NavMeshAgentが障害物を回避する動作を確認します。
動的な障害物を設定している場合、NavMeshAgentは移動してくる障害物を避けながら目的地に向かうようになります。
静的な障害物の場合も、NavMeshAgentは障害物を回避するルートを取ります。
まとめ
NavMeshObstacleを使用すると、NavMeshAgentがシーン内の障害物を回避することができ、より現実的な動作を実現できます。
特に動的な障害物を組み込むことで、シミュレーションやゲームのシーンにさらなるリアリティを加えることが可能です。
NavMeshObstacleは動的、静的なシーン両方で効果的に使用できるため、あなたのプロジェクトに適した設定を見つけ、最適なエージェントの動きを作り出してみてください。