教程:制作资源包/音效和音乐

来自Minecraft Wiki
跳转到导航 跳转到搜索
本文章所述内容仅适用于Java版
此教程已确认至少适用于Java版1.20.6

请帮助我们检查该内容是否仍在最新版本有效。

本页面介绍了通过资源包修改和添加音乐、音效的办法。

音效和音乐概要[编辑 | 编辑源代码]

音效音乐是在游戏中播放的声音。音效是由游戏内特定操作产生的声音;音乐是由游戏自动播放,或根据环境选择播放的声音。

游戏中的所有声音都是通过声音事件定义文件控制的。该文件记录了游戏内用于播放声音的所有声音事件,以及每个声音事件所关联的所有声音文件和相关属性。该文件放置在assets/minecraft/sounds.json处。

声音文件是储存游戏所播放的具体声音的文件。这些文件的格式为.ogg。然而,游戏自带的声音文件并不储存在minecraft.jar中,而是在游戏自动下载的资源文件中。查询这些文件的办法将会在后文介绍。

在资源包中,所有声音文件都放置在assets/<命名空间>/sounds

修改已有的音效或音乐[编辑 | 编辑源代码]

如前所述,声音文件有着特殊的放置位置,因此其查询也需要特殊的技巧。也正因此,声音文件在资源包中的放置位置与内带资源的位置不同。下面将简单介绍内置声音文件的位置与获取方法,再讲解修改声音的方法。

查询内置声音[编辑 | 编辑源代码]

游戏内置的声音文件和sounds.json是每次游戏启动时从Mojang服务器下载的。这类文件放置在.minecraft/assets/objects下,按照这些文件的散列值命名。此外,在.minecraft/assets/indexes下放置着资源索引文件,用于根据文件的资源路径查询散列值。

资源索引文件

资源索引文件是放置在.minecraft/assets/indexes下的若干个.json文件,存储了游戏不同版本的资源文件的散列值和大小。在1.19以前,这些文件按照版本的主版本号命名;1.20以后,这些文件改为用单增的数字命名,这些数字与游戏版本间没有明显的关系。

为确定1.20以后资源索引文件与游戏版本间的对应关系,可以查阅散列资源文件 § 索引名称,或在client.json中的字符串assetIndex.id处确定该版本资源索引文件的名称(不含后缀名)。[注 1]

资源索引文件的格式如下:

  • NBT复合标签/JSON对象根标签
    • NBT复合标签/JSON对象objects:该索引中,需从Mojang服务器下载的所有资源文件。
      • NBT复合标签/JSON对象<资源路径>:单个资源文件。
        • 字符串hash:该文件的散列值。
        • 整型size:该文件的大小。

其中,最重要的是<资源路径>字符串hash;前者用于确定文件在资源包中的位置,后者是该文件的散列值,用于确定文件在.minecraft/assets/objects中的位置。

查阅时,事先并不明确资源路径的具体值。可以在wiki上查找,或者先查阅放置在minecraft/sounds内的文件,再进一步筛选;也可先获取minecraft/sounds.json,再在其中查阅声音文件的路径。

内置声音文件

游戏从Mojang服务器下载的文件全部放置在.minecraft/assets/objects中。该文件夹下放置了若干文件夹,每个文件夹中都有若干无后缀名的文件。

每份下载的文件依据其散列值,放置在.minecraft/assets/objects/<散列值的前两位>/<散列值>处。[注 2]

注意:这些文件是没有拓展名的!可以复制一份文件,并补充正确的拓展名,以便后续使用。

  1. 例如,1.20.6版本的资源索引文件的名称为16.json
  2. 例如,1.20.6版本的sounds.json的散列值为5c976a314d4df33a119059ec2e05b3c4ba01021b,该文件即放置在.minecraft/assets/objects/5c/5c976a314d4df33a119059ec2e05b3c4ba01021b处。

修改声音[编辑 | 编辑源代码]

