UnityのNavmeshでキャラクターを歩かせる(走らせる)

UnityのNavMeshに関する記事で、歩かないキャラクターが移動するパターンはいろいろあるけど、ちゃんと歩いてるのがほとんどない!あっても複雑な処理してる…ということで、極力シンプルにNavMeshで目的地まで歩く方法を書いてみました。いろいろと追記しますが、ひとまず。

目的地まで走らせる

1.Humanoid型のキャラクターをHierarchyに設置し、「Nav Mesh Agent」コンポーネントを設定して下記のようにする。
Heightに関してはキャラクターの身長を入力してください。

画像1

2.Animator Controllerを作成し、ドラッグ&ドロップでキャラクターの「Controller」に適用する。このとき「Apply Root Motion」のチェックは外しておく

画像2

3.Animatorウィンドウを開き、何もないところで右クリックし、「Create State」→「From New Blend Tree」を選択する

画像3

4.「Blend Tree」をダブルクリックする

画像4

5.そうするとBlend Treeの中身が開くので、クリックして、「Inspector」→「Motion」の「+」ボタンを3回クリックする

画像5

6.それぞれに「Idel」アニメーション、「Walk」アニメーション、「Run」アニメーションを設定する

画像6

7.「Automate Thresholds」のチェックを外し、Thresholdsを下記のように入力する。これはアニメーションのブレンド具合を調整するもの

画像7

8.「Parameters」タブをクリックし、「Blend」となっているところを「Move」に変更する

画像8

9.目的地のオブジェクトを作成する

10.C#のスクリプトファイルを作成し、キャラクターに適用する。キャラクターの「Inspector」に「Points」という項目が出てくるので、「+」ボタンを押して目的地のオブジェクトをドラッグ&ドロップする

画像11

Unity公式のリファレンスにアニメーション部分を加筆しただけです。

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

//NavMeshを使うときに書く
using UnityEngine.AI;

public class NavWalk : MonoBehaviour
{
   private NavMeshAgent agent;

   //目的地の数と場所の設定
      public Transform[] points;

      //最初の目的地
           private int destPoint = 0;

           //アニメーション用
           private Animator animator;

   // Start is called before the first frame update
   void Start()
   {
       agent = GetComponent<NavMeshAgent>();
       animator = GetComponent<Animator>();
       GotoNextPoint();
   }

void GotoNextPoint() {
               // 地点がなにも設定されていないときに返します
               if (points.Length == 0)
                   return;

               // エージェントが現在設定された目標地点に行くように設定します
               agent.destination = points[destPoint].position;

               // 配列内の次の位置を目標地点に設定し、
               // 必要ならば出発地点にもどります
               destPoint = (destPoint + 1) % points.Length;
           }

   // Update is called once per frame
   void Update()
   {
        // エージェントが現目標地点に近づいてきたら、
               // 次の目標地点を選択します
               if (!agent.pathPending && agent.remainingDistance < 0.5f)
                   GotoNextPoint();
//アニメーションの切り替え
                   animator.SetFloat("Move",agent.velocity.magnitude);
   }
}

ターゲットを追いかける

1.Humanoid型のキャラクターをHierarchyに設置し、「Nav Mesh Agent」コンポーネントを設定して下記のようにする。
Heightに関してはキャラクターの身長を入力してください。

画像1

2.「目的地まで走らせる」の項目で作成したAnimator Controllerを複製し、ドラッグ&ドロップでキャラクターの「Controller」に適用する。このとき「Apply Root Motion」のチェックは外しておく

3.キャラクターが追いかける目標物を作成する

4.C#のスクリプトファイルを作成し、キャラクターに適用する。その後、キャラクターのInspectorにあるPlayerのとなりに、追いかけたい目標物のオブジェクトをドラッグ&ドロップする

画像10

この場合は目標物をキャラクターが追いかける形ですが、キャラクターをキーボード等で歩けるようにして目標物にこのスクリプトを適用させれば、キャラクターが追いかけられます。

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

//NavMesh使うときは記述する
using UnityEngine.AI;

//NavMeshAgentのつけ忘れ防止
[RequireComponent(typeof(NavMeshAgent))]

public class EnemyMove : MonoBehaviour
{

//キャラクターが追いかける目標物を指定
public GameObject player;
   
   private NavMeshAgent navMeshAgent;

   //アニメーションの準備
   private Animator animator;

   // Start is called before the first frame update
   void Start()
   {
       
       navMeshAgent = GetComponent<NavMeshAgent>();

       //アニメーションの準備
       animator = GetComponent<Animator>();
   }

   // Update is called once per frame
   void Update()
   {
       //アニメーション切り替え
       animator.SetFloat("Move",navMeshAgent.velocity.magnitude);
       //キャラクターが目標物目指して動く
       navMeshAgent.destination = player.transform.position;
   }
}

この記事が気に入ったらサポートをしてみませんか?