NPCを目的地へ移動させる
Unityではナビメッシュを使うと、目的地を設定するだけで、NPCを移動させられます。障害物を避けながら最短経路を見つけます。
まず、床、NPC(緑色)、障害物(黄色)、目的地(黒色)を用意します。
このNPCはエージェントと呼ばれます。
目的地は、簡単に座標をエージェントに使えるために作ったSphereです。
各オブジェクトにナビメッシュ用のコンポーネントを追加していきます。
インスペクタのAdd Componentから、エージェントにはNav Mesh Agentを、障害物にはNav Mesh Obstacleをつけます。
障害物は、形を2種類から選べます。
床、障害物をすべて同時選択し、インスペクタのあるウィンドウの Navigationタブ -> Object でNavigation Staticにチェックをいれます。
そして、Bake の一番下にあるBakeボタンをクリックすると、ナビメッシュが作成されます。
青いところが、エージェントの歩ける場所です。余白はエージェントの半径に合わせて設定できます。
スクリプトを作る
エージェントに目的地を伝えるには、エージェントのオブジェクトに以下の短いスクリプトをつけます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class agentScript : MonoBehaviour
{
public Transform point;
// Start is called before the first frame update
void Start()
{
NavMeshAgent agent = GetComponent<NavMeshAgent>();
agent.destination = point.position;
}
// Update is called once per frame
void Update()
{
}
}
そして、エージェントのインスペクタで、目的地のオブジェクトをアタッチします。
すると、エージェントは勝手に最短経路で目的地へ向かい、障害物があれば自動で避けます。
目的地を複数作れば、簡単にNPCを巡回させることができます。
https://docs.unity3d.com/ja/2018.1/Manual/nav-AgentPatrol.html
プレイヤーを追いかけるNPC
コードを少し変えて、Update内でエージェントにプレイヤーの現在位置を教えると、エージェントはプレイヤーにずっとついてきます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class agentScript : MonoBehaviour
{
public Transform point;
public Transform player;
NavMeshAgent agent;
// Start is called before the first frame update
void Start()
{
agent = GetComponent<NavMeshAgent>();
//agent.destination = point.position;
}
// Update is called once per frame
void Update()
{
agent.destination = player.position;
}
}
プレイヤーを障害物に設定すれば、エージェントは移動するプレイヤーを避けながら目的地へ向かいます。