前言
Godot 里面C#和GDScirpt 的用法完全不一样,网上相关资料太少了。
什么是信号
信号分为信号源,触发,目的节点。信号源在某些条件下触发信号,比如按钮点击,鼠标悬停等事件
触发 节点1 信号源:按钮点击 触发事件 节点2
新建点击事件
编写信号
我们需要编写完全一模一样的信号。如果是GDScript会自动生成对应的信号,但是如果是C#的话需要我们手动添加方法
csharp
/// <summary>
/// 方法名必须完全一致
/// </summary>
private void _on_button_pressed()
{
//获取子节点LineEdit
var input = GetNode<LineEdit>("LineEdit");
//获取子节点Button
var button = GetNode<Button>("Button");
//添加按钮事件
button.Text = $"input.Text:{input.Text}";
}
运行结果
自定义信号
delegate void 信号必须以EventHandler 结尾
csharp
[Signal]
public delegate void TestEventHandler();
自定义信号节点添加成功!
信号节点自动化命名
大家可能会疑惑触发事件是自动生成的,不会出问题吗?一般来说不会出问题。
给别的节点传信号
给自己传信号
同名节点传信号
总结:
信号命名:
- 给别的节点传: _on_节点名称_方法名()
- 给自己传:_on_方法名()
所以如果有两个节点名称完全一致,确实会重复信号。不过Godot 限制兄弟节点是不能有同名情况出现的,只能是非兄弟节点才可以。
直接获取信号
我们也可以直接在_Ready函数里面把逻辑给写了。但是只能添加默认的委托方法。此方法不推荐。一个是只能用默认方法,还有一个是必须在代码里面看,没有信号显示的那么直观。
csharp
public override void _Ready()
{
var input = GetNode<LineEdit>("LineEdit");
var button = GetNode<Button>("Button");
button.Pressed += () =>
{
button.Text = input.Text;
};
}