Zh/L4D2 Custom Sound and Music Tutorial

自从2010年8月20日更新以来，《求生之路2》完全支持自定义声音。Valve提供的说明可以在中找到。本文介绍了如何在《求生之路2》中使用自定义声音、文件管理和测试方法。
==入门==
通常来说：
# 自定义声音文件适用于多个位置：可以在官方的sound文件夹中，已知中的sound文件夹中，或包含sound文件夹的附加内容中。
# 在测试之前，请使用snd_buildsoundcachefordirectory在该文件夹中构建一个新的sound.cache。
;选项 1 - 作为自定义搜索路径：
# 在任意位置创建一个包含sound子文件夹的目录。
# 在"..\left 4 dead 2\left4dead2\gameinfo.txt"的文件中添加目录路径。
# 在sound文件夹中创建另一个文件夹，可以是唯一的或已存在的名称（例如：ambient、music等）。如果可能，保持与官方sound文件夹相同的命名结构。
# 使用游戏内控制台构建sound.cache：snd_buildsoundcachefordirectory <绝对目录名，例如：e:\custom_sounds 或 游戏根目录，例如：../left4dead2/（包含官方sound文件夹）>。此命令将查找名为sound的目录并生成sound.cache。
# 重启客户端。
# 通过命令测试声音（sound为根目录）： play (sound文件夹的子目录)/<声音文件名> 
;选项 2 - 作为附加内容/VPK：
# 在addons目录中创建一个文件夹。它应包含一个名为sound的子文件夹。addons目录位于"..\left 4 dead 2\left4dead2\addons"。
# 在sound文件夹中创建另一个文件夹。此文件夹用于存储声音文件。
# 使用游戏内控制台为附加内容构建sound.cache：snd_buildsoundcachefordirectory ../left4dead2/addons/<将打包成VPK的VPK附加文件夹名称>。此命令将查找名为sound的目录，并在其中创建名为sound.cache的文件。
#作为内容包。换句话说，只需要声音文件（及正确的目录结构）和sound.cache。无需删除解压后的VPK。保留它以便以后进行更改。
# 通过命令测试声音（sound为根目录）： play (sound文件夹的子目录)/<声音文件名> 
# 更新sound.cache并重新打包VPK，以便听到新或重新定位的声音。
;示例
如果自定义声音文件位于left 4 dead 2/left4dead2/addons/customsoundaddon/sound/ambient/testsound.wav：
* 使用snd_buildsoundcachefordirectory ../left4dead2/addons/customsoundaddon构建sound.cache。
* 作为自定义搜索路径：添加Game left4dead2/addons/customsoundaddon。
* 作为附加内容：构建sound.cache后，拖动customsoundaddon文件夹到vpk.exe的快捷方式中创建customsoundaddon.vpk。
* 在游戏中测试testsound.wav，使用play ambient/testsound。
=== 一些建议 ===
保持资源的组织结构清晰，独立且尽可能小。并且，在《求生之路2》中，声音通常是通过分配的。在使用声音进行开发时，至少应包含以下内容：
# 包含自定义声音和sound.cache的独立搜索路径，如上所述。您可以根据需要随意组合或分离资源，只要将挂载路径添加到gameinfo.txt中即可。
# 一张可以在游戏中加载的地图，通常是用于发布的地图或测试地图——maps/<地图名称>.bsp
# 一份空白的每张地图（.txt文件）——maps/<地图名称>_level_sounds.txt。
# 这些文件和文件夹最终将与地图和其他资源一起集成，作为一个独立的附加内容/VPK发布。
=== 使声音效果合适 ===
现在声音在游戏中可以正常播放了……接下来怎么办？文章的其余部分将涵盖这一点：
* 
* 
* 
* 
* 
* 
== 声音文件兼容性 ==
游戏可以播放和文件，前提是它们具有声音缓存条目。
=== 声音缓存兼容性 ===
从版本2.2.2.6开始，您可以为具有以下属性的声音文件构建声音缓存：
扩展名 	通道 	格式（） 	编解码器（） 	编解码器配置文件 	位深（bit） 	采样率（Hz） 	比特率（kbps）
 	单声道立体声 	 	 	N/A 	4* 	441002205011025	
 	单声道立体声 	 	 	N/A 	16 	441002205011025	
 	单声道立体声 	 	 	N/A 	8 	441002205011025	
 	单声道立体声 	 	 	ABRCBRVBR 	N/A 	441002205011025	32‒320
