【Unity 6】NavMesh エージェントに柵を飛び越えさせる

Unity の NavMeshAgent は「ベイクされた地形の上を歩くキャラ」を作るための機能です。

しかし実際のゲーム制作では、次のようなシーンがよく出てきます。

  • フィールドに柵がある
  • NavMesh が途中で途切れている
  • でも敵にはその柵を飛び越えて追いかけてきてほしい

このチュートリアルでは NavMeshLink を使い、「柵のどの位置からでも飛び越えられる追跡AI」を Unity 6 環境で実装する方法を解説します。

Unity 初学者(訓練校での受講生)でも確実に再現できるよう、ステップごとに図とコードで丁寧に説明します。


完成イメージ)

長い柵があるシーンでも…

   ┌────────────── 柵(Fence) ──────────────┐
手前NavMesh                                      反対側NavMesh

敵キャラは次のように動きます。

  1. プレイヤーの位置へ移動(追跡)
  2. 柵の手前まで来る
  3. NavMeshLink を検出
  4. 柵を飛び越える
  5. 着地後、追跡を継続

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 コンポーネント」を用います。

  1. Hierarchy で右クリック → AI → NavMesh Surface を選択
  1. NavMesh Surface の Bake ボタンを押す
  1. 柵の前後で NavMesh が分断されていれば OK です。

NavMesh Surface


5. 柵全体を飛び越えるための NavMeshLink

通常、OffMeshLink は “点から点” の移動ですが、今回は 柵の長さ全体で飛び越えられるようにしたいため、

  • NavMeshLink の Width を柵の長さと同じにする

のがポイントです。


5-1. NavMeshLinkを作成

  1. Hierarchy を右クリック
  2. AI → NavMesh Link を選択
  3. 名前を FenceJumpLink に変更
  4. 柵(Fence)の中央に配置

図解:

   ┌──────────────────── 柵 ────────────────────┐

         [FenceJumpLink] ← 柵中央に配置

5-2. NavMeshLink の設定

Inspector → NavMeshLink を次のように設定します。

項目設定例
Start Point(0, 0, -1.5)
End Point(0, 0, +1.5)
Width柵の長さ(例:10.0)
BidirectionalON

図解:

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 を配置します。

図解:

      ┌───────────── 上の柵 ─────────────┐
      │                                 │
左の柵│                                 │右の柵
      │                                 │
      └───────────── 下の柵 ─────────────┘

手順:

  1. 上辺の中央に FenceLinkTop を配置 → 幅 = 上辺の長さ
  2. 下辺に FenceLinkBottom
  3. 左辺に FenceLinkLeft
  4. 右辺に FenceLinkRight
  5. Bidirectional を ON
  6. 柵の内側にも NavMesh をベイク(出入りできるように)

これで、敵は柵のどの位置からでも「外 → 内」「内 → 外」へ飛び越えて移動できます。

11. まとめ

このチュートリアルでは、Unity 6 を使って

  • 柵の長さ全体をジャンプ可能にする NavMeshLink の作成
  • プレイヤー追跡 AI(SetDestination)
  • 放物線ジャンプ演出での OffMeshLink 通過
  • 四角い柵への応用方法

を解説しました。

NavMesh は単に「歩く AI」ではなく、NavMeshLink と組み合わせることで “飛び越えるAI” を作ることができます。

訪問数 26 回, 今日の訪問数 1回

NavMesh,Unity

Posted by hidepon