Factorio模组开发:实现游戏内设置控制音乐开关的问题
解决Factorio模组中通过设置控制音乐专辑启用/禁用的问题
核心问题原因
你遇到的报错本质是Factorio模组的阶段API隔离:
data表仅在启动阶段(data.lua、data-updates.lua、data-final-fixes.lua)可用,游戏运行时(control.lua)无法访问。settings.global仅在运行阶段(control.lua)可用,启动阶段只能访问settings.startup(启动时生效的设置)。
正确实现方案
要控制音乐专辑的启用/禁用,因为音乐属于启动阶段定义的data内容,必须用启动型设置,用户修改后需重启游戏生效,具体步骤如下:
1. 在settings.lua中定义启动设置
创建开关型启动设置,对应每个专辑的启用状态:
data:extend({ { type = "bool-setting", name = "my-mod-enable-album-1", setting_type = "startup", default_value = true, order = "a" }, { type = "bool-setting", name = "my-mod-enable-album-2", setting_type = "startup", default_value = true, order = "b" } })
2. 在data.lua中根据设置加载音乐
直接在音乐加载逻辑中判断启动设置,仅加载启用的专辑:
-- 定义专辑1的音乐数据 local album_1 = { { type = "music", name = "album1-track1", filename = "__your-mod__/sound/album1/track1.ogg", volume = 0.8 }, -- 专辑1的其他曲目... } -- 定义专辑2的音乐数据 local album_2 = { { type = "music", name = "album2-track1", filename = "__your-mod__/sound/album2/track1.ogg", volume = 0.8 }, -- 专辑2的其他曲目... } -- 根据启动设置添加对应专辑 if settings.startup["my-mod-enable-album-1"].value then data:extend(album_1) end if settings.startup["my-mod-enable-album-2"].value then data:extend(album_2) end
备选方案:在data-final-fixes.lua中移除禁用的音乐
如果已经在data.lua中加载了所有音乐,可在启动阶段的最后一步(data-final-fixes.lua)根据设置移除禁用的专辑:
-- 移除专辑1的所有曲目 if not settings.startup["my-mod-enable-album-1"].value then data.music["album1-track1"] = nil data.music["album1-track2"] = nil -- 其他曲目... end -- 移除专辑2的所有曲目 if not settings.startup["my-mod-enable-album-2"].value then data.music["album2-track1"] = nil data.music["album2-track2"] = nil -- 其他曲目... end
关于运行时动态开关的说明
如果想要实现无需重启游戏的动态开关,不能直接修改data表,而是要在control.lua中监听settings.global的变化,通过脚本控制音乐播放逻辑(比如拦截播放请求、调整音量为0),但这种方法无法真正卸载已加载的音乐资源,仅能控制播放状态。
内容的提问来源于stack exchange,提问作者Izon
相关产品推荐
相关产品推荐

