Unityで村人をランダム歩行徘徊させたメモ。Navmeshやブレンドツリーなど

unity navmesh 3Dゲームの作り方
※記事内に広告が含まれています。

バーチャル3Dクリエイター神部まゆみです(*^_^*)

この記事はUnityで村人をランダム歩行させる方法メモです。

会話システムについてはこちら。

●PRスペース●
■PR■

現在、TPSシステム系アセットが50%オフで買える Unityパブリッシャーセール をやってるみたいです(2025/09/12 23:59まで)。

Unity パブリッシャーセール 50%オフ

クーポンコード FANTACODESTUDIOS を使うと、↓のロープスイングシステムがタダで貰えます(決済時にクーポンコード入力適用で0円に)。

unity ロープスイングシステム

無料アセットだけでも貰っておくと良いかも。

〇まゆみマート|BOOTH

BOOTHでVRoidテクスチャやVRChat向けオブジェクトなどを販売しています。いいねしてくれると励みになります(*^-^*)

やりたいこと:Humanoidの村人をNavMeshでウロウロさせる

JU TPS3で戦闘は作れるようになったから、村とか作ってゲームっぽいところを作ってみたい。

ChatGPT氏に聞いてみる

まぁ彼に聞けば大抵は教えてくれると思います。

会話システムを作ろうと思って聞いたのだけど、まずウロウロさせるところから聞いてみました。

unity 村人 ウロウロ 徘徊
神部まゆみ
神部まゆみ

村人をウロウロさせる動作はNavmeshを使って実装すればいいのでしょうか?村人のhumanoidモデルは既にありますがアニメーションはまだ設定していません。歩行アニメーションはあります。

ChatGPT
ChatGPT

はい、村人をウロウロさせるには NavMesh を使うのが良い方法です。
以下の手順で実装できます。

1. NavMeshの設定

  1. 地面をNavMeshにベイク
    • Window > AI > Navigation を開く。
    • Bake タブで Bake を押してNavMeshを生成する。
  2. 村人にNavMeshAgentを追加
    • NavMeshAgent コンポーネントを追加し、以下のパラメータを調整:
      • Speed: 移動速度(例えば 2
      • Angular Speed: 旋回速度(120 くらい)
      • Stopping Distance: 目的地にどれくらい近づいたら止まるか

2.村人をランダムに歩かせるスクリプト NPCWander.cs

このスクリプトを村人にアタッチすると、一定範囲内をランダムに移動するようになります。

using UnityEngine;
using UnityEngine.AI;

public class NPCWander : MonoBehaviour
{
    public float wanderRadius = 10f; // 移動範囲
    public float waitTime = 2f; // 次の目的地へ移動するまでの待機時間
    private NavMeshAgent agent;
    private float timer;

    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        SetNewDestination();
    }

    void Update()
    {
        if (!agent.pathPending && agent.remainingDistance < 0.5f)
        {
            timer += Time.deltaTime;
            if (timer >= waitTime)
            {
                SetNewDestination();
                timer = 0;
            }
        }
    }

    void SetNewDestination()
    {
        Vector3 randomDirection = Random.insideUnitSphere * wanderRadius;
        randomDirection += transform.position;
        NavMeshHit hit;
        if (NavMesh.SamplePosition(randomDirection, out hit, wanderRadius, NavMesh.AllAreas))
        {
            agent.SetDestination(hit.position);
        }
    }
}

3. 歩行アニメーションの設定

Animator を使って歩行アニメーションを設定します。

  1. Animator Controllerを作成
    • Assets フォルダで右クリック → Create > Animator Controller
    • Idle(待機)と Walk(歩行)の Animation Clip を設定
    • Blend Tree を作成し、NavMeshAgent.velocity.magnitude に応じて IdleWalk をブレンド
  2. スクリプトでアニメーションを制御

アニメーションを制御するスクリプト NPCAnimation.cs

Speed0 のとき Idle、大きいと Walk になるように設定。

using UnityEngine;

public class NPCAnimation : MonoBehaviour
{
    private Animator animator;
    private NavMeshAgent agent;

