Starsector Nihilism Guidance
首页
GitHub 项目
首页
GitHub 项目
  • 首页
  • 基础及舰船相关
    • MOD 骨架和入口文件
    • 制作一艘基本舰船
    • 制作一艘航母与战机
    • 制作一艘相位舰
    • 制作火炮、光束与导弹
    • 为舰船加入内置武器、船插与战机
    • 补充描述文本
  • 无需入门的代码修改
    • 以船插为例初步熟悉代码
    • 制作完整船插
    • 制作最小战术系统
    • 为武器加入命中与光束特效
  • 势力与生涯星系
    • 注册一个势力
    • 配置势力舰队
    • 制作 MOD 入口类的最基础适配
    • 制作一个生涯星系
    • 补完描述文本
  • 战役与无代码对象
    • 制作测试战役装配
    • 为模拟战与标题画面加入装配
    • 为舰船加入外观风格
    • 制作一艘模块船
    • 制作一种星体类型
    • 制作一个自定义实体
  • 音频资源与播放
    • 准备 OGG 音频资源
    • 注册音频资源
    • 为游戏对象加入音频
  • Java 工程化
    • 确认 Java 与编译依赖
    • 迁移代码文件到 src
    • 配置 Gradle 工程
    • 构建 JAR 并声明产物
  • 全局服务
    • 制作 MOD 入口类
    • 使用 Global 访问游戏服务
    • 读取设置
    • 调用声音播放器
    • 记录和定位 MOD 日志
  • 战斗运行时
    • 读取战斗引擎状态
    • 读取战斗对象
    • 制作每帧战斗插件
    • 修改舰船数值
    • 配置武器脚本
    • 配置战斗监听器
    • 制作分层渲染插件
  • 战斗内容扩展
    • 详解舰船插件
    • 详解战术系统
    • 详解武器动画
  • 生涯世界与基础服务
    • 读取生涯世界状态
    • 构建生涯地点
    • 配置生涯势力
    • 放置生涯实体
  • 生涯舰队与舰队成员
    • 生成生涯舰队
    • 管理舰队中的成员
    • 舰队状态的重算过程
    • 维护舰队成员状态
    • 读取并修改舰船装配
  • 市场与商品
    • 创建生涯市场
    • 读写货舱内容
    • 注册市场商品
    • 实现专用子市场
    • 制作专用产业
    • 注册特殊物品
    • 实现市场条件
  • 人物与技能
    • 配置人物基础
    • 让人物承担角色
    • 制作角色技能
  • 生涯脚本与情报事件
    • 编写生涯逐帧脚本
    • 监听生涯事件
    • 选择生涯插件
    • 管理舰队活动情报
  • 酒吧事件与任务
    • 组织生涯交互对话
    • 实现对话插件
    • 接入酒吧事件
    • 构建阶段任务
    • 接入酒吧任务
  • Rules 系统、命令与内存
    • 组织 Rules 规则表
    • 编排 Rules 对话
    • 接入 Rules 生涯场景
    • 编写 Rules 命令
    • 使用 MemoryAPI 保存状态
  • 文件读取与写入
    • 读取 MOD 内文本
    • 读取 MOD 内 JSON 文件
    • 读取 MOD 内 CSV
    • 读写 common 数据
    • 实现本地化机制
  • 常用依赖库
    • 接入常用依赖库
    • 使用 LazyLib 几何工具
    • 使用 LazyLib 查询战场
    • 使用 LazyLib 保存公共 JSON
    • 注册 GraphicsLib 光照数据
    • 创建 GraphicsLib 动态光源
    • 制作 GraphicsLib 纹理映射
    • 配置 MagicLib 自动尾迹
    • 创建 MagicLib 运行时尾迹
    • 配置 MagicLib 数据赏金
    • 使用 MagicLib 辅助生涯开发
    • 使用 MagicLib 战斗小工具
  • 可选依赖与 Nexerelin
    • 接入可选依赖
    • 登记 Nexerelin 势力与外交配置
    • 配置 Nexerelin 的两种星区开局
    • 配置 Nexerelin 战略 AI 与扩张规模
    • 登记 Nexerelin 地面战单位与产业
    • 为 Nexerelin 特遣队添加命名与事件响应
    • 制作即时生效的 LunaLib 设置面板
  • 着色器与渲染
    • 使用 Java OpenGL
    • 使用 GLSL 进阶
    • 使用 VBO 和 VAO 保存顶点
    • 使用 SSBO 传递参数
    • 使用实例化进行绘制
    • 选择 BoxUtil 渲染方案

