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
相关产品推荐
相关产品推荐

