プログラミング逆引き辞典

~ 多言語対応のプログラミングレシピ ~

Unityナビゲーションシステムの使い方

■動物キャラが障害物を避けながら、マウスクリックした位置に歩行移動していくUnityのナビゲーションシステムについて解説する
 
①アセットストアから「cartoon cat」を取得し、「Rig」と「Animation」の設定をする
 
【Rigの設定】
「Animation Type」を「Legacy」に設定して、「Apply」押下

【Animation】の設定
2か所の「Wrap Mode」を「Loop」に設定して、「Apply」押下

 
②「ヒエラルキーウィンドウ」に「Plane」と「cat_Walk」を追加

③更に適当に「Cube」や「Capsule」を追加して、わかりやすいようにマテリアルで色付けする

 
④ナビゲーションを設定
「Window」タブ⇒「AI」⇒「Navigation」を押下

 
一旦セーブし、障害物を全て選択後、「Navigation Static」にチェック

 
「Bake」タブを押下し「Bake」ボタンを押下

 
「cat_Walk」が移動できる範囲が表示される

 
⑤「cat_Walk」の目指す目標点を「Sphere」で作成し、「target」という名前でプレファブ化する

 
⑥ヒエラルキーウィンドウから「target」プレファブを削除後、「cat_Walk」を選択し、「Add Componet」から「Nav Mesh Agent」と追加

 
⑦マウスでクリックした位置に「target」プレファブを配置するスクリプト(WalkingTarget.cs)を作成し、「cat_Walk」にセット
「Pysics.Raycast」の詳細はこちら→Unity3D 【詳細】Physics.RayCast


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

public class WalkingTarget : MonoBehaviour
{
    //ナビゲーションを使用する為にNavMeshAgent型の変数
    NavMeshAgent agent;
    //targetプレファブを作成する為のゲームオブジェクト
    public GameObject target;

    // Start is called before the first frame update
    void Start()
    {
        //NavMeshAgentコンポーネントにアクセスして変数agentを参照
        agent = GetComponent<NavMeshAgent>();
    }

    // Update is called once per frame
    void Update()
    {
        //マウスを左クリックした場合の処理
        //※引数が1なら右クリック
        if (Input.GetMouseButtonDown(0)) {
            //Ray(光線)を飛ばした時にRayとオブジェクトが衝突した時の情報を得る為の変数
            RaycastHit hit;
            //マウスをクリックした位置にRayを飛ばす
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            //飛ばしたRayがマウスをクリックした位置と衝突した場合
            if (Physics.Raycast(ray, out hit, 100.0f)) {
                //Rayが当たった場所にtargetプレファブを配置
                Instantiate(target, hit.point, Quaternion.identity);
                //プレイヤーをターゲットに移動
                agent.destination = hit.point;
            }
        }
    }
}

 
⑧「cat_Walk」に「target」プレファブをセット

 
⑨Unityを再生し、クリックした位置にtargetプレファブが配置され、プレイヤー(猫)がその方向に向かって歩くけばOK