ナビメッシュ

敵キャラクターや NPC が移動可能な領域を、内部的にメッシュとして保持するデータオブジェクト。シーン内のジオメトリを歩行可能サーフェスや障害物として設定し、ベイクすることで作成する。

公式サイト:

ナビメッシュの作成 | Unity マニュアル [公式]

 概要

ドキュメント:

ナビゲーションシステム | Unity マニュアル [公式]

ナビゲーションシステムの内部的なしくみ | Unity マニュアル [公式]

使い方

手順
  1. ベイク対象のオブジェクト (床や壁など) を Navigation Static に設定する。
  2. メニューから「Window > AI > Navigation」を選択して、「Navigation」ウィンドウを開く。
  3. 「Bake」タブで「Bake」ボタンをクリックしてベイクを実行する。
  4. シーンファイル (.unity ファイル) のあるディレクトリにシーンの名前でディレクトリが作成され、ナビメッシュファイル (NavMesh.asset) が生成される。

参考:

NavMesh を改めておさらい – Qiita

敵キャラを Unity のナビゲーション機能を使って移動させる | かめくめ

NavMesh 超入門 | おもちゃラボ

敵キャラを NavMesh でかしこくかっこよく動かしてみよう | k1t

近づいたら追いかけてくる巡回ユニティちゃん | イシゲーの Unity 保管庫

キャラクターを歩かせる/走らせる | よーへん

導入

参考:

ナビゲーションシステムを使用して目的地まで移動しよう! | XR-Hub

サクッと NavMesh を実装する手順 | TECH Projin

NavMesh を使った移動 | yttm-work

NavMesh Agent でよい感じにキャラクターを歩かせる | tanaka’s Programming Memo

NavMesh を学ぶ 焼けた編 | 陰干し中のゲーム開発メモ

NavMesh を学ぶ 障害物編 | 陰干し中のゲーム開発メモ

Terrain で作った世界に NavMesh を設定してうろつく | ぎーくなぁど

NavMesh を今さら勉強したお話 #1 | 個人的勉強メモ置き場

NavMesh を今さら勉強したお話 #2 | 個人的勉強メモ置き場

エージェント

再生開始後に指定した位置に移動させる。

using UnityEngine.AI;

public class MoveTo : MonoBehaviour
{
    public Transform destination;
    private NavMeshAgent agent;

    void Start()
    {
        agent = GetComponent();
        agent.destination = destination.position;
    }
}Code language: C# (cs)

ドキュメント:

NavMesh Agent に目的地へ移動することを伝える | Unity マニュアル [公式]

マウスでクリックした位置へエージェントを移動させる | Unity マニュアル [公式]

エージェントに設定した地点を巡回させる | Unity マニュアル [公式]

NavMeshAgent.destination | Unity スクリプトリファレンス [公式]

NavMeshAgent.SetDestination | Unity スクリプトリファレンス [公式]

参考:

ナビメッシュエージェントの使い方 | Uinty 使い方ガイド

アニメーション

[docs__]

アニメーションとナビゲーションの利用 | Unity マニュアル [公式]

参考:

NavMesh で取得した経路を ApplyRootMotion で移動させる手っ取り早い方法 | テラシュールブログ

NavMesh の経路探索と Animator のアニメーションを連動させる | テラシュールブログ

オフメッシュリンク (Off Mesh Link)

  • Drop-Down リンク段差を飛び降りる
  • Jump-Across リンク足場のギャップを飛び越える

ドキュメント:

Off Mesh Link の作成 | Unity マニュアル [公式]

Off Mesh Link | Unity マニュアル [公式]

オフメッシュリンクの自動生成 | Unity マニュアル [公式]

参考:

AI が賢く移動できるための機能、NavMesh とオフメッシュリンクを設定する – Qiita

ナビゲーション機能で Off Mesh Link を使って移動 | かめくめ

NavMesh Agent をジャンプさせる方法 | くろくまそふと

NavMesh で離れた空間にテレポートする | テラシュールブログ

キャラクターを歩行させる

参考:

NavMesh の AI 経路探索と Animator のアニメーションを連動させる | テラシュールブログ

NavMesh Agent でよい感じにキャラクターを歩かせる | tanaka’s Programming Memo

MMD モデルをタップした位置まで歩かせる手軽な方法 | テラシュールブログ

キャラクターを配置する

  • NavMesh.SamplePosition で配置可能な場所を見つけ、Instanciate でプレハブインスタンスを作成して配置する。

ドキュメント:

NavMesh.SamplePosition | Unity スクリプトリファレンス [公式]

Object.Instantiate | Unity スクリプトリファレンス [公式]

参考:

敵キャラの出現を自動化する | ソフトライム

ナビメッシュ上に敵を出現させる | 初心者からわかりやすく

How to disable NavMesh Agent specific warning – Unity Forum

最近接点を取得する (SamplePosition)

ドキュメント:

NavMesh.SamplePosition | Unity スクリプトリファレンス [公式]

