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);}}
}