SceneTree.get_current_scene
2026/4/14大约 4 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — SceneTree.get_current_scene
SceneTree.get_current_scene
定义
get_current_scene 就像查看电视机正在播放哪个频道——它会告诉你"现在屏幕上正在显示的是哪个场景"。返回的是当前场景的根节点,也就是整个场景树最顶层的那个节点。
打个比方:你打开了一本书,get_current_scene 就是告诉你"你现在正在看的是第几章"。拿到这个信息后,你就可以对这一章(当前场景)做各种操作,比如找到里面的某个角色、修改某个属性。
在实际开发中,当你需要从外部(比如 Autoload 全局脚本)访问当前场景中的节点时,就需要先用 get_current_scene 拿到场景的根节点,再通过它往下找。
函数签名
C#
public Node GetCurrentScene()GDScript
func get_current_scene() -> Node参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| 无 | — | — | 此方法不需要参数 |
返回值
Node——当前场景的根节点。如果没有加载任何场景(比如在启动时还没有调用过 ChangeSceneToFile),则返回 null。
| 情况 | 返回值 |
|---|---|
| 正常运行中 | 当前场景的根节点(如 Node2D、Control 等) |
| 尚未加载任何场景 | null |
代码示例
基础用法:获取当前场景并打印信息
C#
public override void _Ready()
{
// 获取当前场景的根节点
Node currentScene = GetTree().CurrentScene;
if (currentScene != null)
{
GD.Print($"当前场景: {currentScene.Name}");
GD.Print($"场景路径: {currentScene.SceneFilePath}");
}
// 运行结果: 当前场景: Level01
// 运行结果: 场景路径: res://levels/level_01.tscn
}GDScript
func _ready():
# 获取当前场景的根节点
var current_scene = get_tree().current_scene
if current_scene != null:
print("当前场景: %s" % current_scene.name)
print("场景路径: %s" % current_scene.scene_file_path)
# 运行结果: 当前场景: Level01
# 运行结果: 场景路径: res://levels/level_01.tscn实际场景:从全局脚本访问当前场景中的节点
C#
using Godot;
// 这是一个 Autoload 全局脚本,可以在任何地方使用
public partial class GameManager : Node
{
public void PrintAllChildren()
{
// 从全局管理器访问当前场景的所有子节点
Node currentScene = GetTree().CurrentScene;
if (currentScene == null)
{
GD.Print("当前没有加载任何场景");
return;
}
GD.Print($"--- 场景 [{currentScene.Name}] 的子节点 ---");
foreach (Node child in currentScene.GetChildren())
{
GD.Print($" - {child.Name} ({child.GetClass()})");
}
// 运行结果:
// --- 场景 [Level01] 的子节点 ---
// - Player (CharacterBody2D)
// - Camera2D (Camera2D)
// - EnemySpawner (Node2D)
}
public void FindPlayer()
{
// 从当前场景根节点开始查找 Player
Node currentScene = GetTree().CurrentScene;
var player = currentScene?.GetNode<CharacterBody2D>("Player");
if (player != null)
{
GD.Print($"找到玩家!位置: {player.Position}");
}
// 运行结果: 找到玩家!位置: (100, 200)
}
}GDScript
# 这是一个 Autoload 全局脚本,可以在任何地方使用
extends Node
func print_all_children():
# 从全局管理器访问当前场景的所有子节点
var current_scene = get_tree().current_scene
if current_scene == null:
print("当前没有加载任何场景")
return
print("--- 场景 [%s] 的子节点 ---" % current_scene.name)
for child in current_scene.get_children():
print(" - %s (%s)" % [child.name, child.get_class()])
# 运行结果:
# --- 场景 [Level01] 的子节点 ---
# - Player (CharacterBody2D)
# - Camera2D (Camera2D)
# - EnemySpawner (Node2D)
func find_player():
# 从当前场景根节点开始查找 Player
var current_scene = get_tree().current_scene
var player = current_scene.get_node_or_null("Player")
if player != null:
print("找到玩家!位置: %s" % str(player.position))
# 运行结果: 找到玩家!位置: (100, 200)进阶用法:动态判断当前场景类型并执行不同逻辑
C#
using Godot;
public partial class AudioManager : Node
{
// 根据当前场景类型播放不同的背景音乐
public void PlaySceneBGM()
{
Node currentScene = GetTree().CurrentScene;
if (currentScene == null) return;
string scenePath = currentScene.SceneFilePath;
if (scenePath.Contains("main_menu"))
{
GD.Print("播放主菜单音乐");
// 运行结果(主菜单场景时): 播放主菜单音乐
}
else if (scenePath.Contains("level"))
{
GD.Print("播放关卡战斗音乐");
// 运行结果(关卡场景时): 播放关卡战斗音乐
}
else if (scenePath.Contains("boss"))
{
GD.Print("播放 Boss 战斗音乐");
// 运行结果(Boss 场景时): 播放 Boss 战斗音乐
}
}
// 检查当前场景是否包含特定类型的节点
public bool HasNodeOfType<T>() where T : Node
{
Node currentScene = GetTree().CurrentScene;
if (currentScene == null) return false;
foreach (Node child in currentScene.GetChildren())
{
if (child is T)
{
return true;
}
}
return false;
}
}GDScript
extends Node
# 根据当前场景类型播放不同的背景音乐
func play_scene_bgm():
var current_scene = get_tree().current_scene
if current_scene == null:
return
var scene_path = current_scene.scene_file_path
if "main_menu" in scene_path:
print("播放主菜单音乐")
# 运行结果(主菜单场景时): 播放主菜单音乐
elif "level" in scene_path:
print("播放关卡战斗音乐")
# 运行结果(关卡场景时): 播放关卡战斗音乐
elif "boss" in scene_path:
print("播放 Boss 战斗音乐")
# 运行结果(Boss 场景时): 播放 Boss 战斗音乐
# 检查当前场景是否包含特定类型的节点
func has_node_of_type(type_name: String) -> bool:
var current_scene = get_tree().current_scene
if current_scene == null:
return false
for child in current_scene.get_children():
if child.is_class(type_name):
return true
return false注意事项
- 在
_Ready()中可能为null:如果当前节点是 Autoload 脚本,在_Ready()时主场景可能还没加载完毕,此时GetCurrentScene()可能返回null。建议在使用前始终做空值检查。 - 场景切换瞬间可能为
null:在调用ChangeSceneToFile之后、新场景完全加载之前,GetCurrentScene()会短暂返回null。 - 返回的是场景根节点:不是场景文件路径,而是场景实例化的根节点对象。如果需要获取文件路径,请使用
CurrentScene.SceneFilePath。 - 与
GetTree().Root不同:Root是整个场景树的根(Viewport),而CurrentScene是Root下面的当前场景节点。层级关系是Root -> CurrentScene -> 你的各种节点。 - C# 差异:C# 中用属性
GetTree().CurrentScene或方法GetTree().GetCurrentScene(),GDScript 中用属性get_tree().current_scene或方法get_tree().get_current_scene()。
