HOME / 第 6 部分 · 数据与进阶开发 / 第 63 课
MODULE 6 · 数据与进阶开发
第 63 课 · 场景切换进阶
🎯 本课学习目标
- 掌握场景切换的多种方式
- 实现加载过渡画面
- 场景间传递数据
一个游戏多个场景(菜单/关卡/结算),切换是基本功。本课把场景切换做扎实。
📖 详细教学步骤
三种切换方式概念
| 方法 | 特点 |
|---|---|
| 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)
加载过渡画面实操
场景加载瞬间会卡一下,加「加载中」过渡:
- 做一个 LoadScreen 场景:全屏黑幕 + 「加载中…」Label
- 切换前先实例化加载画面:
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()
跨场景数据传递代码
切场景节点会销毁,传递数据三种方式:
- Autoload 单例(第 67 课,最推荐)
- 全局变量文件(简单项目)
- 参数传递(手动 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);音乐等常驻节点放单例;大场景用异步加载。