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

Unity 2D 可避障追击AI故障求助:绕障时卡滞甚至反向

问题分析与修复方案

核心问题

你的代码存在几个关键逻辑漏洞,直接导致避障失效、卡顿甚至反向移动:

  • 检测到障碍后修改了dir变量,但最终设置速度时完全没用到这个避障方向,还是直接用追击玩家的原始方向_dir,等于避障逻辑白写了。
  • 射线起点用了3D向量(带z轴0.5f),但2D物理系统不需要z轴,会导致射线位置偏移,检测不准。
  • 仅取其中一条射线的法线作为避障方向,未处理两条射线同时命中的情况,逻辑片面。
  • 避障时直接切换到垂直方向,没有和追击方向做平滑混合,导致移动突变、卡顿。

修复步骤

  1. 合并追击与避障方向:检测到障碍时,将避障方向和原始追击方向做加权混合,既避开障碍又保持追击趋势。
  2. 修正射线起点:改用Vector2定义射线起点,贴合2D物理系统。
  3. 处理多射线命中逻辑:优先取距离更近的射线法线,或对两条法线做平均,避免单一射线的误判。
  4. 确保避障方向朝向玩家一侧:判断垂直方向的朝向,避免往远离玩家的方向避让。
  5. 添加方向平滑过渡:让追击和避障方向的切换更平缓,消除卡顿。

修复后的完整代码

//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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 23:12:26