🇨🇳 中文 (Chinese - China)
🇨🇳 中文 (Chinese - China)
外观
🇨🇳 中文 (Chinese - China)
🇨🇳 中文 (Chinese - China)
外观
This page is written for:
1.21
This page is written for:
1.21
你的音频文件需要转化为特定格式。 OGG Vorbis 是一种用于音频等多媒体数据的开放式容器格式,Minecraft 的声音文件就使用了这种格式。 为了避免 Minecraft 处理声音传播距离的问题,你的音频必须只有单声道(Mono)。
许多现代 DAW(数字音频工作站)软件都可以使用这种格式导入和导出。 在下面的例子中,我们将使用免费开源软件“Audacity”将音频文件转换成正确的格式,当然其他的 DAW 也可以做到。
在本例中,将哨声作为例子导入 Audacity。 这个声音目前保存为 .wav
文件,有两个音频通道(立体声)。 按照自己的需求编辑音频,并确保使用“音轨头”顶部的下拉元素删除其中一个音频通道。
导出或渲染音频文件时,请确认选择的是 OGG 文件格式。 有些 DAW(如 REAPER)可能支持多种 OGG 音频层格式。 在这种情况下,选择 OGG Vorbis 即可。
另外,记住,音频文件可能显著增加你的模组的大小。 如有必要,在编辑和导出文件时适量压缩音频本身,以尽量减小导出的文件大小。
要在你的模组中使用音频文件,要添加新的 resources/assets/<mod id here>/sounds
目录,并将导出的音频文件 metal_whistle.ogg
放入该目录中。
如果 resources/assets/<mod id here>/sounds.json
文件还未生成,继续创建该文件,并将你的音效添加到音效条目中。
{
"metal_whistle": {
"subtitle": "sound.fabric-docs-reference.metal_whistle",
"sounds": [
"fabric-docs-reference:metal_whistle"
]
}
}
字幕(subtitle)条目为玩家提供了更多的关于该声音的信息。 在 resources/assets/<mod id here>/lang
目录下的语言文件中会用到声音文件,如果游戏内字幕设置已打开且正在播放自定义声音,则会显示这个字幕。
要将自定义声音添加到模组中,请在实现了 ModInitializer
入口点的类中注册一个 SoundEvent。
Registry.register(Registries.SOUND_EVENT, Identifier.of(MOD_ID, "metal_whistle"),
SoundEvent.of(Identifier.of(MOD_ID, "metal_whistle")));
根据注册表项的数量,入口点类可能很快就会变得十分杂乱。 为了避免这种情况,我们可以使用一个新的辅助类。
在新创建的辅助类中添加两个新方法: 一个用于注册所有声音,一个用于初始化该类。 之后就可以根据需要,添加新的自定义 SoundEvent
常量了。
public class CustomSounds {
private CustomSounds() {
// private empty constructor to avoid accidental instantiation
}
// ITEM_METAL_WHISTLE is the name of the custom sound event
// and is called in the mod to use the custom sound
public static final SoundEvent ITEM_METAL_WHISTLE = registerSound("metal_whistle");
// actual registration of all the custom SoundEvents
private static SoundEvent registerSound(String id) {
Identifier identifier = Identifier.of(FabricDocsReferenceSounds.MOD_ID, id);
return Registry.register(Registries.SOUND_EVENT, identifier, SoundEvent.of(identifier));
}
// This static method starts class initialization, which then initializes
// the static class variables (e.g. ITEM_METAL_WHISTLE).
public static void initialize() {
FabricDocsReferenceSounds.LOGGER.info("Registering " + FabricDocsReferenceSounds.MOD_ID + " Sounds");
// Technically this method can stay empty, but some developers like to notify
// the console, that certain parts of the mod have been successfully initialized
}
}
如此,在实现了 ModInitializer
的入口点类中,只需调用一行即可注册所有的自定义 SoundEvents。
public class FabricDocsReferenceSounds implements ModInitializer {
public static final String MOD_ID = FabricDocsReference.MOD_ID;
public static final Logger LOGGER = FabricDocsReference.LOGGER;
@Override
public void onInitialize() {
// This is the basic registering. Use a new class for registering sounds
// instead, to keep the ModInitializer implementing class clean!
Registry.register(Registries.SOUND_EVENT, Identifier.of(MOD_ID, "metal_whistle"),
SoundEvent.of(Identifier.of(MOD_ID, "metal_whistle")));
// ... the cleaner approach.
// CustomSounds.initialize();
}
}
使用辅助类去访问自定义的 SoundEvent。 查看播放声音事件(SoundEvent)页面,了解如何播放声音。