1. 先搞清楚音量控制到底在控制什么Scratch里做声音相关项目第一步就该把“音量”这件事想明白。很多初学者一上来就拖一个“将音量设为”的积木发现声音没变化或者变化得不是自己想要的就开始怀疑是不是软件坏了。其实不是多半是没弄明白Scratch声音系统里几组概念的区别。在Scratch的“声音”模块里音量相关积木一共就那几个“将音量设为”、“音量增加”、“音量”这是一个获取当前音量值的积木以及藏在“侦测”模块里的**“响度”**。后面这个“响度”虽然不在声音模块里但它和音量控制是天生一对很多声控交互项目全靠它撑起来。先说“音量”本身。Scratch里每个角色都有自己的音量属性范围是0到100默认是100。这个数值是一个全局属性不是某个声音文件的属性。也就是说当你给一个角色设置了音量这个角色播放任何声音都会按这个音量来放。反过来如果你在某个角色里设置音量它会影响的是这个角色的声音输出而不是整个舞台的音量这一点一定要分清楚。我见过不少老师在上课时直接在某个角色里放“将音量设为50”然后发现另一个角色的声音还是那么大就以为程序没生效。其实逻辑没错只是作用范围理解错了。要控制全局音量最简单的方式是让“舞台”这个特殊的角色来设置因为舞台是全局的它的音量会影响所有角色的声音输出。不过在大多数项目中我们更习惯把音量控制放在具体的角色上因为这样更灵活可以做出“近大远小”之类的层次感。接下来是最关键的一个认知音量控制和声音文件本身的音量是两层关系。Scratch里“将音量设为”控制的是播放时的输出大小而不是修改声音文件本身。如果一个声音文件录制的时候就已经很小声了那哪怕你把音量设为100它听起来依然很小。这时候需要的是在“声音”选项卡里对声音文件做处理比如用编辑器里的“响度”效果去放大而不是靠代码层面的音量积木去硬扛。用生活里的例子来解释声音文件本身的音量就像你手机里存的一张照片的像素而Scratch里的音量积木就像你在手机上把这张照片放大缩小来观看放大缩小不会改变照片本身的像素。如果你原图很模糊再怎么放大还是模糊。音量同理源文件声音小后面放大效果也有限而且放得太大还会失真。理解了这一层再去做音量控制的项目才不会一上来就走弯路。很多看似不合理的问题追根究底都是这个概念没打通。2. 音量积木逐个拆解这几个积木各有各的脾气2.1 “将音量设为”最直白但最容易被误用的积木“将音量设为”接受一个数值参数可以是数字也可以是某个变量的值。参数范围是0到100但实际测试中哪怕你填超过100的数字Scratch也不会报错只是会按100来处理——超过的部分不会额外放大。这一点在拖动积木滑块时尤其明显滑块最多拉到100但如果你手动输入200它不会报错音量也不会变得更大可能只是显示上出现了超过100的值但实际播放时封顶在100。这里有一个很多教程不会提的细节“将音量设为”不是渐变的它是瞬间跳变。如果你在一个循环里让它连续执行比如“重复执行10次每次将音量设为i”因为循环速度极快你听感上会觉得音量是跳上去的而不是平滑过渡。要实现平滑的音量渐变不能光靠这个积木本身要么用“音量增加”配合等待时间要么用变量来控制目标音量每帧循环逼近。后面我会专门讲渐变怎么实现。2.2 “音量增加”渐变效果的核心原料“音量增加”是在当前音量的基础上做增减。比如当前音量是50执行“音量增加10”音量变成60再执行“音量增加-20”又回到40。这个积木可以接受负值所以它既能做渐强也能做渐弱。我做音乐类项目时几乎所有的淡入淡出效果都是用“音量增加”做的而不是“将音量设为”。原因很简单“将音量增加”配合循环和等待可以做出有节奏的渐变而“将音量设为”做不到这个效果。比如要做一个从0到100、持续2秒的渐强效果可以这样写将音量设为 0 重复执行 20 次 音量增加 5 等待 0.1 秒这样每10毫秒音量增加52秒后正好到100。如果觉得20次循环太粗糙可以改成40次、每次增加2.5等待0.05秒效果会更细腻。这里有一个经验数据人对音量变化的感知不是线性的小于5的变化量在听感上基本无感所以循环次数不用太多20到30次足够做出“自然”的感觉。2.3 “音量”作为值你可能不知道它能干嘛“音量”这个积木在积木分类里长得像一个椭圆形它不是一个动作而是一个“值”。它返回当前角色的音量值范围在0到100之间。这个值可以嵌进其他积木的参数里比如“如果音量大于50那么说一句话”或者“将音量的大小作为某个变量的值”。它的典型用途是当多个角色都需要读取当前音量状态时用一个变量去同步。比如主控角色负责改变音量其他角色检测音量值来决定自己的动作——这种设计在“音乐派对”或者“节拍游戏”之类的小项目里非常常见。2.4 别忘了“响度”它才是真正的麦克风数值“响度”在侦测模块里单位是0到100表示的是声音输入设备也就是麦克风检测到的环境声音大小。它和“音量”是两个完全不同的东西“音量”是输出层面的控制值是人为设置的“响度”是输入层面的检测值是电脑从麦克风那儿读到的。用“响度”可以做出非常有意思的交互项目比如角色跟着你说话声音的大小变大变小、张开嘴巴、跳动起来或者做一棵“声控树”喊一声就开花。我做过一个“声响警报器”的模拟项目就是在“重复执行”里不停读取响度如果响度大于某个阈值就触发警报效果非常直观。很多人把音量积木和响度积木混为一谈这是新手最常犯的错误。记住一个原则想让Scratch“听”见你的声音必须用响度想控制Scratch自己发声的“大小”必须用音量。这个区分想清楚了声音相关的项目你就不会再走弯路。3. 实操案例做一只会随音量跳舞的猫3.1 项目目标与设计思路空讲概念没有用我直接拿一个最常见的案例来拆解让舞台上的猫随着你的说话声音跳舞。声音越大它跳得越高声音越小它蹲得越低。这个案例覆盖了两个核心点用“响度”读取环境声音用“音量”或者角色位置来反映声音大小。虽然听起来简单但这个项目足够训练初学者理解音量相关的逻辑。设计思路上这个项目不直接控制音量积木去改音量——因为音量是输出层的属性和麦克风读到的响度无关。我们需要做的是反复读取“响度”的值用这个值去改变角色的位置比如y坐标或大小加入“平滑处理”让角色不要因为响度抖动而跳得太生硬。3.2 积木搭建一步步来新建一个角色我们就用默认的小猫。然后给它写这样的脚本当绿旗被点击 重复执行 将变量 音量检测值 设为 响度 将角色大小 设为 50 音量检测值 等待 0.05 秒这样猫的“大小”会随着响度变化响度100时角色大小变成150。但这里有个问题响度变化很快Scratch的侦测会受到环境噪声影响角色大小会一直抖动看起来很不稳定几乎像抽风。改进思路是引入“平滑处理”不要直接使用原始响度值而是用一个变量做缓动。比如这样当绿旗被点击 将变量 目标响度 设为 0 将变量 当前响度 设为 0 重复执行 将变量 目标响度 设为 响度 将变量 当前响度 设为 当前响度 (目标响度 - 当前响度) / 5 将角色大小 设为 50 当前响度 等待 0.05 秒这里的逻辑是当前响度每次只朝着目标值靠近20%也就是两者差值的五分之一这样角色大小就不会瞬间跳变而是有“惯性”地追着声音变化视觉效果会有一种弹性像真的在跟着节奏跳舞一样。这个缓动的思路在很多交互项目里都通用不局限于这个案例学会之后非常划算。3.3 加入“音量控制”的元素光是让猫跳起来还不够体现“音量控制”的标题含义。我们再加一个功能用一个滑块来控制背景音乐的播放音量。这一步需要做的是在舞台里添加一段背景音乐并开始循环播放在舞台上新建一个变量取名“音乐音量”右键变量把显示方式改为“滑杆”将滑杆的取值范围设为0到100在循环里每帧执行“将音量为音乐音量”。脚本是这样的当绿旗被点击 将音量设为 50 重复执行 将音量设为 音乐音量 等待 0.01 秒拖动舞台上的音量滑杆你会听到背景音乐音量平滑变化。如果把滑杆改成横着的长条视觉上很像一个迷你调音台。这里建议把滑杆的范围设置成1到100不要从0开始因为0的话会完全静音新手偶尔不小心拖到0会以为程序出bug了。这个案例组合了输入响度检测、输出音量控制、交互滑杆调节是一个比较完整的声音交互小项目做完之后拿来当“声音模块”的教学演示或者学生作业都是不错的。4. 音量控制的进阶玩法从控制到音效设计4.1 用音量做“近大远小”的场景感Scratch里每个角色都可以有自己的音量利用这一点可以做出空间感。比如在一个舞台场景里左边有一只鸟在叫右边有一只狗在叫。当鸟离玩家近的时候比如鼠标移到鸟身上鸟叫音量应该大狗远一些音量应该小。这种“距离越近音量越大”的逻辑可以用一个公式来实现。假设鸟的x坐标是-150鼠标x坐标是鼠标的x坐标距离是两者之差的绝对值。距离越大音量应该越小。我们设一个最大音量100距离超过300时音量为0。那么将变量 距离 设为 [x坐标 - 鼠标的x坐标] 的绝对值 将音量设为 100 - (距离) / 3注意这里的除法距离300时音量正好为0距离150时音量为50。这种“距离衰减”的模型虽然不是真实的物理公式但在Scratch舞台这个尺度上已经足够用了。我当时做这个功能时一开始用的是一次函数后来发现距离小的时候音量太大距离远一点又直接静音听觉上变化太突兀。后来改成了用音量增加配合循环做“平滑衰减”感觉自然很多。具体做法是不直接在一条指令里算出音量而是先设定目标音量再用“音量增加”向着目标靠近每次只增加差值的10%。这样角色移动时音量是一步一步追过去的而不是瞬间跳到目标值。4.2 用滑杆做“调音台”前面案例里已经提过用滑杆控制音量这里展开讲一下细节。Scratch的变量滑杆默认范围是0到100但音量的有效范围也是0到100所以理论上不用改动。但有一个坑变量滑杆的最小值默认是0但也可以设置成负数。如果你把滑杆范围改成-50到100然后“将音量设为”这个变量音量会被钳制在0到100吗实测下来Scratch的音量积木在设为负数时会被当成0处理但变量本身会显示负数这就会造成“明明设置音量为-20声音却是0”的困惑。所以一定要把滑杆最小范围设置成0最大范围设置成100。另一个容易踩坑的地方是当你在角色A里拖动滑杆角色B的音量不会被影响。因为“将音量设为”作用于当前角色。如果想让多个角色共享同一个音量值要么在舞台角色就是“舞台”本身里写音量设置逻辑要么用一个“全局变量”来传值然后在需要的角色里再加一句“将音量设为 [音量变量]”。我通常的做法是特定角色的音量在角色自身的脚本里控制舞台背景音乐的音量在舞台上控制两个回路互不干扰。4.3 渐强渐弱的几种实现方式对比淡入淡出是音效设计的高频需求。在Scratch里实现渐强渐弱有几种常见路径我用表格列一下实现方式核心积木适用场景注意事项固定循环逐级增加“将音量设为”“音量增加”通用适合渐强渐弱循环次数控制渐变的细腻度变量循环逼近“将音量设为” 变量做目标值需要实时响应外部变化平滑处理很费功夫但效果最好直接跳变“将音量设为”只需要在特定时刻切换音量不自然适合开关式变化用事件触发渐变“广播”“音量增加”多个角色同步渐变注意广播的时机避免重复触发我最常用的是“变量循环逼近”。比如要做“环境音逐渐变大”的效果可以写一个广播“暴雨来临”舞台上音量从20逐渐增加到80当接收到 暴雨来临 重复执行直到 音量 80 音量增加 2 等待 0.1 秒“重复执行直到”这种积木在很多教程里提及率很低但在音量渐变场景里非常契合。它能自动判断是否达到目标值不用你数循环次数。5. 音量控制最常见的六个坑和排查方法5.1 声音文件本身太小怎么调都没用这是最常见的问题。测试的时候先在Scratch的声音编辑器里点“播放”如果声音本身听起来就很小说明问题出在源文件。可以在编辑器的“效果”菜单里选择“响度”下面的“放大”把声音波形整体抬高也可以直接换一个音量正常的文件。永远不要指望音量积木去救一个录音电平过低的文件它救不回来。5.2 把“响度”当成“音量”用结果完全没反应我做项目时经常见到这种情况学生想做一个“拍手亮灯”的效果结果在循环里写“将音量设为 响度”当然也能看到音量的数字变化但声音输出本身不会变灯角色造型切换也确实会触发于是造成了一种错觉“音量积木真的能反映环境声音吗”其实不是。要检测环境声音必须用“响度”积木然后把它映射到某个动作上。“音量”只是一个输出控制值和环境声没有任何直接关系。这个混淆是新手重灾区值得反复强调。5.3 音量设成0之后就再也听不到声音了程序是不是有问题不是。音量设为0后角色当前及后续播放的所有声音都是静音直到你再次把音量设为一个大于0的值。很多初学者会在“当绿旗被点击”里不加音量设置然后某个分支把音量设成了0导致后面所有的声音都消失了。排查方法是在每个可能控制音量位置的分支里检查是不是哪里重置了音量特别是“将音量设为0”这种语句要格外留意。5.4 多次触发“将音量设为”导致互相覆盖Scratch的角色脚本是并行的多个事件或循环同时执行时后执行的积木会覆盖先执行的值。如果你在某个角色里同时有一个“重复执行将音量设为滑杆变量”的脚本和另一个“等待2秒后将音量设为50”的脚本两个脚本会打架。常见的现象是滑杆怎么拖音量都固定在50。这其实是脚本冲突排查时要找到所有跟音量有关的积木然后决定哪一个才是真正的控制源。5.5 滑杆调节音量时声音有“断片”或“卡顿”感这个现象常常不是音量积木的问题而是循环里等待时间太短导致大量脚本同时刷新。比如等待0.01秒的循环在音量变化剧烈时会造成音频引擎的重启感。解决办法是适当降低循环频率把等待时间改到0.05秒左右或者用“广播”只在需要时调用音量设置不要在每帧都执行。5.6 绿旗点击后音量没有恢复到默认值Scratch的音量属性会保留上一次运行结束时的值。如果上一次运行把音量设成了30这次点绿旗音量仍然是30不会被自动重置。强烈建议在“当绿旗被点击”的脚本开头显式加上“将音量设为 100”或你需要的默认值这是最简单也最有效的防坑措施。我见过太多次“声音突然变小了”的求助到最后几乎都是要检查绿旗后面的音量初始化。6. 一些还能深入的方向和我的实际操作体会音量控制看起来是个小功能但它在Scratch里能撑起的玩法非常多。做完上面那个会跳舞的猫你可以继续扩展做一个音量触发的“机关门”喊得越大声门开得越大做一个“音量节奏灯”通过响度的变化来控制舞台背景颜色的渐变或者做一个“语音控制小车”响度超过阈值就往右走低于阈值就往左走。如果你想让作品更像“音效设计”而不是“控制演示”可以试着在音乐播放过程中动态改变音量做出“收音机调台”的感觉。具体做法是在“重复执行”中让音量随机变化配合滑杆变量的手动输入可以做出类似扫描电台时“沙沙声忽大忽小”的效果。这个做法需要同时用到“随机”和“音量增加”实操起来没有特别难但听感很惊喜。我个人在做音量渐变的时候踩过最深的一个坑是把“将音量设为”直接放在“重复执行”的外面导致音量只在循环开始时设置一次后面的循环全在空转。后来养成一个习惯凡是涉及音量连续变化的先检查一下积木是不是在循环体内部这个检查三十秒就能做完但能省掉至少半小时的排错时间。还有一个小技巧音量控制尽量不要和“响度”检测混在同一个角色里写太多脚本。舞台的角色负责音乐播放和输出控制专门的角色负责响度检测和交互反馈。这样代码逻辑清晰调试起来也快。声音相关的bug往往不好定位脚本一多就容易晕保持“一个角色一个职责”能帮你减少很多不必要的麻烦。Scratch的声音模块看着简单但用好了能做出来的东西真的很多。从最基本的音量设置到响度触发交互再到渐变动画效果每一个层次都有值得钻研的点。希望这篇分享能帮你把音量控制这块彻底搞明白也欢迎你做完项目后继续探索更多玩法——你会在试错中发现Scratch的真实乐趣往往藏在那些“咦为什么会这样”的瞬间里。