【问题标题】:Godot emit signal defined in another scene [duplicate]Godot发出在另一个场景中定义的信号[重复]
【发布时间】:2020-06-14 04:44:23
【问题描述】:

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

Game.tscn/Game.cs

using Godot;

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

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

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".

这是它在引擎中的样子:

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

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

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

【问题讨论】:

    标签: c# godot


    【解决方案1】:

    我最终以不同的方式做这件事。

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

    场景树如下:

    Game (Node2D)
      Player (Player.tscn)
    
    Level (Node2D)
      ExtraBall (Extraball.tscn)
    

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 2018-02-14
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多