    void Start()
    {
        animator = GetComponent<Animator>();
        agent = GetComponent<NavMeshAgent>();
    }

    void Update()
    {
        animator.SetFloat("Speed", agent.velocity.magnitude);
    }
}

まとめ

NavMeshを使ってランダム移動を実装
Animatorを設定し、移動速度に応じて歩行アニメーションを適用

まずは NavMeshAgent で移動だけ実装 してみて、その後アニメーションを組み込むのが良いと思います!

……おお、案外簡単にできそう?

適当にキューブをウロウロさせる動作なら以前実装したことがあるけど、アニメーションはまだ設定したことがないなあ。

Mixamoに歩行とIdleアニメーションはあったからそれを使おうかな。

とりあえずウロウロ動かすところまで実装してみる

アニメーションはブレンドツリーの設定などがあるので、まずウロウロさせるところまでやってみます。

Humanoidの村人を配置してNavmesh Agentを追加する

これはVRoidでもなんでもHumanoidならいいです。

私は手持ちアセットのやつを使うけど。

村人にNavmesh Agentコンポーネントを追加します。

地面にNavmesh Surfaceを追加してベイクする

地面を選択してNavmesh Surfaceコンポーネントを追加、ベイクを押して待つと移動可能範囲が青く表示されます。

スクリプトを村人に設定する

上述のNPCWander.csスクリプトをコピペして村人にアタッチします。

これで動いた!

アニメーションは設定していないのでTポーズのままだけど、ウロウロさせることに成功!

オブジェクトをうごかすだけならこれで終わりだけど、Humanoidなのでアニメーションも設定しないといけない。

アニメーションを設定してウロウロさせてみる

ブレンドツリーを使うと良いらしいっす。

少しいじったことはあるけど、よく知らないのでChatGPT氏に聞きながらやります。

Mixamoでアニメーションをダウンロードしておく

↓Mixamoはこれね。

Mixamo

以前導入方法を書いたけど。

IdleとWalkと検索して、適当にダウンロードします。一応without skinに、60fpsでダウンロードしておく。

ダウンロードしたファイルをunityにインポート、Humanoidにして複製

unityにインポートして、Humanoidを選んで適用します。これやらないと動きません。

ファイルの中身の △ がアニメーションファイルなので、これを選択してCtrl+Dで複製して名前をIdleとWalkにしておく。元のファイルは用済みなので削除します。

なぜ複製するかというと、デフォルトの状態ではReadOnlyになっていてアニメーションの編集や設定変更ができないからです。

ファイルは後で設定するので、とりあえずここまででOKです。

アニメーターコントローラーを作って村人に設定する

アニメーターコントローラーを作成して村人に設定します。

アニメーター画面でブレンドツリーを作成する

アニメーター画面を開いて、ブレンドツリーを作成します。

ブレンドツリーの設定をする

作成したブレンドツリーをダブルクリックすると編集画面に入れます。

Blend Treeをクリックしてブレンドタイプを1Dに、左側のパラメーターをクリックして、float型のspeedパラメーターを作成する。

Motion の + を押し、Add Motion Field を2回押す。

1つ目に Idle のアニメーション、2つ目に Walk のアニメーションをD&Dして設定します。

この時点でこんな感じ。

unity blendtree

スクリプトを村人にアタッチする

上記のNPCAnimation.csスクリプトをコピペして、村人にアタッチします。

unity navmesh 村人

これで動いた! …がなんかおかしい

あれ、Walkのアニメーションに切り替わってないな…。

アニメーションをループにし、BlendTreeのパラメーターを見直したら動いた

ここが初期のBlendになっていたのでSpeedにしたらちゃんと切り替わった。

blendtree unity

あとアニメーションはループにしておかないとダメみたいなのでチェックを入れました。

blendtree 動かない

これでちゃんと動いた!

おわりに

結構簡単に動いて良かった。

ブレンドツリー周りはもう少し勉強が必要かな。使いこなせれば色々使えそう。

次は会話システムを作ってみたいかな。

ChatGPT氏に聞けばまぁなんとかなるだろう…。

もう少しいじってみます(*^_^*)

追記:会話システムを作ってみました。

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