You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中NavMeshAgent敌人AI沿Y轴漂浮而非地面追踪玩家

问题:Unity NavMeshAgent敌人AI沿Y轴漂浮,无法在地面追踪玩家

我正在开发Unity 3D项目,尝试用NavMeshAgent + NavMeshSurface实现追踪玩家的敌人AI,但敌人角色始终沿Y轴在空中漂浮,无法在地面正常追踪玩家。

提供的EnemyAI脚本

using UnityEngine;
using UnityEngine.AI;

public class EnemyAI : MonoBehaviour
{
    public Transform player; // 玩家位置引用
    private NavMeshAgent agent; // NavMeshAgent组件引用

    void Start()
    {
        agent = GetComponent<NavMeshAgent>(); // 获取NavMeshAgent组件
    }

    void Update()
    {
        agent.SetDestination(player.position); // 将目标设置为玩家位置
    }
}

已完成的设置

  • NavMesh设置:
    • 已在地面正确烘焙NavMesh
    • 敌人对象已附加NavMeshAgent和NavMeshSurface组件
  • 玩家赋值:已在Inspector面板中正确绑定玩家的Transform组件
  • Agent设置:已检查Agent的高度和半径参数,确保适配地面高度

排查与解决方法

  1. 移除敌人身上的NavMeshSurface组件
    NavMeshSurface是用于烘焙导航网格的专用组件,仅需在地面等可行走区域挂载。敌人身上只需保留NavMeshAgent组件,同时挂载两者会导致导航逻辑冲突,是引发漂浮问题的常见原因。

  2. 校准NavMeshAgent核心参数

    • 确认**Base Offset(基础偏移)**值为0,非零值会强制Agent偏离地面高度
    • 核对**Height(高度)和Radius(半径)**与敌人模型实际尺寸匹配,避免Agent碰撞体悬浮于地面之上
    • 确保**NavMesh Layer(导航网格层)**与地面烘焙的NavMesh层完全一致
  3. 修正目标位置的Y轴坐标
    若玩家Transform原点不在地面,可通过NavMesh采样获取地面有效目标点,避免Agent跟随玩家的空中位置:

    void Update()
    {
        if (player == null) return;
        NavMeshHit hit;
        // 采样玩家周围2米范围内的地面有效点
        if (NavMesh.SamplePosition(player.position, out hit, 2f, NavMesh.AllAreas))
        {
            agent.SetDestination(hit.position);
        }
        else
        {
            agent.SetDestination(player.position);
        }
    }
    
  4. 检查敌人模型的Transform原点
    确保敌人模型的Transform原点位于模型底部(与地面接触的位置),若原点在模型中心或顶部,会导致NavMeshAgent的位置计算出现偏差。

  5. 重新烘焙NavMesh
    移除敌人身上的NavMeshSurface后,重新执行导航网格烘焙,确保烘焙范围覆盖所有可行走区域,且烘焙参数中的Agent Radius和Agent Height与敌人NavMeshAgent的设置一致。


内容的提问来源于stack exchange,提问作者Khalifa Alkhatri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 05:33:16