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
我在附加到节点的脚本中有一个信号:
游戏.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