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

如何在for循环中获取特定Raycast命中?实现射线优先级检测

解决射线检测优先级问题

我来帮你搞定这个射线检测的优先级需求!你的核心问题在于当前循环是按从左到右的顺序处理射线,还同时处理了多条射线的命中逻辑,导致多条射线命中时会重复更新currentPlatform。要实现「优先检测Raycast#4,未命中则依次往前,命中即停止」的效果,只需要调整遍历顺序并在命中后立即终止循环即可。

修改后的代码

// 逆序遍历射线:从最后一条(Raycast#4)开始,依次检测#3、#2、#1
for (int i = VerticalRayCount - 1; i >= 0; i--) { 
    Vector2 rayOrigin = (directionY == -1) ? RaycastOrigin.bottomLeft : RaycastOrigin.topLeft; 
    rayOrigin += Vector2.right * (VerticalRaySpacing * i + deltaMovement.x); 
    RaycastHit2D hit = Physics2D.Raycast(rayOrigin, Vector2.up * directionY, rayLength, collisionMask); 
    Debug.DrawRay(rayOrigin, Vector2.up * directionY * rayLength, Color.red); 

    // 仅处理向下移动且向右移动的场景(和你原逻辑一致)
    if (directionY == -1 && directionX == 1) { 
        if (hit) { 
            // 只有命中新平台时才更新
            if (currentPlatform != hit.collider.gameObject) { 
                var platform = hit.collider.gameObject.GetComponent<IPlatform>(); 
                currentPlatform = hit.collider.gameObject; 
            }
            // 命中后立即跳出循环,不再检测后续优先级更低的射线
            break; 
        }
    }
}

关键逻辑说明

  • 逆序遍历:通过i = VerticalRayCount - 1; i >= 0; i--,我们先检测最右侧的射线(也就是你说的Raycast#4),优先级最高;如果未命中,再依次往左检测#3、#2、#1。
  • 命中即终止:一旦检测到有效命中,执行break跳出循环,确保后续射线不会被检测,完全符合你「一旦命中就获取对应信息」的需求。
  • 简化判断:去掉了原代码中针对i == 0和i == VerticalRayCount-1的单独判断,因为遍历顺序已经保证了优先级,代码更简洁易维护。

如果你的需求是「只要命中任何射线(哪怕是同一平台)就停止检测」,可以把break移到if (hit)的外层,确保命中后立刻终止:

if (hit) { 
    if (currentPlatform != hit.collider.gameObject) { 
        var platform = hit.collider.gameObject.GetComponent<IPlatform>(); 
        currentPlatform = hit.collider.gameObject; 
    }
    // 命中就停止,不管是不是新平台
    break; 
}

这个方案完美解决了多条射线命中时的冲突问题,同时完全满足你的优先级检测需求。

内容的提问来源于stack exchange,提问作者Ginger and Lavender

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:43:41