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

第 65 课 · 设置系统与持久化

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

🎯 本课学习目标

玩家想调音量、画质、按键——设置系统本课搞定,并保存到本地。

📖 详细教学步骤

设置数据结构设计

集中管理设置:

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"] = {...}

设置面板接入主菜单集成

  1. 主菜单「设置」按钮 → 打开设置面板(第 36 课)
  2. 面板控件读取 Globals.settings 初值
  3. 改动实时 apply_settings + 自动保存
  4. 重开游戏自动加载设置

💡 设置系统与存档系统分离:设置改了就存,存档是游戏进度。

⚠️
设置没生效?

改完设置要调用 apply_settings()。音量走总线,画质走视口,别漏。

⚠️
设置覆盖了?

load_settings 要在应用前调用,且只在文件存在时覆盖默认值。

🧪 动手试一试

🏋️ 课后练习

完成设置面板:音量滑杆(Music/SFX)、全屏勾选、画质下拉(高/中/低),改完自动保存,重开自动加载。

Globals 单例管理 settings + save/load + apply 三件套。

💡

设置改动即存(不用「保存」按钮),体验更顺滑。

💡

linear_to_db 把 0-1 转成 dB 音量,是标准做法。

🎓 本课小结

设置系统 = Globals 单例字典 + JSON 持久化 + apply_settings 应用;音量/全屏/画质/键位都可配置;改动即存、启动即载。