Godot技术问题:实例化场景丢失分组信息导致计分异常
问题分析与解决方案
最可能的核心问题是:碰撞检测到的body是Circle场景里的RigidBody子节点,而非Circle根节点。你在set_color里是给Circle根节点调用add_to_group,但RigidBody作为子节点并没有加入对应分组,所以碰撞触发时,用RigidBody去检测分组自然会失败。
解决方案1:给RigidBody添加分组
修改Circle的set_color函数,把分组加到碰撞的主体RigidBody上:
extends Obj func set_color(color): match color: COLORS_CONST.COLORS_DICT.red.name: $RigidBody/Shape.color = COLORS_CONST.COLORS_DICT.red.value $RigidBody.add_to_group(COLORS_CONST.COLOR_GROUPS.hot) COLORS_CONST.COLORS_DICT.green.name: $RigidBody/Shape.color = COLORS_CONST.COLORS_DICT.green.value $RigidBody.add_to_group(COLORS_CONST.COLOR_GROUPS.cold)
解决方案2:碰撞时获取Circle根节点判断分组
如果不想调整分组添加位置,就在ScoreCount的检测函数里,获取body的父节点(Circle根节点)来判断分组:
signal left_count signal right_count func on_ScoreCount_body_entered(body): # 若RigidBody是Circle的直接子节点,用get_parent()获取根节点 var circle = body.get_parent() print(circle.is_in_group(COLORS_CONST.COLOR_GROUPS.hot)) if circle.is_in_group(COLORS_CONST.COLOR_GROUPS.hot): emit_signal('left_count')
注意:这里把信号名修正为Godot标准的body_entered,你之前写的bodyEnter是拼写错误,会导致信号无法正确触发,记得同步检查信号连接的正确性。
额外检查点
- 确认
COLORS_CONST.COLOR_GROUPS.hot在两个脚本中引用的是同一个常量值,避免因常量定义不一致导致分组判断失败。 - 检查Circle实例是否在
add_child后完成节点树初始化(不过Main里能打印正确结果,这个可能性较低)。
内容的提问来源于stack exchange,提问作者quang huy nguyen
相关产品推荐
相关产品推荐

