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

Unity 3D中Raycast无法检测全部障碍物及AI避障咨询

对手AI障碍物检测问题排查&避障实现方案

嘿,我来帮你捋捋这个问题的原因,再给你说说怎么实现避障移动~

一、Raycast仅识别特定立方体的原因

结合你提供的截图信息,大概率是这几个点出了问题:

  • 碰撞体缺失:那些没被检测到的障碍物(比如obstacle2的cube01)很可能没添加Collider组件。Raycast完全依赖物理碰撞体来识别障碍物,没有的话物理引擎根本不会把它当成可检测对象。
  • 层级过滤遗漏:你的Raycast代码没指定检测层级,默认是检测所有层级,但如果其他障碍物被放在了Raycast忽略的层级里,就会直接被跳过。看看层级面板,确认下未被检测的障碍物是不是在某个没被包含的层级中。
  • 触发器设置冲突:如果障碍物的碰撞体勾选了isTrigger,Raycast默认会忽略这类触发器碰撞体。除非你在Raycast参数里明确加上QueryTriggerInteraction.Collide,否则不会检测到它们。

修正后的Raycast代码示例

你可以试试修改代码,加上层级过滤或者触发器检测:

void FixedUpdate() 
{
    transform.Translate(Vector3.forward * Time.deltaTime * speed);
    
    // 可选:只检测名为"Obstacle"的层级,避免误检测其他对象
    int obstacleLayer = LayerMask.GetMask("Obstacle");
    
    // 检测前方,包含触发器,指定检测层级
    if (Physics.Raycast(transform.position, transform.forward, 100.0f, obstacleLayer, QueryTriggerInteraction.Collide))
        print("There is something in front of the object!");
}

二、检测到障碍物后的左右避障实现

要让AI避开障碍,可以按照这个思路来做:先检测前方有障碍,再检查左右两侧的空间,最后选择可行的方向移动。

避障代码示例

public float speed = 5f;
public float forwardCheckDistance = 3f; // 前方障碍物检测距离
public float sideCheckDistance = 2f; // 左右空间检测距离

void FixedUpdate() 
{
    // 基础向前移动
    transform.Translate(Vector3.forward * Time.deltaTime * speed);

    RaycastHit hit;
    // 检测前方是否有障碍物
    if (Physics.Raycast(transform.position, transform.forward, out hit, forwardCheckDistance))
    {
        print("前方有障碍,准备避让!");
        
        // 检查左侧是否有可用空间
        bool leftIsClear = !Physics.Raycast(transform.position, transform.left, sideCheckDistance);
        // 检查右侧是否有可用空间
        bool rightIsClear = !Physics.Raycast(transform.position, transform.right, sideCheckDistance);

        // 根据检测结果选择移动方向
        if (leftIsClear)
        {
            // 向左平移避让(也可以用Rotate实现转向,看你想要的控制效果)
            transform.Translate(Vector3.left * Time.deltaTime * speed);
        }
        else if (rightIsClear)
        {
            transform.Translate(Vector3.right * Time.deltaTime * speed);
        }
        else
        {
            // 左右都被挡住了,这里示例减速,你也可以改成掉头等逻辑
            speed = 2f;
        }
    }
    else
    {
        // 没有障碍,恢复正常速度
        speed = 5f;
    }
}

额外优化建议

  • 调整forwardCheckDistance和sideCheckDistance的数值,适配你的游戏场景大小。
  • 如果障碍物是不规则模型,建议用BoxCast或SphereCast代替Raycast,因为Raycast是一条线,容易漏掉一些体积大但射线没命中的障碍。
  • 给所有障碍物统一设置一个Obstacle层级,这样Raycast只检测这个层级,能避免误检测到玩家或其他无关对象。

内容的提问来源于stack exchange,提问作者Maria Kodel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:11:17