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

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”作为独立对象,能够正确播放收缩动画,彼此互不影响。

原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相关代码,未在截图中体现)


问题分析与修复方案

核心问题

  1. 信号绑定错误:依赖外部OmniLight的信号触发,未传递当前黑洞实例信息,导致所有黑洞响应同一个信号,出现触发混乱。
  2. 无效代码干扰:group_holes相关代码逻辑错误(get_child()未传索引,仅获取第一个子节点),无实际作用却可能引发异常。
  3. 动画逻辑冗余:_process中重复调用play,会导致动画反复重启,且语法存在引号未闭合的错误。

修复步骤

  1. 移除无效代码:删除group_holes、group_black_holes相关定义及打印代码。
  2. 使用自身区域信号:每个黑洞监听自身Area节点的body_entered/body_exited信号,确保独立响应自身的触发事件。
  3. 简化动画逻辑:仅在玩家进入/离开时启动/暂停动画,避免_process内重复调用。
  4. 修复语法错误:补全打印语句的闭合引号。

修正后的脚本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:05:42