注册音频资源

音频文件准备好后,在 sounds.json 中登记 ID、路径、音量与音高。普通音效、船体分档声音集和音乐采用各自的结构;本节提供一份完整配置,下一节将这些 ID 用于都林、突击填弹器、舰船风格和市场。

本节预期阅读时间:~8 分钟。

本节预期操作时间:~10 分钟。

学习目标

完成后,您将能够:

  • 创建普通声音、分档声音集和音乐条目;
  • 设置 file、source、volume 与 pitch;
  • 按同路径合并添加自有内容;
  • 用 replace 控制整份数据读取,并定位资源错误。

前置知识

  • [C5-S1] 的四个音频、声道与目录;
  • [C1-S1] 的 MOD 目录和数据合并;
  • [C4-S3] 的风格声音集引用;
  • 能够编辑 JSON 对象、数组与字符串。

登记普通音效

打开或创建 MOD 的 data/config/sounds.json,顶层使用声音 ID 作为键。都林开火的局部条目如下:

{
    "GearIn_weapon_fire": [
        {
            "file": "sounds/GearIn_weapon_fire.ogg",
            "volume": 1,
            "pitch": 1
        }
    ]
}

file 指定资源路径,volume 设置音量,pitch 设置音高倍率,1 表示原始值。一个 ID 可以提供多个候选资源;当前数组只有一项,使用刚才准备的开火文件。

系统循环和 UI 反馈同样登记为普通音效,ID 分别为 GearIn_system_loop 与 GearIn_ui_feedback。登记结构相同,资源声道和播放方法仍按各自用途选择,声道已经在上一节确定。

登记舰船分档声音集

舰船风格中的 engineLoopSet 与 engineAccelerateSet 读取声音集。同一个声音集先列出资源,再按船体等级选择其中的索引,局部结构如下:

{
    "GearIn_engine_loop": {
        "sounds": [
            {"file": "sounds/GearIn_system_loop.ogg", "pitch": 1, "volume": 1}
        ],
        "FIGHTER": {"sounds": [0], "pitch": 1, "volume": 0.2},
        "FRIGATE": {"sounds": [0], "pitch": 1, "volume": 0.3},
        "DESTROYER": {"sounds": [0], "pitch": 1, "volume": 0.4},
        "CRUISER": {"sounds": [0], "pitch": 1, "volume": 0.5},
        "CAPITAL_SHIP": {"sounds": [0], "pitch": 1, "volume": 0.6}
    }
}

sounds 数组第一个资源的索引为 0,各档的 sounds: [0] 都引用这一项。本例复用已有循环文件,每档采用相同索引,只将音量分档。以后准备了独立引擎资源,再扩充数组并替换索引即可。

声音集的档位和资源选择可以分别调整。 当前配置用于验证登记与引用;实际制作时,素材与各档参数分别依据小型引擎和大型引擎的听感选择。

GearIn_engine_accelerate 采用相同结构,暂用开火文件作为可辨认的瞬时音。它与循环声音集分别登记,完整配置在下面给出。

登记市场音乐

音乐条目集中写进顶层的 music 分类,局部片段如下:

{
    "music": {
        "GearIn_market_music": [
            {
                "source": "sounds",
                "file": "GearIn_market_theme.ogg",
                "volume": 0.8,
                "pitch": 1
            }
        ]
    }
}

source 可以是资源目录,也可以是原版使用的音频归档。当前 source 为 sounds,file 为该目录内的文件名;两者组合后指向 sounds/GearIn_market_theme.ogg。音乐 ID 为 GearIn_market_music,实际文件可以保持不同名称,使用方通过这个 ID 取得曲目。

选择合并与替换范围

新增 ID 写入自有对象,游戏启动时与其他来源的 sounds.json 合并。当前只提交本节定义的内容,原版声音继续由原版提供。

需要替换整份配置时,在 mod_info.json 的 replace 数组中声明 data/config/sounds.json。路径逐字符一致后,该操作改变整份文件的读取范围,替换内容需要承担相关声音定义。当前新增声音使用普通合并即可。

完整最小例

保存到 data/config/sounds.json。已有文件时合入这些自有键,music 里的条目放进已有 music 对象。

