Skip to content

声音系统

本页面镜像自
BedrockWiki

根据原始项目协议授权。本文经过AI翻译处理,如有内容遗漏,可以提交PR进行补充。

在基岩版中,我们可以通过资源包添加自定义声音而无需覆盖原版音效。以下是实现方法:

TIP

学习声音系统的最佳方式是下载并研究默认资源包的结构。

文件夹结构

添加声音时主要需要修改两个文件。注意sound_definition文件需要放置在sounds文件夹内。

声音文件本身存放在sounds文件夹中,支持以下格式:

📁RP
📝sounds.json
📁sounds
📝sound_definitions.json
🔊example.wav
🔊example.ogg
🔊example.fsb

sound_definitions.json

此文件用于定义声音的短名称(short-name),相当于为物理声音文件创建ID标识。以下示例添加了名为example.toot的小号音效:

json
{
	"format_version": "1.14.0",
	"sound_definitions": {
		"example.toot": {
			"category": "neutral",
			"sounds": ["sounds/trumpet"]
		}
	}
}

通过此方式添加的声音可通过/playsound命令触发。注意命令输入需严格匹配名称。

WARNING

新增声音文件需要完全重启客户端才能生效。若音效未正常加载,请重启整个游戏而非仅重载世界。

/playsound 音量说明

游戏会将音量参数限制在1.0以内,再与声音定义中的音量相乘。

声音的最大可听距离计算公式为:min(max_distance, max(volume * 16, 16)) 若未在定义中设置max_distance,则等效于playsound_volume * 16

以下是声音随距离衰减的近似曲线(实际衰减可能非线性):

上图展示了当playsound音量参数≥1时的衰减曲线。注意<volume>参数会影响声音的可听范围。

公式表达为:final_volume = min(playsound_volume, 1) * graph_volume * sound_definition_volume

注意: 距离衰减曲线不受命令中音量参数影响。

例如:mob.ghast.affectionate_scream设置了"min_distance": 100.0,但使用/playsound音量1时最大可听距离仍为16格。若需增大范围,可通过设置更高的音量参数。

要实现远距离可听且线性衰减的效果,可在定义中设置"volume": 0.01,并在命令中使用大音量值(如4对应64格范围)。

顶级参数

类别(Categories)

控制声音播放方式的核心参数:

类别说明
weather天气音效
block方块交互音效
bucket桶类音效
bottle玻璃瓶音效
ui界面音效(无视距离限制)
player玩家相关音效
hostile敌对生物音效
music背景音乐
record唱片机音效
neutral中立生物音效

min_distance

声音开始衰减的最小距离(浮点数),默认0.0

max_distance

声音衰减至最弱的最大距离(浮点数)

声音定义进阶

可通过数组定义多个随机音效:

json
{
	"format_version": "1.14.0",
	"sound_definitions": {
		"example.toot": {
			"category": "neutral",
			"sounds": [
				"sounds/trumpet",
				"sounds/trumpet2",
				"sounds/trumpet3"
			]
		}
	}
}

对象式定义参数

参数说明
name文件路径(例:"sounds/music/game/creative/creative1")
stream启用流式加载(降低内存占用)
volume音量(0.0-1.0,可超过1.0)
load_on_low_memory已弃用(1.16.0+)
pitch音高倍数(例:2.3=2.3倍速播放)
is3D是否启用3D音效(音乐/UI类自动禁用)
interruptible是否可被中断(默认true)
weight随机权重(例:权重10的选中概率是权重2的5倍)

完整示例

json
"block.beehive.drip": {
    "category": "block",
    "max_distance": 8,
    "sounds": [
        {
            "name": "sounds/block/beehive/drip1",
            "load_on_low_memory": true
        },
        "sounds/block/beehive/drip2",
        "sounds/block/beehive/drip3",
        "sounds/block/beehive/drip4"
    ]
}

sounds.json

此文件用于绑定自动播放的音效:

分类说明
individual_event_sounds独立事件音效(如信标激活)
block_sounds方块交互音效
entity_sounds实体音效(含自定义实体)
interactive_sounds交互音效(开发中)

实体音效事件

常见生命周期事件:

事件触发时机
ambient随机播放(如生物低鸣)
hurt受伤时
death死亡时
step移动时
fall.big高空坠落
fall.small低处跌落
splash溅水
attack近战攻击
shoot远程射击

实体音效示例

json
{
	"entity_sounds": {
		"entities": {
			"wiki:elephant": {
				"volume": 1,
				"pitch": [0.9, 1.0],
				"events": {
					"step": {
						"sound": "elephant.step",
						"volume": 0.18,
						"pitch": 1.1
					},
					"ambient": {
						"sound": "elephant.trumpet",
						"volume": 0.11,
						"pitch": 0.9
					}
				}
			}
		}
	}
}

动画音效绑定

通过RP实体文件中的sound_effects实现动画同步:

json
"sound_effects": {
    "wing_flap": "wiki.dragon.wing_flap" // wiki.dragon.wing_flap需在sound_definitions中定义
}
json
"sound_effects": {
    "3.16": {
        "effect": "wing_flap"
    }
}

动画控制器音效

动画控制器中的音效触发方式类似:

json
"sound_effects": {
    "explosion": "wiki.custom_tnt.explosion" // 需在sound_definitions中定义
}
json
"states":{
    "default":{
        "transitions":[
            {
                "explode_state":"q.mark_variant == 1"
            }
        ]
    },
    "explode_state":{
        "sound_effects":[
            {
                "effect":"explosion"
            }
        ],
        "transitions":[
            {
                "default":"q.mark_variant == 0"
            }
        ]
    }
}