SceneTree.reload_current_scene
2026/4/14大约 4 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — SceneTree.reload_current_scene
SceneTree.reload_current_scene
定义
reload_current_scene 就像游戏机上的"重新开始"按钮——它把当前正在玩的关卡从头再来一遍。当前的关卡会被完全销毁,然后重新从磁盘加载一份崭新的副本。
打个比方:你在画一幅画,画到一半觉得画得不好,于是把画纸撕掉,拿出一张全新的白纸重新开始画。reload_current_scene 做的就是这件事——把当前场景扔掉,换一份全新的重新加载。
这在游戏开发中最常用于"角色死亡后重新开始"的场景。
函数签名
C#
public Error ReloadCurrentScene()GDScript
func reload_current_scene() -> Error参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| 无 | — | — | 此方法不需要参数 |
返回值
Error 枚举——返回重新加载的结果状态:
| 返回值 | 含义 |
|---|---|
Ok | 重新加载成功 |
CantOpen | 无法打开当前场景文件(可能文件已被删除或移动) |
CantCreate | 无法创建场景实例 |
代码示例
基础用法:重新加载当前场景
C#
public override void _Ready()
{
// 简单粗暴地重新加载当前场景
Error result = GetTree().ReloadCurrentScene();
if (result == Error.Ok)
{
GD.Print("场景已重新加载!");
}
// 运行结果: 场景已重新加载!
}GDScript
func _ready():
# 简单粗暴地重新加载当前场景
var result = get_tree().reload_current_scene()
if result == OK:
print("场景已重新加载!")
# 运行结果: 场景已重新加载!实际场景:角色死亡后重启关卡
C#
using Godot;
public partial class Player : CharacterBody2D
{
[Export] public int ExMaxHealth = 100;
private int _health;
private Vector2 _startPosition;
public override void _Ready()
{
_health = ExMaxHealth;
_startPosition = Position;
}
public void TakeDamage(int amount)
{
_health -= amount;
GD.Print($"受到 {amount} 点伤害,剩余血量: {_health}");
if (_health <= 0)
{
Die();
}
// 运行结果(第一次受到致命伤害时): 受到 100 点伤害,剩余血量: 0
}
public void Die()
{
GD.Print("角色死亡!3 秒后重新开始...");
// 运行结果: 角色死亡!3 秒后重新开始...
// 延迟 3 秒后重新加载场景
GetTree().CreateTimer(3.0).Timeout += () =>
{
GetTree().ReloadCurrentScene();
};
}
}GDScript
extends CharacterBody2D
@export var ex_max_health: int = 100
var _health: int
var _start_position: Vector2
func _ready():
_health = ex_max_health
_start_position = position
func take_damage(amount: int):
_health -= amount
print("受到 %d 点伤害,剩余血量: %d" % [amount, _health])
if _health <= 0:
die()
# 运行结果(第一次受到致命伤害时): 受到 100 点伤害,剩余血量: 0
func die():
print("角色死亡!3 秒后重新开始...")
# 运行结果: 角色死亡!3 秒后重新开始...
# 延迟 3 秒后重新加载场景
get_tree().create_timer(3.0).timeout.connect(func():
get_tree().reload_current_scene()
)进阶用法:带确认对话框的重启功能
C#
using Godot;
public partial class PauseMenu : Control
{
private ConfirmationDialog _restartDialog;
public override void _Ready()
{
// 创建确认对话框
_restartDialog = new ConfirmationDialog();
_restartDialog.Title = "重新开始";
_restartDialog.DialogText = "确定要重新开始当前关卡吗?所有进度将丢失。";
_restartDialog.OkButtonText = "重新开始";
_restartDialog.CancelButtonText = "取消";
AddChild(_restartDialog);
// 用户点击"确定"后重新加载场景
_restartDialog.Confirmed += OnRestartConfirmed;
}
public void OnRestartButtonPressed()
{
_restartDialog.PopupCentered();
}
private void OnRestartConfirmed()
{
GD.Print("玩家确认重新开始");
// 运行结果: 玩家确认重新开始
// 取消暂停并重新加载
GetTree().Paused = false;
Error result = GetTree().ReloadCurrentScene();
if (result != Error.Ok)
{
GD.PrintErr("重新加载场景失败!");
}
}
}GDScript
extends Control
var _restart_dialog: ConfirmationDialog
func _ready():
# 创建确认对话框
_restart_dialog = ConfirmationDialog.new()
_restart_dialog.title = "重新开始"
_restart_dialog.dialog_text = "确定要重新开始当前关卡吗?所有进度将丢失。"
_restart_dialog.ok_button_text = "重新开始"
_restart_dialog.cancel_button_text = "取消"
add_child(_restart_dialog)
# 用户点击"确定"后重新加载场景
_restart_dialog.confirmed.connect(_on_restart_confirmed)
func _on_restart_button_pressed():
_restart_dialog.popup_centered()
func _on_restart_confirmed():
print("玩家确认重新开始")
# 运行结果: 玩家确认重新开始
# 取消暂停并重新加载
get_tree().paused = false
var result = get_tree().reload_current_scene()
if result != OK:
push_error("重新加载场景失败!")注意事项
- 当前场景会被完全销毁:调用后,当前场景中的所有节点都会被释放。当前脚本所在的节点也不例外,所以不要在调用
ReloadCurrentScene()之后再执行任何代码。 - 所有运行时状态都会丢失:包括变量值、动态添加的节点、修改过的属性等。重新加载后一切回到场景文件中保存的初始状态。
- 场景文件路径:
ReloadCurrentScene会根据CurrentScene属性记录的路径重新加载。如果当前场景是通过代码动态创建的(没有对应的.tscn文件),重新加载会失败。 - 如果需要保存数据:在调用重新加载之前,应该先把需要保留的数据(如分数、装备等)保存到 Autoload 单例或外部文件中,重新加载后再读取。
- C# 差异:C# 中方法名用 PascalCase(
ReloadCurrentScene),GDScript 中用 snake_case(reload_current_scene)。
