【Unity 6】NavMesh エージェントに柵を飛び越えさせる
Unity の NavMeshAgent は「ベイクされた地形の上を歩くキャラ」を作るための機能です。
しかし実際のゲーム制作では、次のようなシーンがよく出てきます。
- フィールドに柵がある
- NavMesh が途中で途切れている
- でも敵にはその柵を飛び越えて追いかけてきてほしい
このチュートリアルでは NavMeshLink を使い、「柵のどの位置からでも飛び越えられる追跡AI」を Unity 6 環境で実装する方法を解説します。
Unity 初学者(訓練校での受講生)でも確実に再現できるよう、ステップごとに図とコードで丁寧に説明します。
完成イメージ)
長い柵があるシーンでも…
┌────────────── 柵(Fence) ──────────────┐
手前NavMesh 反対側NavMesh
敵キャラは次のように動きます。
- プレイヤーの位置へ移動(追跡)
- 柵の手前まで来る
- NavMeshLink を検出
- 柵を飛び越える
- 着地後、追跡を継続
2. オブジェクト構成(完成形)
チュートリアルの最終形は次のようになります。
[Ground] …… NavMesh の地面
[Fence] …… 障害物となる横長の柵
[Player] …… 追跡対象
[Enemy] …… NavMeshAgent(AI)
[FenceJumpLink] …… 柵を越えるための NavMeshLink
[NavMesh Surface] …… NavMesh ベイクのために配置
Unity 6 では NavMesh Surface を使ってベイクします。
(旧 Navigation ウィンドウの代わりです)
3. シーン準備
基本となるオブジェクトを作ります。
[Ground] …… Plane
[Fence] …… Cube(横長)
[Player] …… Transform のみでも可
[Enemy] …… Capsule など、キャラの形
参考)各ゲームオブジェクトの構成
[Ground]、[Player]は略
[Fence] …… Cube(横長)

[Enemy] …… Capsule など、キャラの形

4. NavMesh をベイクする(Unity 6)
Unity 6 の Navigation は「NavMesh Surface コンポーネント」を用います。
- Hierarchy で右クリック → AI → NavMesh Surface を選択

- NavMesh Surface の Bake ボタンを押す

- 柵の前後で NavMesh が分断されていれば OK です。
NavMesh Surface

5. 柵全体を飛び越えるための NavMeshLink
通常、OffMeshLink は “点から点” の移動ですが、今回は 柵の長さ全体で飛び越えられるようにしたいため、
- NavMeshLink の Width を柵の長さと同じにする
のがポイントです。
5-1. NavMeshLinkを作成
- Hierarchy を右クリック
- AI → NavMesh Link を選択
- 名前を FenceJumpLink に変更
- 柵(Fence)の中央に配置

図解:
┌──────────────────── 柵 ────────────────────┐
[FenceJumpLink] ← 柵中央に配置
5-2. NavMeshLink の設定
Inspector → NavMeshLink を次のように設定します。
| 項目 | 設定例 |
|---|---|
| Start Point | (0, 0, -1.5) |
| End Point | (0, 0, +1.5) |
| Width | 柵の長さ(例:10.0) |
| Bidirectional | ON |
図解:
Jump Link(幅10m)
┌────────────────────────────────────────┐
↓ Start(手前) End(奥) ↓
●────────────────────────────────────────●
柵をまたぐ “幅広リンク” → どこからでも飛び越え可能
NavMesh Link (FenceJumpLinkという名前に変更)


6. プレイヤーを追跡する AI を実装
Enemy(敵)には以下を付けます。
- NavMeshAgent
- CapsuleCollider
- Rigidbody(任意)
このあと紹介するスクリプトでプレイヤーの位置を常に追跡する AI を作ります。
7. 「柵ジャンプ」演出を行うコード(完成版)
以下を Enemy にアタッチします。
using UnityEngine;
using UnityEngine.AI;
[RequireComponent(typeof(NavMeshAgent))]
public class AgentJumpOverGap : MonoBehaviour
{
NavMeshAgent agent;
bool isJumping = false;
[Header("追いかける対象")]
[SerializeField] Transform target;
[Header("ジャンプ設定")]
[SerializeField] float jumpHeight = 2f;
[SerializeField] float jumpDuration = 0.5f;
void Awake()
{
agent = GetComponent<NavMeshAgent>();
agent.autoTraverseOffMeshLink = false; // 自動ジャンプを切る
}
void Update()
{
// プレイヤー追跡
if (!isJumping && target != null)
{
agent.SetDestination(target.position);
}
// 柵リンクに到達したらジャンプ開始
if (!isJumping && agent.isOnOffMeshLink)
{
StartCoroutine(JumpAcross());
}
}
System.Collections.IEnumerator JumpAcross()
{
isJumping = true;
OffMeshLinkData data = agent.currentOffMeshLinkData;
Vector3 startPos = agent.transform.position;
Vector3 endPos = data.endPos;
float t = 0f;
agent.isStopped = true;
while (t < 1f)
{
t += Time.deltaTime / jumpDuration;
Vector3 pos = Vector3.Lerp(startPos, endPos, t);
pos.y += jumpHeight * 4f * (t - t * t); // 放物線
agent.transform.position = pos;
yield return null;
}
agent.CompleteOffMeshLink();
agent.isStopped = false;
isJumping = false;
}
}
8. Inspector 設定
Enemy の inspector で
- Target に Player(Transform)を指定する
これで追跡 AI とジャンプ AI が動作します。
9. よくある間違いと対処法
■ Start/End が NavMesh に乗っていない
→ ジャンプが発動しない
→ 少しだけ地形の上にオフセットして調整
■ Width を設定し忘れる
→ “1点だけ” のジャンプになり、柵全体に対応できない
■ NavMeshAgent.autoTraverseOffMeshLink が ON
→ カスタムジャンプが動作しない
→ 必ず OFF にする
10. 応用編:四角い柵を囲む場合四角い柵(上から見た □ )を飛び越えさせたい場合は、4辺それぞれに幅広 NavMeshLink を配置します。
図解:
┌───────────── 上の柵 ─────────────┐
│ │
左の柵│ │右の柵
│ │
└───────────── 下の柵 ─────────────┘
手順:
- 上辺の中央に FenceLinkTop を配置 → 幅 = 上辺の長さ
- 下辺に FenceLinkBottom
- 左辺に FenceLinkLeft
- 右辺に FenceLinkRight
- Bidirectional を ON
- 柵の内側にも NavMesh をベイク(出入りできるように)
これで、敵は柵のどの位置からでも「外 → 内」「内 → 外」へ飛び越えて移動できます。
11. まとめ
このチュートリアルでは、Unity 6 を使って
- 柵の長さ全体をジャンプ可能にする NavMeshLink の作成
- プレイヤー追跡 AI(SetDestination)
- 放物線ジャンプ演出での OffMeshLink 通過
- 四角い柵への応用方法
を解説しました。
NavMesh は単に「歩く AI」ではなく、NavMeshLink と組み合わせることで “飛び越えるAI” を作ることができます。




ディスカッション
コメント一覧
まだ、コメントがありません