こんにちは、カバゴトです!今回は、NaviMeshの使い方ついて超初心者向けに解説していきたいと思います!
完成形は以下のようになります!
NavMeshとは?
NavMeshは、シーン内の特定のエリアをキャラクターが移動できる「ナビゲーション可能なエリア」として定義するメッシュ(3D空間における網目状の構造)のことです。これにより、ゲーム内のキャラクターが障害物を避けながら目的地まで自律的に移動する経路を自動的に計算できます。
NavMesh Bake(ナビメッシュベイク)
NavMeshを作成するプロセスのことです。シーン内の地形やオブジェクトの形状に基づいて、ナビゲーション可能なエリアを計算し、メッシュを生成します。
Baked Agent Size(エージェントのサイズ)
- Agent Radius:エージェントの半径を示しています。エージェントがナビゲーションするための道幅に影響し、狭い場所を通れるかどうかが決まります。
- Max Slope:エージェントが移動できる最大傾斜角度を設定します。
- Step Height:エージェントが乗り越えられる最大段差の高さを設定します。
Generated Off Mesh Links(オフメッシュリンクの生成)
- Drop Height:エージェントが飛び降りられる最大の高さを設定します。
- Jump Distance:エージェントがジャンプして移動できる最大の距離を設定します。
Agent(エージェント)とは、NavMeshをもつオブジェクト(プレイヤー、NPC等)のことです。
NavMesh Agent(ナビメッシュエージェント)
NavMesh上を移動するキャラクターやエンティティに付与するコンポーネントです。NavMesh Agentには、移動速度、回転速度、停止距離などのパラメータが設定でき、これらのパラメータを基にエージェントはNavMesh上で経路を探索して移動します。
NavMesh Obstacle(ナビメッシュオブスタクル)
動的に配置される障害物をシミュレートするためのコンポーネントです。これにより、エージェントはリアルタイムで経路を再計算し、障害物を避けながら目的地までのルートを変更します。
下準備
「Game Object」→「3D Object」→「Cube」、「Capsule」、「Sphere」、「Plane」をクリックしオブジェクト出します。
また、「Assets」→「Create」→「Material」で色を付けます。
NavMeshのインストール
「Windows」→「Package Manager」で「NavMesh」と検索すると、「AI Navigation」が出てくるのでそれをインストールします。
NavMesh Bake
「Window」→「AI」→「Navigation(obsolete)」をクリックすると、Navigation(obsolete)ビューが出てきます。
ステージを(Plane)選択し、Navigation(obsolete)ビューの「Nabigation Static」にチェックを入れます。
上の「Bake」をクリックし、下の「Bake」をクリックします。(ここで移動範囲等を設定します)
インスペクタービュー(inspector)に戻し、「Cupsule」(Player)を選択、「Add Component」で、「Nav Mesh Agent」コンポーネントを追加します。・
スクリプト作成
Playerのスクリプト
using UnityEngine;
using System.Collections;
public class PlayerController : MonoBehaviour
{
public float Speed = 5.0f; // 移動速度 m/s
// Update is called once per frame
void Update()
{
Vector3 pos = transform.position;
float moveLength = Speed * Time.smoothDeltaTime;
if (Input.GetKey(KeyCode.W))
{
pos.z += moveLength;
}
else if (Input.GetKey(KeyCode.S))
{
pos.z -= moveLength;
}
else if (Input.GetKey(KeyCode.A))
{
pos.x -= moveLength;
}
else if (Input.GetKey(KeyCode.D))
{
pos.x += moveLength;
}
transform.position = pos;
}
}
初期速度を5m/sとし、wasdキーで動けるようにしています。
Enemyのスクリプト
using UnityEngine;
using UnityEngine.AI;
public class EnemyController : MonoBehaviour
{
public GameObject TargetObject; // 目標位置
private NavMeshAgent m_navMeshAgent; // NavMeshAgent
void Start()
{
// NavMeshAgentコンポーネントを取得
m_navMeshAgent = GetComponent<NavMeshAgent>();
}
void Update()
{
// NavMeshが準備できており、TargetObjectが設定されている場合
if (m_navMeshAgent.pathStatus != NavMeshPathStatus.PathInvalid && TargetObject != null)
{
// NavMeshAgentに目的地をセット
m_navMeshAgent.SetDestination(TargetObject.transform.position);
}
}
// タグ "Player" を持つオブジェクトに触れたときに呼ばれるメソッド
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
Debug.Log("Playerに触れました!");
}
}
}
Nav Meshを使い、Playerをターゲットとして追従するプログラムです。また、タグ(Player)を持つオブジェクトに触れたとき”Playerに触れました!”と表示するようにしています。
その他設定
「Enemy」にインスペクタービューの「Add Component」→「Rigidbody」を追加します。
また、「Player」の「Tag」→「Add Tag」をクリックします。
「+」をクリックし、新しいタグの名前を「Player」とします。
実際に動かしてみる
動きました!(適宜カメラの位置等は調整してください)
終わりに
最後まで読んでくださりありがとうございます!今回は、NaviMeshの基本的な使い方について解説しました。もし、うまくいない場合や意見等あればコメントの方をよろしくお願いします!
この記事が参考になれば幸いです。また、次回のブログでお会いしましょう!
コメント