=== 替换声音文件兼容性 ===
许多L4D2模组替换现有的声音文件，而不打包声音缓存。
如果您希望避免让用户直接修改游戏文件，这是唯一的选择，因为附加内容的声音缓存优先级最低，并且会被优先级较高的声音缓存覆盖。
从版本2.2.2.6开始，游戏引擎将能够接受以下属性的替换声音文件：
扩展名 	通道 	格式（） 	编解码器（） 	编解码器配置文件 	位深（bit） 	采样率（Hz） 	比特率（kbps）
 	任意 	 	 	N/A 	4* 	任意 	
 	任意 	 	 	N/A 	16 	任意 	
 	任意 	 	 	N/A 	8 	任意 	
 	单声道立体声 	 	 	ABRCBRVBR 	N/A 	441002205011025	32‒320
如果您希望您的替换声音正常播放，则必须遵循原始声音的声音缓存条目中的信息：
* 文件大小
* 声音时长
* （如果是WAV文件）
* 采样率
* 通道数
您的替换文件属性应尽可能接近（如果不是完全相同的话）原始文件，以避免异常播放。
如果您尝试在不重新构建声音缓存的情况下播放替换声音，以下情况可能会发生：
扩展名 	改变了通道数量？ 	改变了格式？ 	改变了编解码器？ 	改变了编解码器配置文件？ 	改变了位深？ 	改变了采样率？ 	改变了比特率？ 	小于原始文件？ 	大于原始文件？ 	改变了循环点？
 	播放混乱 	播放混乱 	播放混乱 	N/A 	播放混乱 	播放速度错误 	N/A 	非循环时正常播放；循环时可能播放异常 	截断播放 	无变化
 	正常播放 	N/A 	N/A 	正常播放 	N/A 	正常播放 	正常播放 	正常播放 	截断播放 	N/A
