HOME / 第 6 部分 · 数据与进阶开发 / 第 65 课
MODULE 6 · 数据与进阶开发
第 65 课 · 设置系统与持久化
🎯 本课学习目标
- 建立全局设置数据
- 用 JSON 持久化设置
- 实现画质/音量/键位设置
玩家想调音量、画质、按键——设置系统本课搞定,并保存到本地。
📖 详细教学步骤
设置数据结构设计
集中管理设置:
GDSCRIPTextends Node
var settings: Dictionary = {
"music_volume": 0.8,
"sfx_volume": 0.8,
"fullscreen": false,
"quality": "high", # high / medium / low
"language": "zh",
}
保存与加载设置代码
设置存 user://settings.json:
GDSCRIPTfunc save_settings():
var file = FileAccess.open("user://settings.json", FileAccess.WRITE)
file.store_string(JSON.stringify(settings))
file.close()
func load_settings():
if FileAccess.file_exists("user://settings.json"):
var file = FileAccess.open("user://settings.json", FileAccess.READ)
var parsed = JSON.parse_string(file.get_as_text())
file.close()
if parsed is Dictionary:
settings = parsed
# 加载后应用
apply_settings()
应用设置代码
把设置作用到游戏:
GDSCRIPTfunc apply_settings():
# 音量
AudioServer.set_bus_volume_db(
AudioServer.get_bus_index("Music"), linear_to_db(settings.music_volume))
AudioServer.set_bus_volume_db(
AudioServer.get_bus_index("SFX"), linear_to_db(settings.sfx_volume))
# 全屏
if settings.fullscreen:
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN)
else:
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)
# 画质
match settings.quality:
"low":
get_viewport().scaling_3d_scale = 0.75
"medium":
get_viewport().scaling_3d_scale = 1.0
"high":
get_viewport().scaling_3d_scale = 1.25
UI 绑定设置集成
在设置面板把控件与设置关联:
GDSCRIPTfunc _ready():
# 滑块初始值来自设置
music_slider.value = Globals.settings.music_volume
music_slider.value_changed.connect(_on_music_changed)
func _on_music_changed(v: float):
Globals.settings.music_volume = v
Globals.apply_settings() # 实时生效
自定义键位(进阶)进阶
让玩家改键:
GDSCRIPT# 设置界面记录新按键
func rebind_action(action: String, event: InputEvent):
var actions = InputMap.action_get_events(action)
for e in actions:
InputMap.action_erase_event(action, e) # 清旧
InputMap.action_add_event(action, event) # 加新
# 保存到 settings["keybinds"] = {...}
设置面板接入主菜单集成
- 主菜单「设置」按钮 → 打开设置面板(第 36 课)
- 面板控件读取 Globals.settings 初值
- 改动实时 apply_settings + 自动保存
- 重开游戏自动加载设置
💡 设置系统与存档系统分离:设置改了就存,存档是游戏进度。
⚠️
设置没生效?
改完设置要调用 apply_settings()。音量走总线,画质走视口,别漏。
⚠️
设置覆盖了?
load_settings 要在应用前调用,且只在文件存在时覆盖默认值。
🧪 动手试一试
🏋️ 课后练习
完成设置面板:音量滑杆(Music/SFX)、全屏勾选、画质下拉(高/中/低),改完自动保存,重开自动加载。
Globals 单例管理 settings + save/load + apply 三件套。
💡
设置改动即存(不用「保存」按钮),体验更顺滑。
💡
linear_to_db 把 0-1 转成 dB 音量,是标准做法。
🎓 本课小结
设置系统 = Globals 单例字典 + JSON 持久化 + apply_settings 应用;音量/全屏/画质/键位都可配置;改动即存、启动即载。