上一步已经获取了游戏内置的声音文件;现在,可以对这一文件做任意的修改,或直接从头制作声音。这一步需要使用音轨编辑器。得到的文件必须是.ogg格式

编辑完成后,需要将该文件放置在资源包中。在资源包中,声音文件放置在上一步确定的资源路径所指示的位置。不必也不应修改.minecraft/assets/objects中的文件,因为这些文件在游戏启动时可能会因重新下载而被覆盖。

在这一步,声音文件必须严格按照已有文件的路径命名,才能覆盖原文件,被游戏正常读取。如果名称不同,需要修改其他文件,才能使此声音文件被正常读取;这是§ 添加新的音效或音乐的内容。

添加新的音效或音乐[编辑 | 编辑源代码]

游戏中所有声音的播放是由sounds.json控制的。要想增删播放的声音,必须更改这一文件。

该文件记录的是声音事件声音文件的关系。每个声音事件可以关联一个或多个声音文件;若有多个声音文件,每次声音事件将会随机选择一则声音播放。此外,声音事件还可以和字幕关联;这方面的内容参见§ 修改或添加声音的字幕

声音事件是游戏引用声音的符号。资源包无法修改游戏中各行为调用的声音事件的名称,即使添加了新的声音事件,也需要通过命令或进行其他修改才能调用这些事件。相反,只要与已有的声音事件相关联,可以任意增删声音文件。

下面以添加玩家受伤音效为例,介绍添加音效的流程。

声音文件[编辑 | 编辑源代码]

使用音轨编辑器或其他编辑器,创建一个.ogg文件,其中包含所需添加的玩家受伤音效。

编辑完成后,该文件需要放置在资源包中。由于所修改的声音事件在minecraft命名空间下,此声音文件必须放置在assets/minecraft/sounds下。在该文件夹中,建议将文件放置在与其他文件统一的位置。本教程中,该文件放置在assets/minecraft/sounds/damage/hit4.ogghit1hit3是游戏内置的音效。

sounds.json[编辑 | 编辑源代码]

由于所修改的声音事件在minecraft命名空间下,这里的sounds.json必须放置在assets/minecraft下。

在填写该文件前,先要找到对应的声音事件的名称。这一内容可在各个实体、方块及物品的音效章节找到。例如,玩家受伤时的声音事件为entity.player.hurt

创建assets/minecraft/sounds.json,填写以下内容:

{
  "entity.player.hurt": {
    "sounds": [
      "damage/hit4"
    ]
  }
}

该文件中,NBT列表/JSON数组sounds表示与该事件关联的声音文件,是从assets/minecraft/sounds算起的相对位置。除非设置布尔型replacetrue,该列表会补充到游戏自带的列表中,而非覆盖相应列表;因此,这里只需要填写新增的文件即可。

这里使用了字符串字符串定义声音文件。如需要更精细的参数,可以使用一个NBT复合标签/JSON对象复合标签定义声音文件。

注意:本文件使用JSON格式。若文件中缺少特定的格式标记符,资源包可能无法被识别。

作为参考,游戏内对entity.player.hurt事件的定义如下:

{
  "entity.player.hurt": {
    "sounds": [
      "damage/hit1",
      "damage/hit2",
      "damage/hit3"
    ],
    "subtitle": "subtitles.entity.player.hurt"
  }
}

修改或添加声音的字幕[编辑 | 编辑源代码]

如前所述,sounds.json中的声音事件可以与字幕相关联。这是通过字符串subtitle字段定义的。该字段包含一个由本地化键名定义的可翻译字符串。

如果需要为声音事件添加字幕,需要编辑sounds.json,以添加事件与字幕的关联;然而,如需修改已有的字幕,则不应在此修改,而是修改本地化键对应的本地化文本。

测试声音[编辑 | 编辑源代码]

与其他内容不同,要在游戏中控制某声音的产生未必方便。可以使用/playsound触发特定声音事件,但无法控制播放该声音事件下的哪一个声音。因此,可能需要多次执行该命令,直到游戏播放所改动的声音文件。

导航[编辑 | 编辑源代码]