如何实现GDScript与C#之间的变量互相传递
Godot中GDScript与C#变量双向传递实现方案
前置说明
两种语言的交互核心是获取对方脚本挂载的节点实例,传递的变量需为Godot支持的互操作类型(基础类型、Godot内置类型、继承自Godot.Object的自定义类型均可)。
1. GDScript变量传递给C#使用
步骤1:C#侧声明可访问的成员
你可以通过公共变量、属性、接收参数的方法三种方式接收GDScript传递的值,示例C#脚本(命名为CsDemo.cs):
using Godot; public partial class CsDemo : Node { // 公共变量:直接接收GDScript赋值 public int RecvInt; // 公共属性:也支持直接读写 public string RecvStr { get; set; } // 方法参数:适合需要赋值后执行额外逻辑的场景 public void SetRecvFloat(float value) { GD.Print($"成功接收GDScript传来的浮点数:{value}"); } }
步骤2:GDScript侧赋值/传参
首先获取挂载了上述C#脚本的节点实例,直接操作对应成员即可:
# 假设C#脚本挂载在同场景下名为CsNode的节点上 var cs_instance = $CsNode # 直接给公共变量/属性赋值 cs_instance.RecvInt = 1024 cs_instance.RecvStr = "来自GDScript的测试内容" # 调用C#方法传递参数 cs_instance.SetRecvFloat(3.1415926)
2. C#变量回传给GDScript调用
分为两种场景:GDScript主动拉取C#的值、C#主动推送值给GDScript。
场景1:GDScript主动读取C#的值
C#侧声明可访问的公开成员
using Godot; public partial class CsDemo : Node { // 公开变量:GDScript可直接读取 public int SendInt = 2048; // 公开属性:支持直接读取 public string SendStr { get; set; } = "C#侧预设的字符串"; // 方法返回值:适合需要动态计算返回内容的场景 public float GetSendFloat() { return 9.999f; } }
GDScript侧直接读取
var cs_instance = $CsNode # 读取公共变量/属性 var get_int = cs_instance.SendInt var get_str = cs_instance.SendStr # 调用方法获取返回值 var get_float = cs_instance.GetSendFloat() print("从C#获取到的内容:", get_int, " ", get_str, " ", get_float)
场景2:C#主动推送值给GDScript
GDScript侧先声明接收用的变量/方法
示例GDScript脚本(命名为GdDemo.gd,挂载在名为GdNode的节点上):
# 声明接收C#赋值的变量 var recv_from_cs: int # 声明接收参数的方法,适合赋值后执行额外逻辑 func set_recv_str(value: String) -> void: print("成功收到C#主动传来的字符串:", value)
C#侧操作GDScript实例
using Godot; public partial class CsDemo : Node { public override void _Ready() { // 获取GDScript脚本挂载的节点实例 var gd_instance = GetNode<Node>("GdNode"); // 直接给GDScript的变量赋值 gd_instance.Set("recv_from_cs", 4096); // 调用GDScript的方法传递参数 gd_instance.Call("set_recv_str", "C#主动推送的测试内容"); // 也可以主动读取GDScript的变量值 int gd_value = gd_instance.Get("recv_from_cs").AsInt32(); GD.Print("从GDScript读取到的值:", gd_value); } }
注意事项:
- 节点路径必须填写正确,否则会获取实例失败引发空引用报错
- C#读取GDScript返回值时需要显式转换类型,可使用
.AsInt32()、.AsString()、.AsSingle()等内置方法完成转换- 自定义类传递时需确保类继承自
Godot.Object,且已注册到Godot类型系统中
内容的提问来源于stack exchange,提问作者Rubén ramirez
相关产品推荐
相关产品推荐

