You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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);
    }
}

注意事项:

  1. 节点路径必须填写正确,否则会获取实例失败引发空引用报错
  2. C#读取GDScript返回值时需要显式转换类型,可使用.AsInt32()、.AsString()、.AsSingle()等内置方法完成转换
  3. 自定义类传递时需确保类继承自Godot.Object,且已注册到Godot类型系统中

内容的提问来源于stack exchange,提问作者Rubén ramirez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:06:08