NavMeshAgentの各プロパティの動作を確認するため、以下のようなシンプルなシーンを作成しました。 赤いオブジェクトにNavMeshAgentをアタッチし、青いオブジェクトを目的地として設定しています。
また、AgentのスクリプトはAuto Repathの例以外は以下のコードを使っています。
using UnityEngine;
using UnityEngine.AI;
public class EnemyAgent : MonoBehaviour
{
private NavMeshAgent agent;
public GameObject target;
void Start()
{
agent = GetComponent<NavMeshAgent>();
}
void Update()
{
agent.destination = target.transform.position;
}
}
ここから、プロパティの解説です。
使うAgentのタイプを選択できます。例えば、0.5までの高さの段差なら超えれるAgentと、1.0までの高さの段差を超えられるAgentを作成した場合、このプロパティからどちらのAgentを使うか選択できます。
例:Agentが超えれる段差の高さ(Step Height)を0.3(赤)と0.75(黒)に設定した場合
0.75に設定したAgentは段差を超えれていますが、0.3に設定したAgentは段差を超えれていなません。
Agentの垂直方向の位置を調整できます。キャラクターのモデルの足元を地面に合わせるときなどに使います。
例:Base Offsetを0(赤)と1(黒)に設定した場合
Agentの最大移動速度を設定できます。
例:Speedを7(赤)と3.5(黒)に設定した場合
Agentの回転の最大速度を設定できます。
例:Angular Speedを240(赤)と120(黒)に設定した場合
※違いを分かりやすくするため、ここからはAgentのSpeedはどちらも7に設定されています。
Agentの加速度を設定できます。
例:Accelerationを16(赤)と8(黒)に設定した場合
Agentが目的地に近づいたときに停止する距離を設定できます。
例:Stopping Distanceを5(赤)と0(黒)に設定した場合
目的地到着時にAgentの速度を減速するかどうか設定できます。
例:Auto Brakingを無効(赤)と有効(黒)に設定した場合
Obstacle Avoidance関連のプロパティ(Radius, Height, Quality, Priority)を設定する際は、NavMesh Surfaceコンポーネントの設定も変更する必要があります。
例えば、Radiusが1のAgentを新たに作成したい場合は、以下の手順でNavMesh SurfaceをBakeし直す必要があります。
1. NavMesh SurfaceコンポーネントのAgent Typeから「Open Agent Settings...」を選択します。
2. Agent Typesウィンドウで新しいAgent Typeを追加し、Radiusを1に設定します。
3. NavMesh SurfaceコンポーネントのAgent Typeに、先ほど追加したAgent Typeを選択します。
4. 「Bake」ボタンをクリックして、NavMeshを再生成します。
Agentの半径を設定できます。他のAgentとの衝突にも影響します。
例:Radiusを1(赤)と0.5(黒)に設定した場合
※違いを分かりやすくするため、ここからはAgentのSpeedはどちらも7、Accelerationは32に設定されています。
1を設定されたAgentは、細い道を通れず遠回りしていることが確認できます。
Agentの高さを設定できます。頭上の障害物の下を通り抜けれるかどうかに影響します。
例:Heightを5(赤)と2(黒)に設定した場合
5を設定されたAgentは、頭上に障害物があるため遠回りしていることが確認できます。
Agentの障害物回避の品質を設定できます。None同士のAgentは衝突しません。
例:QualityをどちらもNoneに設定した場合
Agentの移動する際の優先度を設定できます。0〜99の値で設定し、小さい数字ほど優先度が高くなります
例:Priorityを0(赤)と50(黒)に設定した場合
0を設定されたAgentは、道を譲られているのが確認できます。
オフメッシュリンクを自動で越えるかどうかを設定できます。例えば、地続きでない場所への移動をする場合は有効にします。
Auto Traverse Off Mesh Linkを使うために、まず適当な感覚で床となるオブジェクトを複数設置し、NavMesh SurfaceでGenerate Linksにチェックを入れてます。
次にOpeent Settn Agings...から使うAgentのTypeを選択しJump Distanceの値を変更してからBakeします。
下の画像のようにBake出来ていたら成功です。
例:Auto Traverse Off Mesh Linkを無効(赤)と有効(黒)に設定した場合
Agentがパスの更新を自動で試みるかどうかを設定できます。例えば、移動する障害物などがある環境では有効にします。
Auto Repathを使うために、まず床となるオブジェクトを設置し、Cubeで目的地までの道を遮ります。 追加したCubeにAdd ComponentからNav Mesh Obstacleをアタッチし、Carveにチェックを入れ、その後NavMesh SurfaceでBakeします。
下の画像のようにBake出来ていたら成功です。
例:Auto Repathを無効(赤)と有効(黒)に設定した場合
Auto Repathが有効になっているAgentのみ、Cubeが動いた後に目的地までのパスが更新されているのが確認できます。
※ここでは、Agentのコードは以下のものを使っています。agent.destination = target.transform.position;を Update()内に書くと、AgentはAuto Repathが無効になっていても障害物が動いた後に目的地まで向かってしまいます。
using UnityEngine;
using UnityEngine.AI;
public class EnemyAgent : MonoBehaviour
{
private NavMeshAgent agent;
public GameObject target;
void Start()
{
agent = GetComponent<NavMeshAgent>();
agent.destination = target.transform.position;
}
}
Agentが移動できるナビゲーションエリアを設定できます。
Area Maskを使うために、NavMesh SurfaceのDefault AreaがWalkableになっているを確認してからBakeします。
例:Area MaskをJump(赤)とEverything(黒)に設定した場合
Jump用ののAreaをBakeしていないので、
Failed to create agent because it is not close enough to the NavMesh
という警告と
"SetDestination" can only be called on an active agent that has been placed on a NavMesh.
UnityEngine.AI.NavMeshAgent:set_destination (UnityEngine.Vector3)
というエラーが表示されます。