【Unity】初学者にオススメのNavigationを使ったオブジェクトの自動徘徊

unitty_nav Unity

この記事の目的

次に制作するゲームの基本システムを開発しているときに見つけた「Navigation」の備忘録な記事です。

参考サイトはこちら
[Unity] たった3分で移動AI?UnityのNavigation機能がスゴイ
【Unity】ナビゲーションシステムを使用して目的地まで移動しよう!

指定したターゲットに向けてオブジェクトを自動的に移動させる、非常に使い勝手の良い機能です。

Navigation機能を使うときに2つ設定しないといけない
・NavMeshAgent→移動する対象につけるコンポーネント
・NavMesh→オブジェクトが移動できる範囲(Bakeで設定)

もし移動経路に避けてほしい障害物があるなら
・NavMeshObstacle→障害物などにつけるコンポーネント

もっと細かく知りたい方は、
冒頭の参考サイトやこちらの公式ドキュメントなどを参考にしてください!

公式ドキュメント:ナビゲーションと経路探索から引用

ナビゲーションシステムによって、シーンのジオメトリから自動で生成されるナビゲーションメッシュを使用して、ゲーム世界の中を知的に動くキャラクターを作成することができます。

ナビゲーションと経路探索

試作品がこちらです。

NavMesh自動徘徊

Navigationの使用手順(私の)
1.ステージと必要なオブジェクトを作成・配置
2.オブジェクトの設定(ScriptやNavMeshAgentコンポーネ ント、オブジェクトのStatic設定など)
3.BakeをしてNavMeshを作成する

まずは必要なゲームオブジェクトの作成!
目的地となるPillar1~4には”Pillar”というタグをつけています。

画像1

また、地面や障害物・目的地は動かないものとして
Inspector/Static をtrueにしています。

画像2

自動で動く赤いボールにアタッチする
“BollController”というスクリプトファイルの中身はこちら。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI; //NavMeshAgentを使うために必要

public class BollController : MonoBehaviour
{
   private GameObject[] targets; // 目的地
   private int nextIndex = 0; //次の目的地のインデックス
   private NavMeshAgent agent; //自動で動くオブジェクト

   void Start() {
       // アタッチされているオブジェクトのNaveMeshAgentを取得
       agent = GetComponent<NavMeshAgent>();

       // 目的地情報の取得(順番通りに取得できるわけではない)
       targets= GameObject.FindGameObjectsWithTag("Pillar");

       // 最初の目的地を設定
       agent.destination = targets[nextIndex].transform.position;
   }

   void OnCollisionEnter(Collision collision) {

       // 衝突対象が目的地のピラーだったら次の目的地を設定する
       if (collision.gameObject.tag == "Pillar") {
           
           // 次の目的地のインデックスにする
           if (nextIndex < targets.Length - 1) {
               nextIndex++;
           } else {
               nextIndex = 0;
           }
           
           // インデックスに応じた目的地を設定する
           agent.destination = targets[nextIndex].transform.position;
       }
       
   }
}

衝突判定を行うオブジェクトにはRigidbodyコンポーネントをつけています。
また、NavMeshAgentコンポーネントをAutoBollにつけています。

画像3

次にNavigationWindowからNavMeshを設定するためにBakeします!
こちらからNavigationWindowを開けます。

画像4

今回はあらかじめ動かないオブジェクトのStaticはtrueにしているので、
ObjectタブのNavigation Staticについてはスルーします。trueなら大丈夫。

Bakeタブの右下Bakeボタンを押したら、歩ける経路が決まります!

画像5

これだけの設定で先ほどのように自動で移動を繰り返してくれます!
さらに細かな設定をすると、もっと自由に動けるのかな。奥深いですね。

まとめ

Navigationを上手く使いこなせれば、
作れるゲームの幅が広がるような感じがしますね!

今回はさくっと書いてみましたが、いかがでしたでしょうか。
ぜひ、試してみた感想などコメントしてください。

読者のお役に立てましたら幸いです。

Unity学習のオススメ参考書

コメント

タイトルとURLをコピーしました