UnityのNavmeshでキャラクターを歩かせる(走らせる)
UnityのNavMeshに関する記事で、歩かないキャラクターが移動するパターンはいろいろあるけど、ちゃんと歩いてるのがほとんどない!あっても複雑な処理してる…ということで、極力シンプルにNavMeshで目的地まで歩く方法を書いてみました。いろいろと追記しますが、ひとまず。
目的地まで走らせる
1.Humanoid型のキャラクターをHierarchyに設置し、「Nav Mesh Agent」コンポーネントを設定して下記のようにする。
Heightに関してはキャラクターの身長を入力してください。
2.Animator Controllerを作成し、ドラッグ&ドロップでキャラクターの「Controller」に適用する。このとき「Apply Root Motion」のチェックは外しておく
3.Animatorウィンドウを開き、何もないところで右クリックし、「Create State」→「From New Blend Tree」を選択する
4.「Blend Tree」をダブルクリックする
5.そうするとBlend Treeの中身が開くので、クリックして、「Inspector」→「Motion」の「+」ボタンを3回クリックする
6.それぞれに「Idel」アニメーション、「Walk」アニメーション、「Run」アニメーションを設定する
7.「Automate Thresholds」のチェックを外し、Thresholdsを下記のように入力する。これはアニメーションのブレンド具合を調整するもの
8.「Parameters」タブをクリックし、「Blend」となっているところを「Move」に変更する
9.目的地のオブジェクトを作成する
10.C#のスクリプトファイルを作成し、キャラクターに適用する。キャラクターの「Inspector」に「Points」という項目が出てくるので、「+」ボタンを押して目的地のオブジェクトをドラッグ&ドロップする
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に関してはキャラクターの身長を入力してください。
2.「目的地まで走らせる」の項目で作成したAnimator Controllerを複製し、ドラッグ&ドロップでキャラクターの「Controller」に適用する。このとき「Apply Root Motion」のチェックは外しておく
3.キャラクターが追いかける目標物を作成する
4.C#のスクリプトファイルを作成し、キャラクターに適用する。その後、キャラクターのInspectorにあるPlayerのとなりに、追いかけたい目標物のオブジェクトをドラッグ&ドロップする
この場合は目標物をキャラクターが追いかける形ですが、キャラクターをキーボード等で歩けるようにして目標物にこのスクリプトを適用させれば、キャラクターが追いかけられます。
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;
}
}
この記事が気に入ったらサポートをしてみませんか?