Unity 2D 可避障追击AI故障求助:绕障时卡滞甚至反向
问题分析与修复方案
核心问题
你的代码存在几个关键逻辑漏洞,直接导致避障失效、卡顿甚至反向移动:
- 检测到障碍后修改了
dir变量,但最终设置速度时完全没用到这个避障方向,还是直接用追击玩家的原始方向_dir,等于避障逻辑白写了。 - 射线起点用了3D向量(带z轴0.5f),但2D物理系统不需要z轴,会导致射线位置偏移,检测不准。
- 仅取其中一条射线的法线作为避障方向,未处理两条射线同时命中的情况,逻辑片面。
- 避障时直接切换到垂直方向,没有和追击方向做平滑混合,导致移动突变、卡顿。
修复步骤
- 合并追击与避障方向:检测到障碍时,将避障方向和原始追击方向做加权混合,既避开障碍又保持追击趋势。
- 修正射线起点:改用
Vector2定义射线起点,贴合2D物理系统。 - 处理多射线命中逻辑:优先取距离更近的射线法线,或对两条法线做平均,避免单一射线的误判。
- 确保避障方向朝向玩家一侧:判断垂直方向的朝向,避免往远离玩家的方向避让。
- 添加方向平滑过渡:让追击和避障方向的切换更平缓,消除卡顿。
修复后的完整代码
//private int range = 3; //private float speed = 1.0f; //private float avoidanceWeight = 2f; // 避障权重,值越大越优先避障 //LayerMask obstacles = LayerMask.GetMask("Obstacles"); public void MoveToTarget(Transform _target) { Vector2 currentPos = transform.position; Vector2 targetPos = _target.position; // 原始追击方向 Vector2 chaseDir = (targetPos - currentPos).normalized; // 初始化最终移动方向为追击方向 Vector2 finalDir = chaseDir; // 修正射线起点:在敌人左右两侧发射射线(根据敌人尺寸调整偏移量) Vector2 rayOffset = new Vector2(0.5f, 0.5f); RaycastHit2D hitLeft = Physics2D.Raycast(currentPos - rayOffset, chaseDir, range, obstacles); RaycastHit2D hitRight = Physics2D.Raycast(currentPos + rayOffset, chaseDir, range, obstacles); // 检测到障碍物时计算避障方向 if (hitLeft.collider != null || hitRight.collider != null) { Vector2 avoidDir = Vector2.zero; // 处理两条射线同时命中的情况,取法线平均方向 if (hitLeft.collider != null && hitRight.collider != null) { avoidDir = (hitLeft.normal + hitRight.normal).normalized; } else { // 取命中的那条射线的法线 avoidDir = hitLeft.collider != null ? hitLeft.normal : hitRight.normal; } // 从垂直于障碍物的两个方向中,选更靠近追击方向的那个(避免反向) Vector2 perp1 = Vector2.Perpendicular(avoidDir); Vector2 perp2 = -Vector2.Perpendicular(avoidDir); avoidDir = Vector2.Dot(perp1, chaseDir) > Vector2.Dot(perp2, chaseDir) ? perp1 : perp2; // 混合追击方向和避障方向,加权控制优先级 finalDir = (chaseDir + avoidDir * avoidanceWeight).normalized; } // 应用最终速度 rb.velocity = finalDir * speed; }
额外优化建议
- 调整
avoidanceWeight参数:如果敌人还是卡障碍,增大该值;如果避障时偏离玩家太远,减小该值。 - 添加调试射线:用
Debug.DrawLine在编辑器中绘制射线,直观查看检测范围和命中情况。 - 动态调整射线长度:根据敌人移动速度调整
range,速度越快射线越长,提前预判障碍。
内容的提问来源于stack exchange,提问作者help me
相关产品推荐
相关产品推荐

