Godot-C#处理节点关系
Godot C#处理节点关系
简介
我们知道在游戏中,任何事物都可以看做一个节点,而节点之间的关系可以帮助我们更好的管理游戏世界。Godot中,节点之间的关系可以分为两种:父子关系和兄弟关系。godot已经提供了现成的方法来获取节点之间的关系。
根节点
根节点是游戏世界的最顶层节点,它没有父节点,也就是说它是游戏世界的根,我们称为root节点。整个游戏的所有场景都建立在root之上。因此根据root来查找节点通常是比较准确的。在开发过程中,个人建议是少用相对路径,万一节点位置发生了变化,那么相对路径就会失效。
获取方法:
Node root = GetTree().Root;
节点查找
Godot提供了查找节点的各种方法,包括按名字查找、按类型查找、按路径查找等。
父子关系&兄弟关系
兄弟关系通常指同级节点,也就是父节点的子节点。想获取同级节点,一般也是通过父节点查找子节点的方式
父节点可以有无数个子节点,但是子节点只能有单个父节点。父子关系是节点间最常用的关系,我们可以通过以下方法获取父子关系:
// 获取父节点
Node parent = this.GetParent();
// 获取子节点:仅查找一层,不会递归查找
Node child = parent.FindChild("child_name");
路径查找
GetNode 使用路径字符串来查找节点。路径字符串可以是相对路径或绝对路径。
例如,如果你有一个节点路径 "InputTest/SubNode",你可以使用 GetNode("InputTest/SubNode") 来直接获取 SubNode 节点,而不需要逐层查找。
GetNode 是严格且快速的查找方式,因为它直接根据路径定位节点,如果路径错误或者节点不存在,会抛出异常。
// 相对路径查找
Node node = this.GetNode("SubNode");
// 绝对路径查找
Node node = this.GetNode("path/to/node");
// 获取节点并转换为特定类型
Node2D node2D = this.GetNode("path/to/node") as Node2D;
示例
测试节点如图所示:

代码示例如下:
using Godot;
using System;
public partial class TestNodeRelation : Node2D
{
public override void _Ready()
{
}
public override void _Process(double delta)
{
if (Input.IsActionJustPressed("Left"))
{
GD.Print("按下左键");
// 获取当前场景的根节点
Node root = GetTree().Root;
GD.Print("根节点名称: " + root.Name);
// 获取当前场景
Node currentScene = this.GetTree().CurrentScene;
GD.Print("当前场景名称: " + currentScene.Name);
// 查找当前场景下名为 InputTest 的子节点,需注意与GetNode方法的区别
Node inputTest = currentScene.FindChild("InputTest");
// 将 InputTest 节点从它的父节点移除,然后添加到当前节点下
GD.Print("将 InputTest 节点移动到 TestNodeRelation 节点下");
currentScene.RemoveChild(inputTest);
this.AddChild(inputTest);
// 删除 InputTest 节点
// GD.Print("删除 InputTest 节点");
// inputTest.QueueFree();
}
if (Input.IsActionJustPressed("Right"))
{
GD.Print("按下右键");
// 获取当前场景
Node currentScene = this.GetTree().CurrentScene;
// 新建节点
Node2D newNode = new Node2D();
// 设置节点名称
newNode.Name = "NewNode";
// 将新节点添加到当前场景下
currentScene.AddChild(newNode);
}
}
}

浙公网安备 33010602011771号