Skip to main content
Version: 1.20.x

音效定义生成

通过子类化SoundDefinitionsProvider并实现#registerSounds,可以为模组生成sounds.json文件。实现后,必须将提供者添加DataGenerator中。

// 在模组事件总线上
@SubscribeEvent
public void gatherData(GatherDataEvent event) {
event.getGenerator().addProvider(
// 告诉生成器仅在生成客户端资源时运行
event.includeClient(),
output -> new MySoundDefinitionsProvider(output, MOD_ID, event.getExistingFileHelper())
);
}

添加一个音效

可以通过#add指定音效名称和定义来生成音效定义。音效名称可以从SoundEventResourceLocation或字符串中提供。

!!! 警告 提供的音效名称将始终假定命名空间是提供给提供者的构造函数的mod id。没有对音效名称的命名空间执行验证!

SoundDefinition

可以使用#definition创建SoundDefinition。定义包含用于定义音效实例的数据。

定义指定了一些方法:

方法描述
with添加选择定义时可能播放的音效。
subtitle设置定义的翻译键。
replace当为true时,将删除其他sounds.json为该定义定义的音效,而不是附加到该定义。

SoundDefinition$Sound

提供给SoundDefinition的音效可以使用SoundDefinitionsProvider#sound指定。这些方法采用音效的引用和SoundType(如果已指定)。

SoundType可以是两个值之一:

音效类型定义
SOUND指定位于assets/<namespace>/sounds/<path>.ogg的音效的一个引用。
EVENT指定由sounds.json定义的另一个音效的名称的引用。

SoundDefinitionsProvider#sound创建的每个Sound都可以指定关于如何加载和播放所提供音效的其他配置:

方法描述
volume设置音效的音量大小,必须大于0
pitch设置音效的音高大小,必须大于0
weight设置音效被选定时播放音效的可能性。
stream当为true时,从文件中读取音效,而不是将音效加载到内存中。推荐用于长音效:背景音乐、音乐唱片等。
attenuationDistance设置可以听到音效的所距离的方块数。
preload当为true时,一旦加载资源包,就会立即将音效加载到内存中。
// 在某个SoundDefinitionsProvider#registerSounds中
this.add(EXAMPLE_SOUND_EVENT, definition()
.subtitle("sound.examplemod.example_sound") // 设置翻译键
.with(
sound(new ResourceLocation(MODID, "example_sound_1")) // 设置第一个音效
.weight(4) // 具有4 / 5 = 80%的播放机率
.volume(0.5), // 将调用此音效的所有音量缩放一半
sound(new ResourceLocation(MODID, "example_sound_2")) // 设置第二个音效
.stream() // 流播该音效
)
);

this.add(EXAMPLE_SOUND_EVENT_2, definition()
.subtitle("sound.examplemod.example_sound") // 设置翻译键
.with(
sound(EXAMPLE_SOUND_EVENT.getLocation(), SoundType.EVENT) // 从'EXAMPLE_SOUND_EVENT'添加音效
.pitch(0.5) // 将调用此音效的所有音高缩放一半
)
);