Godot 发出另一个场景中定义的信号

Godot emit signal defined in another scene

我在附加到节点的脚本中有一个信号:

游戏.tscn/Game.cs

using Godot;

public class Game : Node2D
{
    [Signal]
    public delegate void AddPowerUp(Powerup powerup);
}

我尝试从另一个发出信号 class:

ExtraBall.tscn/Powerup.cs

public override void _IntegrateForces(Physics2DDirectBodyState state)
{
    EmitSignal("AddPowerUp", this);
}

然后在另一个场景中,Level.tscn,我实例化了Game和ExtraBall。但是,当我尝试发出信号时出现错误。

E 0:00:05.828   emit_signal: Can't emit non-existing signal "AddPowerUp".

这是它在引擎中的样子:

游戏有信号,我附加到播放器中的一个函数:

在关卡场景中,我实例化了Game和ExtraBall:

ExtraBall 不应该知道 "AddPowerUp" 信号吗,因为它是在同一个 SceneTree 下实例化的?如果没有,我该如何发射在其他地方定义的信号?

我最终采用了不同的方式。

  • 我从 Level 场景中删除了 Game 实例。
  • 声明里面的信号ExtraBall.cs
  • 在游戏中创建了关卡实例
  • 通过代码将 ExtraBall 的信号连接到 Player 内部的函数。

场景树如下:

Game (Node2D)
  Player (Player.tscn)

Level (Node2D)
  ExtraBall (Extraball.tscn)

不确定这是否是一个好方法,但它似乎没有任何问题。我发布了一个小 "game",在底部显示了解决方案。

Game.cs

public class Game : Node2D
{
    [Signal] public delegate void LevelLoaded();

    public override void _Ready()
    {
        PackedScene scene = ResourceLoader.Load("res://source/level/Level.tscn") as PackedScene;
        AddChild(scene.Instance());
        EmitSignal("LevelLoaded");
    }
}

Player.cs

public class Player : KinematicBody2D
{
    public override void _Ready()
    {
        GetNode<Node>("/root/Game").Connect("LevelLoaded", this, "OnLevelLoaded");
    }

    public void OnLevelLoaded()
    {
        GetNode<Node>("/root/Game/Level/ExtraBall").Connect("TestSignal", this, "OnTestSignal");
    }

    public void OnTestSignal()
    {
        GD.Print("YAY!");
    }
}

ExtraBall.cs

public class ExtraBall : RigidBody2D
{
    [Signal] public delegate void TestSignal();

    public override void _IntegrateForces(Physics2DDirectBodyState state)
    {
        var bodies = GetCollidingBodies();

        foreach (Node2D node in bodies)
        {
            EmitSignal("TestSignal");
        }
    }
}

带有解决方案的小项目:https://www.dropbox.com/s/v7zac3lripsslrz/SignalTest.zip?dl=0