Godot中多个Black Hole仅单个生效的问题求助
问题描述
我的“Black Hole”区域对象在Player进入(body_entered)时会收缩,离开(body_exited)时停止,但仅第一个Black Hole正常工作——即使穿过其他黑洞,也只有第一个在收缩。

穿过所有Black Hole时,只有第一个(编号1)在收缩
图片说明:
- 红圈 - 玩家(Player)
- 1 - Black_Hole
- 2 - Black_Hole2
- 3 - Black_Hole3


期望效果
每个“Black Hole”作为独立对象,能够正确播放收缩动画,彼此互不影响。
原Black_Hole脚本
extends Spatial var animation_finished var scale_down_black_hole var animation_played onready var namex = get_name() onready var group_holes = get_node("Group_Holes") var group_black_holes = group_holes.get_child() func _ready(): animation_finished = false scale_down_black_hole = false animation_played = false # print(get_name()) print(group_black_holes) $AnimationPlayer.stop(true) # $AnimationPlayer.stop("Animation_Black_Hole") #暂停动画的代码 # $AnimationPlayer.play("Animation_Black_Hole") #恢复动画的代码 pass func _process(delta): if scale_down_black_hole: $AnimationPlayer.play("Animation_Black_Hole") animation_played = true elif !scale_down_black_hole: $AnimationPlayer.stop(false) if animation_finished: queue_free() # print($Mesh_Black_Hole.scale) # print(animation_finished) pass func _on_AnimationPlayer_animation_finished(Animation_Black_Hole): animation_finished = true print("End_Animation_Black_hole") pass # Replace with function body. func _on_OmniLight_signal_black_hole(black_hole): if black_hole: scale_down_black_hole = true print("scale_down_black_hole_True) if !black_hole: scale_down_black_hole = false print("scale_down_black_hole_False") # if !black_hole: # scale_down_black_hole = false pass # Replace with function body.
(当前正在尝试
var group_holes相关代码,未在截图中体现)
问题分析与修复方案
核心问题
- 信号绑定错误:依赖外部
OmniLight的信号触发,未传递当前黑洞实例信息,导致所有黑洞响应同一个信号,出现触发混乱。 - 无效代码干扰:
group_holes相关代码逻辑错误(get_child()未传索引,仅获取第一个子节点),无实际作用却可能引发异常。 - 动画逻辑冗余:
_process中重复调用play,会导致动画反复重启,且语法存在引号未闭合的错误。
修复步骤
- 移除无效代码:删除
group_holes、group_black_holes相关定义及打印代码。 - 使用自身区域信号:每个黑洞监听自身Area节点的
body_entered/body_exited信号,确保独立响应自身的触发事件。 - 简化动画逻辑:仅在玩家进入/离开时启动/暂停动画,避免
_process内重复调用。 - 修复语法错误:补全打印语句的闭合引号。
修正后的脚本
extends Spatial var animation_finished = false var scale_down_black_hole = false func _ready(): $AnimationPlayer.stop(true) # 绑定自身Area节点的触发信号(请根据实际场景调整Area节点名称) $Area.connect("body_entered", self, "_on_body_entered") $Area.connect("body_exited", self, "_on_body_exited") func _process(delta): if animation_finished: queue_free() func _on_AnimationPlayer_animation_finished(animation_name): if animation_name == "Animation_Black_Hole": animation_finished = true print("黑洞动画结束: ", get_name()) func _on_body_entered(body): # 仅响应Player的进入事件 if body.name == "Player": scale_down_black_hole = true $AnimationPlayer.play("Animation_Black_Hole") print(get_name(), " 开始收缩") func _on_body_exited(body): if body.name == "Player": scale_down_black_hole = false $AnimationPlayer.stop(false) print(get_name(), " 停止收缩")
额外注意事项
- 确保每个Black Hole场景内的Area节点(Area2D/Area3D,根据游戏维度选择)的
monitorable和monitoring属性均设为true。 - 检查Player节点的碰撞体设置,确保其碰撞层与黑洞Area的检测掩码匹配,能被正确检测到。
- 移除原脚本中绑定的
_on_OmniLight_signal_black_hole信号,避免冲突。
内容的提问来源于stack exchange,提问作者Mardeusz.pl
相关产品推荐
相关产品推荐

