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的高度和半径参数,确保适配地面高度
排查与解决方法
移除敌人身上的NavMeshSurface组件
NavMeshSurface是用于烘焙导航网格的专用组件,仅需在地面等可行走区域挂载。敌人身上只需保留NavMeshAgent组件,同时挂载两者会导致导航逻辑冲突,是引发漂浮问题的常见原因。校准NavMeshAgent核心参数
- 确认**Base Offset(基础偏移)**值为0,非零值会强制Agent偏离地面高度
- 核对**Height(高度)和Radius(半径)**与敌人模型实际尺寸匹配,避免Agent碰撞体悬浮于地面之上
- 确保**NavMesh Layer(导航网格层)**与地面烘焙的NavMesh层完全一致
修正目标位置的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); } }检查敌人模型的Transform原点
确保敌人模型的Transform原点位于模型底部(与地面接触的位置),若原点在模型中心或顶部,会导致NavMeshAgent的位置计算出现偏差。重新烘焙NavMesh
移除敌人身上的NavMeshSurface后,重新执行导航网格烘焙,确保烘焙范围覆盖所有可行走区域,且烘焙参数中的Agent Radius和Agent Height与敌人NavMeshAgent的设置一致。
内容的提问来源于stack exchange,提问作者Khalifa Alkhatri
相关产品推荐
相关产品推荐

