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

Godot中如何用for循环判断所有RayCast2D是否均发生碰撞?

问题分析与解决方案

你的代码问题在于每次循环都会直接覆盖touchingFloor的值,最终结果只由最后一个RayCast2D的碰撞状态决定,无法正确判断所有射线的整体碰撞情况。

方案1:严格实现「全部碰撞则true,全部未碰撞则false」

如果需要严格按你的需求执行——只有所有射线都碰撞时设为true,所有射线都未碰撞时设为false,可以通过两个标志位来跟踪整体状态:

var all_collided = true
var all_not_collided = true

for ray in floorChecker.get_children():
    ray.force_raycast_update()
    if not ray.is_colliding():
        all_collided = false
    else:
        all_not_collided = false

# 根据标志位设置最终状态
if all_collided:
    touchingFloor = true
elif all_not_collided:
    touchingFloor = false
# 可选:部分碰撞时的处理,比如保持之前的状态
# else:
#     touchingFloor = touchingFloor

方案2:常见触地逻辑(只要有一个碰撞即视为触地)

如果你的实际需求是只要有任意一条射线碰撞就判定为触地(这是2D平台角色的常规触地检测逻辑),可以简化代码:

touchingFloor = false  # 默认未触地
for ray in floorChecker.get_children():
    ray.force_raycast_update()
    if ray.is_colliding():
        touchingFloor = true
        break  # 找到碰撞后直接退出循环,提升性能

内容的提问来源于stack exchange,提问作者Denis Galla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:45:08