==位置很重要！==
例如，滚动字幕的音乐music/unalive/themonsterswithin.wav会覆盖几乎所有其他声音。如果该声音文件（以及声音脚本条目）被移动到不同的目录，音乐的表现会有所不同。玩家会听到其他声音与结尾字幕混合播放，例如僵尸呻吟、幸存者的评论、声音景观等。
一个名为soundmixers的功能可能是负责声音优先级/压制的脚本。声音文件在sound目录中的位置会动态控制前景播放的声音以及被软化或静音的声音。脚本位于scripts\soundmixers.txt文件中，包含在pak01_dir.vpk中。有关如何提取脚本以查看详细信息，请参阅。
==循环==
需要循环的声音必须通过第三方程序进行循环。有关详细信息，请参阅。
循环示例：坦克战斗音乐、发动机声音、被猎人攻击的音乐、玩家在酸池中的音乐。
==声音脚本==
每个地图的声音脚本似乎是创建自定义或修改条目的唯一方法。全新的声音脚本条目可以轻松创建，或者可以安全地覆盖现有的声音脚本条目（例如Event.Tank）来为单个地图定制。当测试或发布时，结果是一个包含每个地图的<map name>_level_sounds.txt的地图文件夹。
用文本编辑器打开<map name>_level_sounds.txt。
有关更多详细信息，请参阅。
===声音脚本条目===
可以通过控制台或实体（例如ambient_generic或ambient_music）在游戏中播放。一个条目的示例：
entry.name
{
	channel		CHAN_AUTO
	volume		VOL_NORM
	pitch		PITCH_NORM
	soundlevel	SNDLVL_NORM
	wave		common/null.wav
}
如果某个值包含空格或制表符，请将其用引号括起来。
===声音脚本的常见使用===
所有官方游戏内音效、发声和音乐都依赖声音脚本来调整声音的通道、音量、音高等。使用maps/<map name>_level_sounds.txt，您可以自定义现有条目，而不会与其他附加内容和官方战役发生冲突。只需将您希望更改的条目复制到每个地图的声音脚本中。
声音脚本条目可以通过打开pak01_dir.vpk并访问scripts/game_sounds_*.txt文件夹找到。
许多音乐条目依赖于地图属性 > ，该属性可在和中找到。例如，地图c5m1_waterfront.bsp的后缀字符串为"BigEasy"，并且在游戏中播放其风格的介绍音乐，其中导航网格标记为PLAYER_START和CHECKPOINT。
===有趣的声音脚本===
所有的声音脚本都很有趣。以下是其中几个：
* game_sounds_music.txt提供了很好的音乐声音脚本条目示例。一些条目将同一乐器的不同音符串联在一起，并随机播放。
* game_sounds_physics.txt包含在游戏交互期间播放的声音条目，例如走在雪地上或射击混凝土墙的声音。
==声音景观==
L4D2中的自定义似乎能够很好地工作，无需修改官方的声音景观清单。它们是“每图”文本文件，类似于声音脚本，但位于scripts文件夹中：scripts/soundscapes_<map name>.txt。声音景观通常使用.wav文件，通常涉及。.mp3文件也可能有效（不支持循环）。
因为声音景观是“每图”的，每个地图都需要一个声音景观文件。
为了避免复制粘贴整个脚本并跟踪所有声音景观文件中的更改，您可以创建一个“主”声音景观，包含所有必要的内容，而其他所有声音脚本文件只需“包含”主脚本。这样主脚本中的所有更改都会自动加载到所有其他脚本中。
例如：
#include "soundscapes_mymap_master.txt"
;声音景观实体
*
*
*
*
仅使用env_soundscape来进行关卡声音设计。其他实体和方法可能无法按预期工作。欢迎进行实验！
==测试==
测试自定义声音脚本条目非常简单，只需创建最新的sound.cache，重新启动游戏，然后在地图中播放声音。如中所述，sound.cache通过控制台命令snd_buildsoundcachefordirectory ..\left4dead2\<sound文件夹位置>构建。当声音缓存成功创建或更新时，控制台会输出在附加组件sound目录中找到的声音文件数量。
===通过控制台===
#打开<map name>.bspmap <map name> coop
#测试声音playgamesound entry.name
#在大多数情况下，如果声音拒绝停止播放，可以通过以下命令停止声音stopsound
===通过实体===
#创建一个、或任何其他具有需要声音名称属性的实体
#更改并更改声音名称为您选择的声音脚本条目
#可选：创建一个触发声音的实体（如果需要或希望）
#通过控制台打开<map name>.bspmap <map name> coop
#通过“触发实体”或控制台命令测试声音：ent_fire <ambient_generic targetname> PlaySound
#在大多数情况下，如果声音由于某种原因拒绝停止播放，可以通过控制台停止声音。请考虑，如果您需要使用实体I/O来StopSound。stopsound //这是控制台命令，格式与这两个声音实体的输入一样。
==发布==
如中所述，最终的、很可能是单独的VPK将包含您的战役或单地图的所有独特资源。在自定义声音方面，只需复制您一直在使用的声音文件夹和每图的声音脚本。恭喜您完成发布！
==另见==
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
==外部链接==
*Gamasutra Game Audio Theory: Ducking - ‘Ducking’，即降低音景音量，可以为听众创造更大的参与感。
*Podcast 17 Mike Morasky Interview - 讨论音频制作及对声音系统演变的洞察。