HOME / 第 6 部分 · 数据与进阶开发 / 第 63 课
MODULE 6 · 数据与进阶开发

第 63 课 · 场景切换进阶

⏱ 预计时长 30 分钟📊 难度 进阶📚 模块 第 6 部分 · 数据与进阶开发

🎯 本课学习目标

一个游戏多个场景(菜单/关卡/结算),切换是基本功。本课把场景切换做扎实。

📖 详细教学步骤

三种切换方式概念

方法特点
change_scene_to_file立即切换,旧场景销毁(简单)
change_scene_to_packed传 PackedScene 资源切换
add_child + remove_child手动管理(可保留部分节点)

change_scene_to_packed 用法代码

预加载场景资源再切换:

GDSCRIPTconst LEVEL_2 = preload("res://scenes/level2.tscn")

func go_to_level_2():
    get_tree().change_scene_to_packed(LEVEL_2)

加载过渡画面实操

场景加载瞬间会卡一下,加「加载中」过渡:

  1. 做一个 LoadScreen 场景:全屏黑幕 + 「加载中…」Label
  2. 切换前先实例化加载画面:
GDSCRIPTconst LOAD_SCREEN = preload("res://scenes/load_screen.tscn")

func change_with_loading(new_scene_path: String):
    # 显示加载画面
    var loader = LOAD_SCREEN.instantiate()
    get_tree().root.add_child(loader)
    # 等待一帧让画面显示
    await get_tree().process_frame
    # 切换场景
    get_tree().change_scene_to_file(new_scene_path)
    # 新场景就绪后移除加载画面
    await get_tree().process_frame
    loader.queue_free()

跨场景数据传递代码

切场景节点会销毁,传递数据三种方式:

  1. Autoload 单例(第 67 课,最推荐)
  2. 全局变量文件(简单项目)
  3. 参数传递(手动 add_child 时传)
GDSCRIPT# 方式2: 全局数据脚本 globals.gd (Autoload)
# 任意场景都能读写
Globals.current_level = 3
Globals.player_hp = 5

# 切到下一关
func go_next_level():
    Globals.current_level += 1
    get_tree().change_scene_to_file("res://scenes/level%d.tscn" % Globals.current_level)

保持常驻节点(不随切换销毁)进阶

音乐播放器等希望切场景不中断:

GDSCRIPTfunc _ready():
    # 把当前节点移到 root 下并设为不要自动释放
    get_tree().root.add_child.call_deferred(self)
    # 或更简单:把音乐播放器做成 Autoload(第67课)

异步加载大场景预告

大场景直接切换会卡顿,用 ResourceLoader 后台加载(第 64 课详讲):

GDSCRIPTvar loader = ResourceLoader.load_threaded_request("res://scenes/big_level.tscn")
# ... 后台加载中 ...
var scene = ResourceLoader.load_threaded_get("res://scenes/big_level.tscn")
⚠️
切换后黑屏?

新场景还没 ready 就移除加载画面了。用 await process_frame 等新场景就绪。

⚠️
切换后音乐停了?

音乐节点随旧场景销毁。把音乐播放器放到 Autoload 单例里。

🧪 动手试一试

🏋️ 课后练习

做 3 个关卡场景,通关进入下一关(用 Globals 记录关卡号),切换时显示 0.3 秒「加载中」黑幕。

Globals.current_level + change_with_loading()。

💡

复杂游戏用「场景管理器」单例统一封装切换逻辑。

💡

change_scene_to_file 返回 Error,可判断是否成功。

🎓 本课小结

场景切换:change_scene_to_file/Packed + 过渡画面 + 数据传递(Autoload);音乐等常驻节点放单例;大场景用异步加载。