Files
netease-modsdk-wiki/docs/mcguide/20-玩法开发/15-自定义游戏内容/8-自定义音乐.md
2025-03-18 14:46:12 +08:00

260 lines
9.1 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
front:
hard: 入门
time: 分钟
---
# 自定义音乐
## MC音频管理介绍
### 音频引擎
MC内置音频管理使用的是业界著名音频引擎 [FMOD](https://www.fmod.com/)MC中音频管理主要是通过 **SoundSystemFMOD** 类对FMOD的API进行封装和调用。
### 游戏音频
#### 音频定义
在MC游戏中音频资源文件定义在`data\resource_packs\vanilla\sounds`目录下的 *music_definitions.json**sound_definitions.json* 中。
- *music_definitions.json*:定义了触发音乐的事件名和延迟信息
- *sound_definitions.json*定义了具体的音频内容其中category字段设置改音乐的分类情况
#### *sound_definitions.json*单项介绍
```json
"record.13": {
"max_distance": 64.0,
"sounds": [
{
"name": "sounds/music/game/records/13",
"stream": true,
"volume": 0.5,
"load_on_low_memory": true
}
]
},
//...
"music.game.endboss": {
"category": "music",
"sounds": [
{
"name": "sounds/music/game/end/boss",
"stream": true,
"volume": 0.3,
"load_on_low_memory": true
}
]
},
```
如代码所示,每个音乐项目可以有多个字段组成:
- category音乐的分类同时可以作音频文件分类的文件夹目录
- ui是否为UI分类
- music是否为歌曲分类
- weather 等其他各种分类值
- min_distance最小距离当选择在某个地点播放音乐时触发音乐播放的最近距离
- max_distance最大距离同上触发音乐播放的最大距离
- sounds播放的音乐数组定义
- name音乐文件名称
- stream是否为流式文件设置为true时可以减小内存占用但该音频文件同一时间内只允许播放一个建议较大的BGM音频使用。
- volume声量大小
- load_on_low_memory是否在低内存占用情况下加载
#### *music_definitions.json*单项介绍
```json
{
"creative" : {//播放背景音乐的场景这里的creative代表在创造模式下播放
"event_name" : "music.game.creative",//触发播放音乐的事件名称
"max_delay" : 180,
"min_delay" : 60
},
//...其他定义
//...其他定义
"endboss" : {
"event_name" : "music.game.endboss",
"max_delay" : 180,
"min_delay" : 60
},
```
如代码所示该json文件用于指定某些固定场景下播放的游戏背景音乐包括如下字段
- event_name触发播放对应音乐的事件名称,即sound_definitions.json中每个音效定义项的键名如上文中的music.game.endboss支持填写自定义的键名
- max_delay触发该音乐播放事件时的最大延迟
- min_delay触发该音乐播放事件的最小延迟
- 此json文件支持填写的键名如代码中的creative和endboss由MC游戏固定不支持自定义目前版本支持填写的键名如下
| 键名 | 含义 |
| --------------- | ---------- |
| creative | 创造模式 |
| credits | 终末之诗 |
| crimson_forest | 绯红森林 |
| dripstone_caves | 溶洞 |
| end | 末地 |
| endboss | 末影龙 |
| frozen_peaks | 冰封山峰 |
| game | 常规游戏 |
| grove | 雪地 |
| hell | 下界荒地 |
| jagged_peaks | 尖峭山峰 |
| lush_caves | 繁茂洞穴 |
| meadow | 草甸 |
| menu | 主菜单 |
| nether | 下界 |
| snowy_slopes | 积雪的山坡 |
| soulsand_valley | 灵魂沙峡谷 |
| stony_peaks | 裸岩山峰 |
| water | 水下 |
#### 音频播放时机
Minecraft包含由C418创作的音乐。这些音乐在游戏的各个地方播放包括主菜单、创造模式、下界以及在创作人员列表中。在基岩版中音乐被归类为DLC [官方wiki](https://zh.minecraft.wiki/w/音乐?variant=zh)。
同时使用物品也能发出声音:
- [唱片机](https://zh.minecraft.wiki/w/%E5%94%B1%E7%89%87%E6%9C%BA):播发游戏中所有可用的音乐唱片
- [音乐盒](https://zh.minecraft.wiki/w/%E9%9F%B3%E7%AC%A6%E7%9B%92)接收红石信号后发声音乐盒发出的声音取决于音乐盒下面的方块材料每次使用音符盒都会让其下一个发出音符的音高提高半阶。按照十二平均律每个乐器有两个八度24个半音的音域可供选择。
## MOD自定义音频设置
在Mod中使用自定义音频一共有三种方式addon 数据驱动 、 Mod SDK接口 和music指令。三种方式均需要在 Mod中添加对应的自定义音效资源配置。
### 音频资源设置
1. `resource`目录下创建`sounds`文件夹
2. 新增`sound_definitions.json`
- 修改/新增一项音效资源
参照MC游戏内置资源目录下的同名文件设置设置对应情形下的音频文件内容。例如
```json
{
"music.game.creative": {
"category": "music",
"sounds": [
{
"name": "sounds/music/game/creative/1",
"stream": true,
"volume": 0.1,
"load_on_low_memory": true
}
]
}
}
```
> 上述代码设置了创造模式下的BGM内容。该方式适合开发者想要继承原版游戏内音乐播放时机且想改变音乐内容时不需要额外设置代码。
- 动态加载设置:
当开发者使用ModSDK接口播放音乐时详见<a href="../../../mcdocs/1-ModAPI/接口/音效.html##playcustommusic" rel="noopenner"> PlayCustomMusic接口 </a>),我们建议使用 `dy_load_list` 字段设置需要播放音乐(详见下面的[音频动态加载设置](#音频动态加载设置)),因为这种情况下只有用到该音乐才会加载和播放,减小内存压力。
3. 上一步json中新增定义中的目录下添加对应的音乐资源文件。
例如:`sounds\music\game\`中增加1.ogg文件
**注意**:当前版本音乐文件支持的格式为 `.ogg` ,常用 mp3 格式并不支持。
### 播放设置
1. Mod SDK接口播放使用Mod SDK接口可以控制音乐的播放,简要介绍如下详细内容可以查看MOD SDK中 customAudio 组件接口详细介绍
> DisableOriginMusic 屏蔽原生音乐
> PlayGlobalCustomMusic 播放全局自定义背景音乐,优先级最高
> PlayCustomMusic 指定位置播放音乐
2. Music指令播放可通过MC原生的music指令调用音效详见[音乐指令Wiki](https://zh.minecraft.wiki/w/%E5%91%BD%E4%BB%A4/music)music指令支持sound_definitions.json中定义的所有音效包括原生音效键和自定义的音效键如music.game.custom1。
### 音频动态加载设置
音频默认为启动时全部加载当mod的音频资源较多时建议控制启动时加载音频的数量。
控制方式如本文介绍的`sound_definitions.json`所示在json文件中添加key值 *dy_load_list*对应的value为list。该list中记录的sound在游戏启动的时候默认不加载只有在用到的时候才会加载。可有效抑制由于音频资源占用内存过多造成的启动时的崩溃。
```json
{
"dy_load_list":[
"sounds/music/game/creative/1",
"sounds/customSound/2",
"sounds/customSound/3",
"sounds/customSound/4",
"sounds/customSound/5"
],
# other code
```
当前引擎已经支持音频的**LRU管理**(一种内存管理算法),所以当音频资源较多的时候,引擎会动态控制音频占用的内存资源。
## 示例DEMO介绍
示例demo为[customMusicDemo](../13-模组SDK编程/60-Demo示例.md#customMusicDemo)主要展示当前自定义音乐的两种设置形式数据驱动的addon形式和mod sdk接口调用形式。其中接口调用有两种方法一个是全局唯一BGM的 播放,一个是指定位置音效的播放。
### 替换BGM
在``sound_definitions.json`mod替换了原版创造模式下的BGM
```json
"music.game.creative": {
"category": "music",
"sounds": [
{
"name": "sounds/music/game/creative/1",
"stream": true,
"volume": 0.1,
"load_on_low_memory": true
}
]
},
```
### 根据位置变化切换BGM
DEMO中玩家如果进入
> self.global0Area =[(0,0), (5,5)] # 即最小点的xz坐标为(0,0),最大点为(5,5)的矩形区域
> self.global1Area =[(-5,-5), (0,0)]
两个区域,会调用`PlayGlobalCustomMusic`播放对应的BGM在调用此函数之前需要调用`DisableOriginMusic`停止播放内置的BGM。
### 指定地点播放音乐
当玩家接近如下的圆形区域时
> self.campPoint = (20,4,20)
>
> self.campRadius = 5
会调用`PlayCustomMusic`在营地播放对应的音乐,该音乐的定义如下
```json
"music.custom": {
"min_distance": 0.0,
"max_distance": 5.0,
"sounds": [
{
"name": "sounds/customSound/4",
"pitch": 1,
"volume": 1,
"load_on_low_memory": true,
"stream": true
}
]
}
```
可以指定因为的最小和最大播放范围此时的音乐是3d效果根据距离的远近音量发生变化