久しぶりにAI Navigationを使おうとしたら、使い方が変わっていたのでここに書き残しておきます。
まず、下の画像のように床と壁を設置します。サイズは適当で大丈夫です。
次に、床のオブジェクトに対してAdd Componentから「NavMesh Surface」を追加します。
その後、NavMesh SurfaceのBakeをクリックします。下の画像のようになっていれば成功です。
プレイヤー(青色のCapsule)と敵(赤色のCapsule)を作成し、シーンに追加します。
敵オブジェクトにAdd Componentから「Nav Mesh Agent」を追加します。
敵オブジェクトにEnemyAgentという名前のスクリプトを作成しアタッチした後、以下のコードをコピペします。
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;
}
}
次に、プレイヤーオブジェクトにRigidbodyを追加し、ConstraintsのFreeze Rotationにすべてチェックを入れます。 その後、Playerという名前のスクリプトを作成しアタッチした後、以下のコードをコピペします。
using UnityEngine;
public class Player : MonoBehaviour
{
public float moveForce = 10f; // 移動の力
public float maxSpeed = 5f; // 最大速度
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// 入力を取得
float horizontalInput = Input.GetAxis("Horizontal"); // A, D, ←, →
float verticalInput = Input.GetAxis("Vertical"); // W, S, ↑, ↓
// 移動方向に力を加える
Vector3 movement = new Vector3(horizontalInput, 0f, verticalInput);
rb.AddForce(movement * moveForce);
// 最大速度制限 (ベクトルの大きさで制限)
if (rb.linearVelocity.magnitude > maxSpeed)
{
rb.linearVelocity = rb.linearVelocity.normalized * maxSpeed;
}
}
}
エディターを実行すると、敵がプレイヤーを壁を避けて追いかけてきます。
手軽に実装できるので、ぜひ導入してみてください。