{
    "GearIn_weapon_fire": [
        {
            "file": "sounds/GearIn_weapon_fire.ogg",
            "volume": 1,
            "pitch": 1
        }
    ],
    "GearIn_system_loop": [
        {
            "file": "sounds/GearIn_system_loop.ogg",
            "volume": 0.8,
            "pitch": 1
        }
    ],
    "GearIn_ui_feedback": [
        {
            "file": "sounds/GearIn_ui_feedback.ogg",
            "volume": 0.8,
            "pitch": 1
        }
    ],
    "GearIn_engine_loop": {
        "sounds": [
            {
                "file": "sounds/GearIn_system_loop.ogg",
                "pitch": 1,
                "volume": 1
            }
        ],
        "FIGHTER": {
            "sounds": [
                0
            ],
            "pitch": 1,
            "volume": 0.2
        },
        "FRIGATE": {
            "sounds": [
                0
            ],
            "pitch": 1,
            "volume": 0.3
        },
        "DESTROYER": {
            "sounds": [
                0
            ],
            "pitch": 1,
            "volume": 0.4
        },
        "CRUISER": {
            "sounds": [
                0
            ],
            "pitch": 1,
            "volume": 0.5
        },
        "CAPITAL_SHIP": {
            "sounds": [
                0
            ],
            "pitch": 1,
            "volume": 0.6
        }
    },
    "GearIn_engine_accelerate": {
        "sounds": [
            {
                "file": "sounds/GearIn_weapon_fire.ogg",
                "pitch": 1,
                "volume": 1
            }
        ],
        "FIGHTER": {
            "sounds": [
                0
            ],
            "pitch": 1,
            "volume": 0.2
        },
        "FRIGATE": {
            "sounds": [
                0
            ],
            "pitch": 1,
            "volume": 0.3
        },
        "DESTROYER": {
            "sounds": [
                0
            ],
            "pitch": 1,
            "volume": 0.4
        },
        "CRUISER": {
            "sounds": [
                0
            ],
            "pitch": 1,
            "volume": 0.5
        },
        "CAPITAL_SHIP": {
            "sounds": [
                0
            ],
            "pitch": 1,
            "volume": 0.6
        }
    },
    "music": {
        "GearIn_market_music": [
            {
                "source": "sounds",
                "file": "GearIn_market_theme.ogg",
                "volume": 0.8,
                "pitch": 1
            }
        ]
    }
}

验证方案

  1. 保存声音配置,确认上一节资源位于对应 file 或 source 目录。
  2. 重启游戏,检查 JSON 解析与声音资源加载记录。
  3. 核对普通音效、两套分档集和 music 分类中的 ID。
  4. 按下一节的具体接入播放声音,再调整某个条目的 volume,保存并重启比较。

预期结果:

  • 配置可读取,文件路径指向已准备的 Ogg 资源。
  • 普通音效和船体声音集位于顶层,音乐位于 music。
  • 使用方能按 ID 取得资源,volume 变化后采用新值。
  • 原版与其他自有条目继续按同路径合并读取。

故障分析

  • JSON 解析失败:对象、数组、字符串或逗号不完整。

    • 解决方案:按编辑器与日志检查错误位置,保存后重启。
  • 资源不存在:file 与 source 组合后的路径或大小写错误。

    • 解决方案:普通音效按相对 MOD 根目录核对,音乐按 source 目录与 file 核对。
  • 音乐条目没有播放:分类或 source 字段未对应音乐读取结构。

    • 解决方案:将 ID 登记在 music 对象中,补齐目录与文件。
  • 声音集分档不符:档位索引没有对应 sounds 数组资源。

    • 解决方案:从 0 开始核对索引和每档 pitch、volume。
  • 整文件替换范围不符:replace 路径不同或替换配置缺少相关定义。

    • 解决方案:核对目标路径与整份配置的实际职责。

总结

声音注册将 ID 连接到资源及播放参数。普通条目提供文件候选,分档集按船体等级选择资源与音量,音乐按 source 读取文件;三种结构分别供对应的使用方读取。

登记完成后,下一节写入对象引用并测试播放。资源、注册与播放分开核对,便能把没有声音的问题定位到相应位置。

建议参考项

  • data/config/sounds.json:原版音效、分档集与音乐结构。
  • mod_info.json:replace 整文件读取范围。
在 GitHub 上编辑此页
上次更新: 2026/10/14 12:25
贡献者: 1847905557
上一页
准备 OGG 音频资源
下一页
为游戏对象加入音频