NavMeshは、Unityの強力なパスファインディングシステムで、ゲーム内のエージェントが自動で障害物を避けながら目的地に到達するために使用されます。教材では、NavMeshの基本的な使い方から応用例までを解説し、サンプルコードを通じて学べる内容にします。
NavMesh(Navigation Mesh)は、シーンの地形上に設計された移動可能な領域を示します。これにより、キャラクターは特定の範囲内で移動可能であり、障害物を回避しながら目的地に向かいます。
Window > AI > Navigation
を開きます。Static
オプションを適用し、Bake
を実行して移動可能な領域を作成します。NavMesh Agent
コンポーネントを追加します。Destination
プロパティに目的地を設定することで、キャラクターは自動でその位置まで移動します。NavMesh Agentを用いてキャラクターを指定した目的地まで自動で移動させる基本的なサンプルプログラムです。
using UnityEngine;
using UnityEngine.AI;
public class NavMeshMovement : MonoBehaviour
{
public Transform target; // 目的地となるターゲットのTransform
private NavMeshAgent agent;
void Start()
{
agent = GetComponent<NavMeshAgent>(); // NavMesh Agentの取得
}
void Update()
{
agent.SetDestination(target.position); // ターゲットの位置まで自動で移動
}
}
SetDestination
メソッドでターゲットの位置に向かって自動的に移動します。NavMeshAgent
は自動的に最適なルートを計算し、障害物を避けながら移動します。マウスでクリックした場所にキャラクターを移動させる方法です。プレイヤーがインタラクティブにキャラクターを操作できるようになります。
using UnityEngine;
using UnityEngine.AI;
public class ClickToMove : MonoBehaviour
{
private NavMeshAgent agent;
private Camera cam;
void Start()
{
agent = GetComponent<NavMeshAgent>();
cam = Camera.main;
}
void Update()
{
if (Input.GetMouseButtonDown(0)) // 左クリックで目的地を設定
{
Ray ray = cam.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
agent.SetDestination(hit.point); // クリックした地点まで移動
}
}
}
}
Raycast
を使用して、クリックした位置を取得し、NavMesh Agentにその座標を設定することで移動を開始します。NavMeshの設定をカスタマイズして、移動の挙動を調整します。NavMesh Agent
には、次のようなプロパティが用意されています。
using UnityEngine;
using UnityEngine.AI;
public class CustomNavMeshAgent : MonoBehaviour
{
public Transform target;
private NavMeshAgent agent;
void Start()
{
agent = GetComponent<NavMeshAgent>();
agent.speed = 6f; // 移動速度のカスタマイズ
agent.stoppingDistance = 1f; // 目的地の手前1mで停止
agent.angularSpeed = 120f; // 回転速度のカスタマイズ
}
void Update()
{
agent.SetDestination(target.position);
}
}
speed
やstoppingDistance
の変更により、エージェントの動きが柔軟にカスタマイズできます。NavMeshは複雑な地形やマップでも利用可能です。橋や坂、複数階層の構造物を含むシーンでは、以下の方法を考慮してNavMeshを生成できます。
複数のキャラクターが同時にNavMeshを使用して移動する場合のサンプルです。キャラクター同士がぶつからないように、NavMeshの衝突回避が自動で処理されます。
using UnityEngine;
using UnityEngine.AI;
public class MultipleAgents : MonoBehaviour
{
public Transform[] targets;
private NavMeshAgent[] agents;
void Start()
{
agents = FindObjectsOfType<NavMeshAgent>(); // シーン内の全てのNavMesh Agentを取得
}
void Update()
{
for (int i = 0; i < agents.Length; i++)
{
agents[i].SetDestination(targets[i % targets.Length].position); // 各エージェントに異なる目的地を設定
}
}
}
NavMeshAgent
のコリジョン回避機能により、エージェント同士が衝突することなく移動します。NavMeshとTPS視点を組み合わせて、プレイヤーが自由に動ける環境を提供します。
using UnityEngine;
using UnityEngine.AI;
public class TPSNavMeshMove : MonoBehaviour
{
public Camera playerCamera;
private NavMeshAgent agent;
void Start()
{
agent = GetComponent<NavMeshAgent>();
}
void Update()
{
// TPS風のカメラ移動
if (Input.GetMouseButtonDown(0))
{
Ray ray = playerCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
agent.SetDestination(hit.point);
}
}
}
}
この教材では、NavMeshの基本から応用までをカバーしました。NavMesh Agent
の活用方法、マウスクリックでの移動、複数エージェントの管理、カスタマイズ可能なパラメータ、そしてTPS視
点との組み合わせまで、さまざまな応用が可能です。