【Unity】Navigationを使って経路探索させる


概要

今回は以下のようなシンプルなプロジェクトを作り、Navigationの超基本的な使い方を学びます。

今回のプロジェクトでは、Unityちゃんがプレイヤー、赤いCubeが目的地になっています。

【この記事の対象】 初中級程度の方

Navigationとは?

UnityにはNavigatonという機能が搭載されています。

Navigationとはシーンのジオメトリから生成されるナビゲーションメッシュを使用して、ゲームの世界を知的に歩くことのできる機能です。
(Unity公式リファレンスより:ナビゲーションと経路探索

今回はNavMeshAgentというコンポーネントを使ってNavigationを使っていきたいと思います。

1.GameObjectを配置

まずは任意の場所にプレイヤー、目的地、障害物、地面を配置します。

今回はそれぞれのGameObjectに

種類      名前
プレイヤー(Unityちゃん) Player
目的地(Red) Destination
障害物(Green) Obstacle
地面(White) Ground

という名前をつけました!

2.NavMeshAgentをつける

次に今回の記事の要であるComponentのNavMeshAgentをつけていきます。

NavMeshAgentは経路探索をして、動いて欲しいObjectにアタッチします。
今回のプロジェクトではPlayerにアタッチします。

3.Playerのスクリプトを書く

次にPlayerのスクリプトを書いていきます。

PlayerController.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class PlayerController : MonoBehaviour
{
    NavMeshAgent Player_Nav;
    GameObject Destination;

    void Start()
    {
        //プレイヤーのNavMeshAgentを取得
        Player_Nav = GetComponent<NavMeshAgent>();
        //目的地のオブジェクトを取得
        Destination = GameObject.Find("Destination");
    }

    void Update()
    {
        //目的地を設定
        Player_Nav.SetDestination(Destination.transform.position);
    }
}

ポイントは

   1.名前空間using UnityEngine.AIを記入しているか
   2.PlayerのNavMeshAgentをきちんと取得できているか
   3.SetDestinationをきちんと書いている(目的地の指定ができている)

の3点です!!

4.NavigationWindowを開く

次にPlayerが行動できる範囲を指定するために、NavigationWindowを開きます。

5.移動範囲をBakeする

それではPlayerの移動範囲を指定していきましょう。

Ground、Obstacleを選択し、Inspectorビュー内のStaticの横にある三角をクリックし、Navigation Staticを選択します。

次に歩かせる範囲と歩かせない範囲を指定します。

範囲の指定にはNavigationWindowのObjectのNavigation Areaの部分をいじっていきます。

Navigation Area 機能
Walkable 選択したエリアが歩けるようになる
Not Walkable 選択したエリアが歩けないようになる
Jump auto-generated、Off-Mesh Links の際に利用する(今回は使用しません)

今回のプロジェクトにおいて歩かせる範囲はGround、歩かせない範囲はObstacleにあたるので、
GroundをWalkableに、ObstacleをNot Walkableに設定します。

以上の設定が完了したら、NavigationビューBakeの右下にあるBakeをクリックして移動範囲の指定を完了させます。

上の画像のように、移動範囲が青く表示されたら完了です!!!

6.動かしてみる

以上の設定が終わったらプレビューボタンを押してみましょう。

PlayerのUnityちゃんが自動で経路探索し、指定範囲の上を歩きましたね!!
これでNavigation機能を使うことができました!!

最後に

いかがだったでしょうか?

Navigation機能はこんなに簡単に実装できてしまうんです。

次回の記事ではNavigation機能を使用して、動く障害物を避ける方法をご紹介したいと思います。