バーチャル3Dクリエイター神部まゆみです(*^_^*)
この記事はUnityで村人をランダム歩行させる方法メモです。
会話システムについてはこちら。
やりたいこと:Humanoidの村人をNavMeshでウロウロさせる
JU TPS3で戦闘は作れるようになったから、村とか作ってゲームっぽいところを作ってみたい。
ChatGPT氏に聞いてみる
まぁ彼に聞けば大抵は教えてくれると思います。
会話システムを作ろうと思って聞いたのだけど、まずウロウロさせるところから聞いてみました。




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


はい、村人をウロウロさせるには NavMesh を使うのが良い方法です。
以下の手順で実装できます。
1. NavMeshの設定
- 地面をNavMeshにベイク
Window > AI > Navigation
を開く。Bake
タブでBake
を押してNavMeshを生成する。
- 村人に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
を使って歩行アニメーションを設定します。
- Animator Controllerを作成
Assets
フォルダで右クリック →Create > Animator Controller
Idle
(待機)とWalk
(歩行)のAnimation Clip
を設定Blend Tree
を作成し、NavMeshAgent.velocity.magnitude
に応じてIdle
とWalk
をブレンド
- スクリプトでアニメーションを制御
アニメーションを制御するスクリプト NPCAnimation.cs
Speed
が 0 のとき 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はこれね。

以前導入方法を書いたけど。
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して設定します。
この時点でこんな感じ。


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


これで動いた! …がなんかおかしい
あれ、Walkのアニメーションに切り替わってないな…。
アニメーションをループにし、BlendTreeのパラメーターを見直したら動いた
ここが初期のBlendになっていたのでSpeedにしたらちゃんと切り替わった。


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


これでちゃんと動いた!
おわりに
結構簡単に動いて良かった。
ブレンドツリー周りはもう少し勉強が必要かな。使いこなせれば色々使えそう。
次は会話システムを作ってみたいかな。
ChatGPT氏に聞けばまぁなんとかなるだろう…。
もう少しいじってみます(*^_^*)
追記:会話システムを作ってみました。