第六十三章 游戏声音
(观前提示:此章有部分内容涉及到初中物理的知识)
在之前,我们已经大致了解了方块、实体、状态效果、粒子效果这四个在Minecraft中相当常见的四种东西,还学习了一部分基础的游戏运作机制。接下来,我们就要来看看不管是在Minecraft还是在其他游戏,都具有十分重要地位的东西——游戏声音。
在Minecraft中,游戏声音主要包括以下三类:
普通音效——由玩家、生物、物品、实体和方块发出的声音,如玩家破坏方块、鹦鹉学舌、武器损坏、射出的箭落地、熔炉工作。
环境音效——这并不是指背景音乐。一般来说,这是指在特定情况下才会播放的声音,所以才带有『环境』二字。比如你在挖矿时突然听到的怪声,那其实就是一个环境音效。关于这东西我们会在第一百五十章讲调试界面的Mood值时再次提到。
音乐——一般来说,指的是游戏背景音乐。(C418的音乐针不戳)
当然,如果要分类得更细一些,那就得按照Minecraft游戏中的分类,也就是你在设置界面中看到的那十类:主音量(master)、音乐(music)、唱片机/音符盒(record)、天气(weather)、方块(block)、敌对生物(hostile)、友好生物(neutral)、玩家(br /layer)、环境(ambient)、声音/语音(voice)。
你在Minecraft中听到的每个声音,肯定都包括有以下信息:
①声音名称(在sounds.json[JE]或sound_definitions.json[BE]中所规定的声音名称。下面会详细讲一下这东西怎么弄到。)
②声音类别(按照Minecraft内的分类来分)
③声音目标(这个声音给谁听,也就是能够被哪些玩家听到,是一个目标选择器或玩家名、UUID)
④声源位置(声音产生的地点,是一个坐标)
⑤音量(音量越大,声音可闻范围越大,是一个小数。下面会详细讲解这东西)
⑥音调(自己把物理书或乐理书拿出来翻一下看看,是一个小数。下面也会详细讲解这东西)
⑦最小音量(指定在声音可闻范围外的最小音量,是一个小数。下面也会详细讲解这东西)
其中,我们需要详细讲解的东西有四个:声音名称、音量、音调和最小音量。
——1.声音名称
在上面有提到,声音名称是在一个叫做sounds.json[Java版]或sound_definitions.json[基岩版]的文件中规定的。那么这个文件在哪呢?
想要找到这个文件可是个技术活,如果你嫌麻烦可以去看Minecraft Wiki,我们会在章末讨论如何找到这个东西。在此之前,你只需要在Minecraft Wiki上查找声音名称即可。
——2.音量
声音的音量在这里并不只是影响声音的响度。音量是一个≥0.0的小数(浮点数)。音量对声音的影响有两种情况:
①当0.0≤音量<1.0时
音量越小,声音响度会相对减轻,直到完全没有(0.0)。声音的球状可闻范围也会相应减小一些。
②当音量≥1.0时
声音响度会不变,但其可闻范围和音量大小的关系符合下面的函数关系式:
可闻范围(单位:米)=音量×16
比如音量为1.2时,该声音的可闻范围就是1.2×16=19.2米。
另外,我们还要了解一下声音的可闻范围:
声音的可闻范围是一个球体,其中心就是声源位置。越远离中心,声音的大小就会越小,直至无声。
——3.音调
音调是什么?物理学对音调的定义是:声音频率的高低叫做音调。在Minecraft中虽然有些不同,但也跟声音频率有关。
这个东西要深究起来非常复杂,在这里我们简简单单了解一下。
音调的值是个小数(浮点数),在Java版中是一个在0.0~2.0(含)范围内的数,其对声音的影响可以分为两种情况:
①当0.0≤音调<0.5
等同于音调值为0.5的情况
②当0.5≤音调≤2.0
音调越低,声音的频率越低,持续时间越长。
音调越高,声音的频率越高,持续时间越短。
音调等于1.0时,声音的频率和持续时间均为正常水平。
(如果你并不能很好理解上面的描述,那我就举个例子:当你在观看视频的时候,如果你加快播放速度,声音的波就会挤在一起,频率变高,使得视频的声音变得尖锐,而如果你放慢速度,声音的波反而会离得更开,频率变低,使得视频的声音变得低沉。当然,现在诸如B站之类的视频平台大多都对倍数播放添加了优化,使得视频变快或变慢不会影响到视频音调的改变,但你还是可以在诸如PR之类的视频剪辑软件中体验到这种效果)
(也就是说,从某种意义上来讲,这个音调的作用其实就是让你像看B站视频一样倍数播放声音,只不过没有优化声音频率的效果而已)
在基岩版中,其值并没有任何限制,但必须要在0.0至256.0(含)之间才能有效果。如果大于256.0,最终的情况相当于音调等于1.0的情况,也就是默认情况。如果小于等于0.0,声音将会不可听见。
值在0.0至256.0之间的效果类似于Java版在0.5和2.0之间的效果。
——4.最小音量
前面我们讲音量时提到了可闻范围,默认情况下声音会在可闻范围之外不可听见。为什么要说一个『默认情况』呢?因为默认情况下声音的最小音量的值是0.0。
上面我们了解过,声音的最小音量是指在声音可闻范围外的最小音量,是个小数(浮点数),默认为0.0,也就是不可听见。在基岩版中此值无限制,可正也可负,在Java版此值必须在0.0~1.0(含)之间。
……………
现在我们已经讲了很多,但了解这些东西有什么用呢?难不成我们可以用指令来控制游戏声音?
答案当然是能啦,不然我写这个章节干嘛?
Mojang为Minecraft添加了两条声音相关的指令:/br /laysound和/stobr /sound
/br /laysound
作用:播放一段声音
需要权限等级:Java-2,基岩-1
需要作弊:是
格式:
Java版
/br /laysound <声音名称><类别><目标:目标选择器>[声源位置:坐标][音量][音调][最小音量]
基岩版
/br /laysound <声音名称>[目标:目标选择器][声源位置:坐标][音量][音调][最小音量]
看起来这/br /laysound指令参数很多啊,但如果你仔细一瞧,就会发现这些参数我们上面都讲过了。
其中我们唯一要讲的就是『类别』这个参数。类别有哪些呢?让我们来看看前文是怎么说的:『声音类别(按照Minecraft内的分类来分)』
那么Minecraft内部对声音的分类有哪些?
其实已经写在了开头:『主音量(master)、音乐(music)、唱片机/音符盒(record)、天气(weather)、方块(block)、敌对生物(hostile)、友好生物(neutral)、玩家(br /layer)、环境(ambient)、声音/语音(voice)』
懂了吧,那么我们现在来看一个例子。
假设你要播放出洞穴的环境音效,该怎么办?
第一步,你需要打开Minecraft中文Wiki,搜索sounds.json,找到这个叫做sounds.json的条目(或者找到环境音效这个条目也可以)。第二步,往下拉找到数据值,根据你对应的游戏版本点击展开,往下滑并看着『声音事件』这一列,找到洞穴环境音效的声音事件名称(也就是声音名称),复制。第三步,在Minecraft里运行如下指令:
/br /laysound ambient.cave ambient @a ~~~ 1.0 1.0 0.0 ——Java
/br /laysound ambient.cave @a ~~~ 1.0 1.0 0.0 ——基岩
然后你就听到了和你在洞穴里听到的一模一样的声音。但是如果你多次播放就会发现一个问题:怎么每次播放都是不同的声音啊?
其实一个声音名称对应的不只是一个声音文件,像是ambient.cave这个名称对应的就有19个声音文件。游戏在播放ambient.cave这个声音时其实会在这19个声音中点兵点将点到谁就播放谁,播放的具体是哪个其实完全是随机的。当然,虽然说是随机,但游戏也有规定权重在其中,哪个声音文件权重大就有更高几率抽到那个声音。
/br /laysound是播放声音,相对应就还有一个/stobr /sound用来停止播放声音。
/stobr /sound
作用:停止声音播放。
需要权限等级:Java-2,基岩-1
需要作弊:是(Java版不需要)
格式:
Java
/stobr /sound <玩家:目标选择器>[声音类别][声音名称]
基岩
/stobr /sound <玩家:目标选择器>[声音名称]
玩家这个参数在这边用于指定要停止谁的声音,也就是让谁听不到声音。
如果仅仅指定了玩家,将会停止该玩家所听到的所有(游戏中的)声音,也就是让这个玩家的耳朵突然安静下来。你也可以额外指定声音类别和声音名称两个参数,来指定具体要停止什么声音。
举个例子:
/stobr /sound @a block entity.tnt.br /rimed ——Java
/stobr /sound @a random.fuse ——基岩
这两条指令都将会停止TNT嘶嘶作响的声音。
看起来上面的指令没有丝毫的问题,但仅仅是看起来而已。
如果我们不知道entity.tnt.br /rimed属于哪个声音类别怎么办?毕竟Wiki上可没有标出这个的类别。
答案很简单,我们只需要:
/stobr /sound @a * entity.tnt.br /rimed
不去管就行了!管它干什么?!多管闲事啊?浪费精力又浪费时间。
当你不知道也懒得知道你要停止的声音的类别是什么的时候,可以直接选择填写星号来全选全部声音类别。可惜的是,这个版本在低版本行不通(1.12.2就没有这东西,还得老老实实找类别)。
现在我们已经基本上了解得差不多了,如果你认为可以了就前往下一章或去干其他事情吧,接下来我们将会讨论:如何找到那该死的sounds.json。
对于Java版,我们首先需要来到Minecraft的根目录,也就是找到.minecraft文件夹。对于非官方启动器来说,一般它和启动器位于同一个目录下;对于官方启动器来说,不同系统的情况不一样:
Windows:系统盘\用户(User)\你的用户名\Abr /br /Data(这是个隐藏文件夹)\Roaming\.minecraft\
Mac OS:系统盘/用户(User)/你的用户名/资源库(Library)/Abr /br /lication Subr /br /ort/minecraft/
Linux:系统盘/你的用户名/.minecraft/
注:在Mac OS中,你默认是看不到资源库(Library)这个文件夹的。这时候你就要确保此时访达正选择你的用户文件夹,然后点击左上方的前往→前往文件夹,然后在跳出的窗口中输入『资源库』或『Library』三个字,就可以临时显示出这个文件夹了。
然后,我们需要来到如下的位置:
.minecraft/assets/indexes/或minecraft/assets/indexes/
在这里,你会发现一堆名称是.json的文件。这是什么东西呢?
你不用管他,也不需要管它是什么东西,用记事本或文本编辑打开你需要的版本即可。打开后,使用Ctrl+F或Command⌘+F开启查找模式,然后输入sounds.json,你就会找到一个唯一的结果:“minecraft/sounds.json“:{“hash“:“xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx“,“size“: xxxxxx}
是不是感觉这似乎在哪里见过?其实这就是JSON,和之前讲过的JSON文本的格式是一模一样的。
接下来,你需要将hash的值复制下来,然后来到如下文件夹:
.minecraft/assets/objects/或minecraft/assets/objects/
你会看到一大堆不明意义的文件夹,不用担心,直接使用搜素功能,搜索你刚刚复制的内容,稍等片刻,你就会找到一个文件名和你复制内容一模一样的文件。虽然它没有后缀名,但其实它就是我们要找的sounds.json文件。右击使用记事本或文本编辑打开它,如果你找对的话,你就会看到开头写着:
{
“ambient.cave“:{
“sounds“:[
“ambient/cave/cave1“,
“ambient/cave/cave2“,
…….
如果你的访达或文件管理器迟迟找不到文件,那也别担心,你只需要看看你复制内容的开头两个字符,然后找到相对应的文件夹。比如开头是『97』就找叫做97的文件夹,找到后,你再仔细翻一翻就可以找到了。
sounds.json的JSON结构大致是这样的:
{“声音名称”:{“声音文件”:[声音文件列表],”声音字幕本地化键名”:”一个本地化键名”},……}
懂了吧?当然,sounds.json只是在1.7.2版本后才被弄到如此离谱的地方。在1.7.2版本,sounds.json很好找,它就在这里:
.minecraft/ assets/或.minecraft /virtual/legacy/
而且文件名就叫sounds.json
如果你同时安装了1.7.2和更新的版本,那么两类sounds.json文件都将会同时存在。
(那对于比1.7.2更老的版本呢?)
(根本不用找,因为没有sounds.json。这东西是在1.7.2才被添加进来的)
另外,对于Java版的资源包来说,其也有sounds.json文件,就在资源包的/assets/<命名空间>/下,且就叫sounds.json。
sounds.json找到了,那么基岩版的sound_definitions.json在哪呢?
很好找……….个屁!但至少没有那么多弯弯绕绕的。
对于Windows10版本来说,你需要找到:
系统盘:\Program Files\WindowsAbr /br /s\Microsoft.MinecraftUWP_应用版本号_x64__8wekyb3d8bbwe\data\resource_br /acks
打开resource_br /acks,你会发现里面有一大堆叫做vanilla_<游戏版本>的文件夹。不用管这些,你只需要找到没有后缀的『vanilla』文件夹,点进去,再找到sounds文件夹,再向下滑,就是sound_definitions.json文件了。整个目录下来是这样的:
C:\Program Files\WindowsAbr /br /s\Microsoft.MinecraftUWP_应用版本号_x64__8wekyb3d8bbwe\data\resource_br /acks\vanilla\sounds\sound_definitions.json
对于Android版本来说,最简单的办法是安装一个MT管理器,然后将你手机上的Minecraft打包成安装程序abr /k文件,然后再使用MT管理器通过zibr /视图打开,再打开sbr /lit_install_br /ack.abr /k,来到assets/resource_br /acks/vanilla/sounds,就可以找到sound_definitions.json了。
对于IOS和其他版本来说…….抱歉,我不清楚。
现在我们两个文件都找到了,本章也就到此结束。
历史
Java
1.6.1——加入了/br /laysound
1.7.2——加入了sounds.json
1.9——/br /laysound支持Tab自动补全了,并开始要求使用source参数。更改了许多声音名称。
1.9.3——加入了/stobr /sound
携带版
1.0.4——加入了sound_definitons.json
1.0.5——加入了/stobr /sound和/br /laysound