コード:

Get Random Position on NavMesh (IJEMIN) – GitHub Gist

参考:

NavMesh.SamplePosition – Unity Forum

動く障害物を回避する (NavMesh Obstacle)

ドキュメント:

NavMesh Obstacle の作成 | Unity マニュアル [公式]

NavMesh Obstacle | Unity マニュアル [公式]

NavMeshObstacle | Unity スクリプトリファレンス [公式]

参考:

NavMesh Obstacle – ナビメッシュ障害物の使い方 | Uinty 使い方ガイド

動く障害物に NavMesh を適用させる方法 | とんプログラミング

障害物編 | 徳島ゲーム開発ごっこ

Nav Mesh Agent が避ける障害物を動かす | しっぽを追いかけて

Nav Mesh Obstacle を避けて移動してくれない場合 | いんでぃーづ

NavMesh Agent not avoiding obstacles correctly – Unity Forum

一時停止させる (Stop)

一時停止する。

agent.isStopped = true;Code language: C# (cs)

再開する。

agent.isStopped = false;Code language: C# (cs)

ドキュメント:

NavMeshAgent.isStopped | Unity スクリプトリファレンス [公式]

参考:

NavMesh を使った移動 | yttm-work

Enable / Disable the NavMesh Agent programatically? – Unity Discussions

How can I pause an NavMesh Agent moving in between waypoints and then continue? – Stack Overflow

ジャンプさせる

参考:

NavMesh Agent をジャンプさせる方法 | くろくまそふと

スクリプトからベイクする

ドキュメント:

NavMeshBuilder.BuildNavMesh | Unity スクリプトリファレンス [公式]

参考:

NavMesh bake multiple maps in the same scene – Stack Overflow

経路 (NavMeshPath)

プロパティ
  • hasPath 経路が設定されているかどうかを返す
  • pathPending 経路を探索中であるかどうかを返す (経路探索が完了すると false となる)
メソッド
  • SetDestination 目的地を設定し、経路を探索する
  • CalculatePath 経路を計算する
  • SetPath 経路を設定する
  • ResetPath 経路を破棄する

ドキュメント:

NavMeshPath | Unity スクリプトリファレンス [公式]

NavMeshAgent.hasPath | Unity スクリプトリファレンス [公式]

NavMeshAgent.pathPending | Unity スクリプトリファレンス [公式]

NavMeshAgent.SetDestination | Unity スクリプトリファレンス [公式]

NavMeshAgent.CalculatePath | Unity スクリプトリファレンス [公式]

NavMeshAgent.SetPath | Unity スクリプトリファレンス [公式]

NavMeshAgent.ResetPath | Unity スクリプトリファレンス [公式]

参考:

ナビメッシュの経路を取得して再利用する #1 | Unity の使い方

NavMesh Agent でよい感じにキャラクターを歩かせる | tanaka’s Programming Memo

経路上に等間隔にオブジェクトを配置する | Unity の使い方

移動

ドキュメント:

NavMeshAgent.Move | Unity スクリプトリファレンス [公式]

NavMeshAgent.Warp | Unity スクリプトリファレンス [公式]

参考:

変化する地形で、マップから落ちないように移動させる手っ取り早い方法 | テラシュールブログ

NavMesh × 段差 × Spawn = 面倒なことに | 徳島ゲーム開発ごっこ技術ブログ

NavMesh Agent 使用オブジェクトを任意の座標に直接移動する | Unity メモ

敵に目的地までの経路上でワープさせる | Unity の使い方

NavMeshAgent.Warp() not working – Unity Forum

NavMeshAgent.Warp meaning – Unity Discussions

NavMesh を描画する

ドキュメント:

NavMeshTriangulation | Unity スクリプトリファレンス [公式]

参考:

NavMesh を描画 – Qiita

NavMesh クラス

ドキュメント:

NavMesh | Unity スクリプトリファレンス [公式]

AllAreas

ドキュメント:

NavMesh.AllAreas | Unity スクリプトリファレンス [公式]

NavMeshData

ドキュメント:

NavMeshData | Unity スクリプトリファレンス [公式]

FindClosestEdge

ドキュメント:

NavMesh.FindClosestEdge | Unity スクリプトリファレンス [公式]

到達を判定する

次のいずれかで到達を判定する。

  • remainingDistance を判定する
  • コライダーを使う

ドキュメント:

AI.NavMeshAgent.remainingDistance | Unity スクリプトリファレンス [公式]

参考:

NavMesh を使った移動 | yttm-work

アニメーションと同期させる

ドキュメント:

アニメーションとナビゲーションの利用 | Unity マニュアル [公式]

NavMesh Agent を他のコンポーネントと共に使う | Unity マニュアル [公式]

参考:

NavMesh で取得した経路を ApplyRootMotion で移動させる手っ取り早い方法 | テラシュールブログ

ナビメッシュエージェントで足滑りのない移動を実装する | Yucchiy’s Note

