Node.get_children
2026/4/14大约 5 分钟
最后同步日期:2026-04-16 | Godot 官方原文 — Node.get_children
Node.get_children
定义
get_children 就像打开一个文件夹,查看里面所有文件和子文件夹的列表。每个 Godot 节点都可以有子节点(就像文件夹里可以放文件),调用这个方法就能一次性拿到所有直接子节点,返回一个数组。
打个比方:如果一个"玩家"节点下面挂了"血条"、"武器"、"背包"三个子节点,那么对"玩家"调用 get_children(),就能同时拿到这三个子节点。
这是 Godot 中批量操作子节点的核心方法,常用于遍历所有子节点、统计子节点数量、按类型筛选子节点等场景。
函数签名
C#
public Godot.Collections.Array<Node> GetChildren(bool includeInternal = false)GDScript
get_children(include_internal: bool = false) -> Array[Node]参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| includeInternal | bool | 否 | 是否包含"内部子节点"。默认 false,只返回用户创建的普通子节点;设为 true 时还会包含引擎自动创建的内部节点(一般不需要用到) |
返回值
返回一个 Node 数组,包含该节点的所有直接子节点(不包括孙子节点,也就是子节点的子节点)。
- 如果节点没有子节点,返回空数组(不是 null)。
- 数组中子节点的顺序与它们在场景树中的排列顺序一致(即最先添加的子节点排在前面)。
代码示例
基础用法
获取一个节点的所有子节点,并打印它们的名字:
C#
public override void _Ready()
{
// 假设当前节点下已经有 3 个子节点:HealthBar、Weapon、Backpack
// 获取所有子节点
var children = GetChildren();
// 打印子节点数量
GD.Print("子节点数量: " + children.Count); // 运行结果: 子节点数量: 3
// 遍历并打印每个子节点的名字
foreach (var child in children)
{
GD.Print("子节点: " + child.Name);
}
// 运行结果:
// 子节点: HealthBar
// 子节点: Weapon
// 子节点: Backpack
}GDScript
func _ready():
# 假设当前节点下已经有 3 个子节点:HealthBar、Weapon、Backpack
# 获取所有子节点
var children = get_children()
# 打印子节点数量
print("子节点数量: " + str(children.size())) # 运行结果: 子节点数量: 3
# 遍历并打印每个子节点的名字
for child in children:
print("子节点: " + child.name)
# 运行结果:
# 子节点: HealthBar
# 子节点: Weapon
# 子节点: Backpack实际场景
在游戏中,一个"敌人容器"节点管理着所有动态生成的敌人。我们需要遍历子节点,找出所有还活着的敌人:
C#
public partial class EnemyManager : Node2D
{
// 敌人最大数量,可在编辑器中配置
[Export] public int ExMaxEnemies = 10;
public override void _Ready()
{
// 动态生成 3 个敌人子节点
for (int i = 0; i < 3; i++)
{
var enemy = new Sprite2D();
enemy.Name = $"Enemy_{i}";
AddChild(enemy);
}
// 获取所有子节点(即所有敌人)
var allEnemies = GetChildren();
GD.Print("总敌人数: " + allEnemies.Count); // 运行结果: 总敌人数: 3
// 找出所有 Sprite2D 类型的子节点
foreach (var child in GetChildren())
{
if (child is Sprite2D sprite)
{
GD.Print("找到敌人: " + sprite.Name);
}
}
// 运行结果:
// 找到敌人: Enemy_0
// 找到敌人: Enemy_1
// 找到敌人: Enemy_2
}
}GDScript
extends Node2D
# 敌人最大数量,可在编辑器中配置
@export var max_enemies: int = 10
func _ready():
# 动态生成 3 个敌人子节点
for i in range(3):
var enemy = Sprite2D.new()
enemy.name = "Enemy_%d" % i
add_child(enemy)
# 获取所有子节点(即所有敌人)
var all_enemies = get_children()
print("总敌人数: " + str(all_enemies.size())) # 运行结果: 总敌人数: 3
# 找出所有 Sprite2D 类型的子节点
for child in get_children():
if child is Sprite2D:
print("找到敌人: " + child.name)
# 运行结果:
# 找到敌人: Enemy_0
# 找到敌人: Enemy_1
# 找到敌人: Enemy_2进阶用法
结合 LINQ(C#)或数组过滤(GDScript),按类型筛选子节点,并处理 includeInternal 参数的区别:
C#
using System.Linq;
public partial class UIManager : Control
{
private int _buttonCount = 0;
public override void _Ready()
{
// 假设节点下有:Button、Label、Button、TextureRect、Button
// 用 LINQ 筛选出所有 Button 类型的子节点
var buttons = GetChildren()
.OfType<Button>()
.ToList();
_buttonCount = buttons.Count;
GD.Print("按钮数量: " + _buttonCount); // 运行结果: 按钮数量: 3
// 给每个按钮设置文字
for (int i = 0; i < buttons.Count; i++)
{
buttons[i].Text = $"按钮_{i}";
GD.Print("设置按钮文字: " + buttons[i].Text);
}
// 运行结果:
// 设置按钮文字: 按钮_0
// 设置按钮文字: 按钮_1
// 设置按钮文字: 按钮_2
// 对比:不包含内部子节点 vs 包含内部子节点
var normalChildren = GetChildren(false);
var allChildren = GetChildren(true);
GD.Print("普通子节点: " + normalChildren.Count); // 运行结果: 普通子节点: 5
GD.Print("含内部节点: " + allChildren.Count); // 运行结果: 含内部节点: 5(或更多)
}
}GDScript
extends Control
func _ready():
# 假设节点下有:Button、Label、Button、TextureRect、Button
# 筛选出所有 Button 类型的子节点
var buttons = []
for child in get_children():
if child is Button:
buttons.append(child)
print("按钮数量: " + str(buttons.size())) # 运行结果: 按钮数量: 3
# 给每个按钮设置文字
for i in range(buttons.size()):
buttons[i].text = "按钮_%d" % i
print("设置按钮文字: " + buttons[i].text)
# 运行结果:
# 设置按钮文字: 按钮_0
# 设置按钮文字: 按钮_1
# 设置按钮文字: 按钮_2
# 对比:不包含内部子节点 vs 包含内部子节点
var normal_children = get_children(false)
var all_children = get_children(true)
print("普通子节点: " + str(normal_children.size())) # 运行结果: 普通子节点: 5
print("含内部节点: " + str(all_children.size())) # 运行结果: 含内部节点: 5(或更多)注意事项
- 只返回直接子节点:
get_children不会递归查找孙子节点。如果需要获取所有后代节点(包括子节点的子节点),需要自己写递归函数,或者使用FindChild方法。 - 返回的是数组副本:对返回的数组进行添加或删除操作,不会影响节点的实际子节点列表。要添加或删除子节点,必须使用
AddChild()或RemoveChild()。 - includeInternal 参数:默认情况下,引擎自动创建的"内部节点"(例如 TileMap 内部用于管理图块的节点)不会出现在结果中。绝大多数情况下你不需要传
true,除非你在调试引擎内部行为。 - 空节点安全:如果节点没有任何子节点,返回的是空数组(长度为 0),而不是 null。所以你可以放心地遍历它,不会报错。
- C# 差异:C# 中方法名用 PascalCase(
GetChildren),返回类型是Godot.Collections.Array<Node>;GDScript 中用 snake_case(get_children),返回类型是Array[Node]。
