次の項目は別ページに分割しました。
関連ページ:
ナビメッシュ
敵キャラクターや NPC が移動可能な領域を、内部的にメッシュとして保持するデータオブジェクト。シーン内のジオメトリを歩行可能サーフェスや障害物として設定し、ベイクすることで作成する。
公式サイト:
概要
ドキュメント:
ナビゲーションシステム | Unity マニュアル [公式]
ナビゲーションシステムの内部的なしくみ | Unity マニュアル [公式]
使い方
手順
- ベイク対象のオブジェクト (床や壁など) を
Navigation Static
に設定する。 - メニューから「Window > AI > Navigation」を選択して、「Navigation」ウィンドウを開く。
- 「Bake」タブで「Bake」ボタンをクリックしてベイクを実行する。
- シーンファイル (.unity ファイル) のあるディレクトリにシーンの名前でディレクトリが作成され、ナビメッシュファイル (
NavMesh.asset
) が生成される。
参考:
敵キャラを Unity のナビゲーション機能を使って移動させる | かめくめ
敵キャラを NavMesh でかしこくかっこよく動かしてみよう | k1t
近づいたら追いかけてくる巡回ユニティちゃん | イシゲーの Unity 保管庫
導入
参考:
ナビゲーションシステムを使用して目的地まで移動しよう! | XR-Hub
サクッと NavMesh を実装する手順 | TECH Projin
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 スクリプトリファレンス [公式]
参考:
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 クラス
ドキュメント:
NavMesh | Unity スクリプトリファレンス [公式]
AllAreas
ドキュメント:
NavMesh.AllAreas | Unity スクリプトリファレンス [公式]
NavMeshData
ドキュメント:
NavMeshData | Unity スクリプトリファレンス [公式]
FindClosestEdge
ドキュメント:
NavMesh.FindClosestEdge | Unity スクリプトリファレンス [公式]
到達を判定する
次のいずれかで到達を判定する。
remainingDistance
を判定する- コライダーを使う
ドキュメント:
AI.NavMeshAgent.remainingDistance | Unity スクリプトリファレンス [公式]
参考:
アニメーションと同期させる
ドキュメント:
アニメーションとナビゲーションの利用 | 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
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 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 スクリプトリファレンス [公式]
参考:
NavMesh を用いて自動追尾する敵を作りたい – teratail
SetDestination can only be called on an active agent that is on a NavMesh – Unity Forum
イシュー
参考:
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 マニュアル [公式]
チュートリアル
How to Use NavMesh Pathfinding!
NavMeshAgent Keyboard Movement
How Many AI Agents Can Unity Handle?
Destroying and Avoiding Obstructions with Nav Mesh Agents
Custom Nav Mesh
リポジトリ:
フォーラム:
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 で制御する
デモ:
参考: