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

Godot 3.5.1 C#跨脚本访问:同Spatial节点下对象变量读写实现

实现方案

1. 先确保SB.cs中的变量可被访问

在SB.cs里,需要把字符串变量U设置为可外部访问的状态,两种常用方式:

方式一:直接公开变量(简单直接)

using Godot;
using System;

public class SB : Node
{
    // 公开字符串变量U,允许外部直接读写
    public string U = "初始值";
}

方式二:属性封装(符合C#规范,便于后续扩展逻辑)

using Godot;
using System;

public class SB : Node
{
    private string _u = "初始值";
    
    // 公共属性,外部通过该属性读写内部变量
    public string U
    {
        get => _u;
        set => _u = value;
    }
}

2. 在SA.cs中获取OB节点并读写变量U

由于OA和OB同属一个Spatial父节点,可通过以下两种可靠方式获取目标脚本并操作变量:

方式一:通过父节点查找(推荐,节点层级固定时更稳定)

using Godot;
using System;

public class SA : Node
{
    private SB _sbScript;

    public override void _Ready()
    {
        // 获取父节点,再从父节点的子节点中找到OB
        Node parentNode = GetParent();
        _sbScript = parentNode.GetNode<SB>("OB");
        
        // 空引用检查,避免运行报错
        if (_sbScript == null)
        {
            GD.PrintErr("未找到OB节点或其挂载的SB脚本");
            return;
        }

        // 读取变量U
        string currentValue = _sbScript.U;
        GD.Print("当前U的值:", currentValue);

        // 写入变量U
        _sbScript.U = "新的字符串内容";
        GD.Print("修改后U的值:", _sbScript.U);
    }
}

方式二:直接路径查找(节点层级复杂但路径固定时可用)

using Godot;
using System;

public class SA : Node
{
    private SB _sbScript;

    public override void _Ready()
    {
        // 路径`../OB`表示当前节点(OA)的父节点下的OB
        _sbScript = GetNode<SB>("../OB");
        
        if (_sbScript == null)
        {
            GD.PrintErr("未找到OB节点或其挂载的SB脚本");
            return;
        }

        // 读取操作
        GD.Print("读取U的值:", _sbScript.U);
        // 写入操作
        _sbScript.U = "从SA修改后的字符串";
    }
}

关键注意事项

  • 节点名称必须完全匹配:代码中的"OB"要和编辑器里的节点名称一致,大小写敏感。
  • 脚本继承匹配:SB.cs和SA.cs的继承类要和挂载的节点类型对应(比如挂载在Spatial节点上就继承Spatial,挂载在普通Node上就继承Node)。
  • 空引用检查:必须判断_sbScript是否为null,防止运行时出现空引用异常。

内容的提问来源于stack exchange,提问作者cubecube

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:00:57