NavMesh Agent の挙動を手動でアップデートする | e.blog

物理演算/剛体と併用する

ドキュメント:

NavMesh Agent を他のコンポーネントと共に使う | Unity マニュアル [公式]

参考:

NavMesh と Rigidbody を連携して動かす | テラシュールブログ

プレイヤーの操作に使う

参考:

NavMesh Third Person?? – Unity Forum

ポータル/入口/出口間を移動する

参考:

NavMesh で離れた空間にテレポートする | テラシュールブログ

経路を巡回させる (Waypoint)

ドキュメント:

エージェントに設定した地点を巡回させる | Unity マニュアル [公式]

参考:

巡回する敵 AI を Navigation で作る方法 | daichi

自動車の再現 (NavMesh + Waypoint) | Tramworks

Simple Waypoint System | Niklas Bergstrand

Pathfinding to waypoints using NavMesh – Stack Overflow

群衆を動かす

参考:

NavMesh Agents to avoid clumping / merging / jostling into one another – Unity Forum

Nav Mesh manager performance issue – Unity Forum

Limitations using navigation for large crowds (over hundreds of agents) – Unity Forum

Agent getting stuck in another Agent when walking in corners – What is the RIGHT solution? – Unity Forum

Playmaker で使う

参考:

AI を使って自動で移動する 3D モデルを作る | STYLY

静的なオブジェクトをシーンビューで確認する

参考:

How to find GameObject(s) with “Navigation Static” or “Batching Static” ? – Unity Forum

エージェントが経路探索に失敗する/動かない

参考:

NavMesh Agent not working anymore – Unity Answers

地面に埋まって動かない

  • baseOffset を調整する。

ドキュメント:

NavMeshAgent.baseOffset | Unity スクリプトリファレンス [公式]

参考:

NavMesh Agent is falling close to the floor / surface is there a way to keep the agent height ? – Unity Forum

想定した経路と異なる動きをする

参考:

NavMesh Agents are not moving along the mesh – Game Development Stack Exchange

壁が検出できない

参考:

Why does my navmesh not stop at this wall? – Unity Answers

Enemy AI keeps walking through walls – Unity Answers

Enemy AI walking through walls – Stack Overflow

ナビメッシュから外れないようにしたい

参考:

NavMesh Agent not working – Unity Forum

only be called on an active agent エラー

現象:

ナビメッシュ上に配置されたアクティブエージェントでのみ該当するメソッドの呼び出しができる旨のエラーが発生する。

"XXX" can only be called on an active agent that has been places on NavMesh.

原因:

  • エージェントがナビメッシュ上に配置されていない。
  • NavMesh Agent コンポーネントが正常に初期化されていない。

対処法:

  • エージェントを操作する前に pathStatus を確認する。

ドキュメント:

NavMeshAgent.pathStatus | Unity スクリプトリファレンス [公式]

NavMeshPathStatus | Unity スクリプトリファレンス [公式]

参考:

Unity で *** can only be called on an active agent that has been placed on a NavMesh. とか言われる時の対処法 – Qiita

NavMesh を用いて自動追尾する敵を作りたい – teratail

SetDestination can only be called on an active agent that is on a NavMesh – Unity Forum

イシュー

参考:

Memory Leak in NavmeshAgent.SetDestination method when multiple agents are in the same position | Unity Issue Tracker

Memory Leak in NavmeshAgent.SetDestination if multiple agents in the same position – Unity Forum

Unity Learn

From Waypoints to NavMesh | Unity Learn [Official]

リファレンス

NavMesh | Unity スクリプトリファレンス [公式]

Tips

NavMesh Agent を他のコンポーネントと共に使う | Unity マニュアル [公式]

チュートリアル

Basics (Brackeys)

Making it Dynamic (Brackeys)

Animated Character (Brackeys)

NavMesh Baking (Official)

How to Use NavMesh Pathfinding!

Basics (Table Flip Games)

Obstacles (Table Flip Games)

Waypoints on a NavMesh

NavMeshAgent Keyboard Movement

How Many AI Agents Can Unity Handle?

Destroying and Avoiding Obstructions with Nav Mesh Agents

Custom Nav Mesh

リポジトリ:

jadvrodrigues/CustomNavMesh: Alternative to Unity’s NavMesh System Where the Agents Avoid Each Other – GitHub

フォーラム:

CustomNavMesh – Unity’s NavMesh But the Agents Avoid the Other Non-Moving Agents | Unity Forum

NavMesh Walker

リポジトリ:

am1tanaka/NavMeshWalker: NavMesh Agent の歩き方を Character Controller で制御する – GitHub

ドキュメント:

NavMesh Walker – NavMesh Agent の歩き方を Character Controller で制御する

デモ:

Demo | NavMesh Walker

参考:

NavMesh Agent でよい感じにキャラクターを歩かせる | tanaka’s Programming Memo

記事をシェアする:
タグ:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Protected by reCAPTCHA