Soundscape

From Valve Developer Community
< Zh
Jump to navigation Jump to search
English (en)Español (es)Français (fr)Русский (ru)中文 (zh)Translate (Translate)

Soundscape(音景)是一种音效脚本,用于向地图添加环境音效,它在地图中的数量没有严格限制,只需一个实体即可完成所有步骤,并且不会产生任何网络开销。音景通常为循环音效和随机音效的组合,这些声音可以通过从8个可分配的目标位置之一发出;同时还可以强制使用DSP(en)Soundmixer(en)

每次只能同时播放一个音景,并且其中的任何声音都无法用I/O系统控制,当另一个音景启用时,游戏会自动淡入淡出

Tip.png提示:
  • 过渡时间由控制台指令(en)soundscape_fadetime定义,或者在更新的游戏中由fadetime键值定义。
  • 使用控制台指令(en)soundscape_debug来检查哪个音景处于活动状态以及原因
Note.png注意:
  • 在不正常编译VVIS的情况下(如:以快速模式(-fast)编译),音景将无法正常工作
  • 除非音频文件有标记点,否则它们无法作为循环音效,详见Looping a Sound(en)
  • 大部分起源游戏中,音景无法同时播放统一音效,即便音调,音量和SoundLevel不同,有关解决方法详见下方
  • 玩家出生点(en)至少应位于一个音景的半径范围内(或边界框(en)),否则玩家将在没有音景播放的情况下生成

音景

浏览音景

音景通常位于游戏的scripts\文件夹下多个以soundscapes_为前缀的文本文件。每一个音景都由全局清单scripts\soundscapes_manifest.txt控制,其中列出了游戏应读取的所有音景脚本。通过这种方法加载的音景可以用于游戏中的任何地方,即便它们是为某个场景专门设计的

音景同时还可以以地图专用的方法进行使用

scripts\soundscapes_<地图名>.txt

此处的<地图名>应为它们所对应的BSP文件名称。这种音景可以在不修改全局清单的情况由地图自动读取,但也只能用于该地图中。

Note.png注意:Mapbase Mapbase中,此方法变为maps/<地图名>_soundscapes.txt
Note.png注意:在官方起源游戏中,这些文件通常被打包到VPK中,但可以被同路径下的未打包版本自动覆盖

你可以在页面底部找到部分游戏的音景列表链接,以及社区对部分音景效果的描述

你也可以在游戏中使用PlaySoundscape指令来显示当前所有可用音景,输入任意字符,游戏的自动填充功能便会显示所有符合条件的音景

配置音景

音景只能通过以下实体进行配置:

还有其他实体可以启用音景,但只有上述这些真正定义了音景的属性。其他实体将以此为主实体远程控制音景 每当这些实体启用音景的时候,任何具备预定义位置的音效都将会从音景实体指定的Sound Position实体位置触发

Tip.png提示:许多音景定义了声音发出的位置,因此最好查看音景条目并了解您可以做什么。大部分音景条目都可以在<game>/scripts/soundscapes_manifest.txt文件找到。要更好的理解音景,详见下方(en)

激活音景

任何已启用并被玩家触发的音景实体,都会播放其自身(或主实体)指定的音景条目,音景本身会持续播放,即便最初启用自身的实体已被禁用,除非玩家触发了另一个音景,或者地图发生变化

Tip.png提示:soundscape_flush将取消当前正在播放的音景


音景相关实体

音景可由以下实体播放:

音景本身是基于点实体(en),但是当玩家处在所属半径内并且视野内可见时,即可触发它们

不过env_soundscape_proxy和env_soundscape_triggerable是两个例外,前者通过env_soundscape或者env_soundscape_triggerable触发;后者通常由trigger_soundscape触发

由于一次只能播放一个音景,因此如果同时触发一个或多个音景,则位置最近的优先(音景实体的半径范围始终优先于trigger_soundscape的边界框)

注意音景不会玩家离开其半径范围或者视野内不可见而停止播放


Tip.png提示:使用控制台指令(en)soundscape_debug(en)来检查哪些音景处于播放状态

音景放置

一般来讲,只放置你绝对需要的音景数量。先选择一个需要全局播放的音景,之后在每个特殊位置(如房屋,发电机房)放置特定于该场景的次要音景。确保每个具有位置的局部音效都有自己的主音景,并指定了适当的目标实体。

一旦你大致了解了音景的位置,你就可以开始添加/配置触发音景的实体,并创建一种蓝图,说明音景如何从一个流向另一个。在许多情况下,你会放置实体来阻挡对比位置的所有出口,并触发全局音景。

基本上,目标是预测玩家在整个地图上的移动,并以一种始终激活正确音景的方式阻挡每个区域。

在音景内多次使用同一音效

目前在大多数起源游戏/分支中,一次只能在音景内同时播放一个或多个相同的音效,即便音量,音调和SoundLevel有差异

(存在于自 反恐精英:全球攻势 以来)此问题已得到修复,允许音景同时播放多个相同的音效

澄清: 是否已在CSGO前的起源游戏/分支中修复?

有一种不是办法的办法,即复制粘贴并重命名音效,适用于一些非常短的音效(如灯光的嗡嗡声)但不推荐用于其他音效,因为会增加冗余的文件大小。这是V社在CSS野战训练营中使用的解决方法:在T家厨房里,有两个发出嗡嗡声的荧光灯。但第一个音效是"ambient/machines/fluorescent_hum_1.wav"而第二个音效是"ambient/machines/fluorescent_hum_2.wav"。这两个音效完全一样,但由于上述问题必须使用不同的名字才能用于音景

另一个示例如下:我们有三盏需要发出嗡嗡声的荧光灯。为了使其正常运作,音景文件和实体配置应该如下

Soundscape identicalsounds.jpg
Hammer identicalsounds.jpg
"soundscape.demovdc"
{
	"playlooping"
	{
		"volume"	".65"
		"pitch"		"92"
		"channel"	"CHAN_AUTO"
		"position"	"0"
		"attenuation"	"1.2"
		"wave"		"ambient\machines\fluorescent_hum_1.wav"
	}
	
	"playlooping"
	{
		"volume"	".65"
		"pitch"		"92"
		"channel"	"CHAN_AUTO"
		"position"	"1"
		"attenuation"	"1.2"
		"wave"		"ambient\machines\fluorescent_hum_2.wav"
	}
	
	"playlooping"
	{
		"volume"	".65"
		"pitch"		"92"
		"channel"	"CHAN_AUTO"
		"position"	"2"
		"attenuation"	"1.2"
		"wave"		"ambient\machines\fluorescent_hum_3.wav"
	}
}

尽管大多数起源游戏/分支无法同时播放多个相同的声音,但在某些情况下,似乎可以使用频道在不同位置多次播放相同的声音。经过在不同情况下的多次测试和源代码解读,这似乎被认为具备可行性。例如,我们使用不同的频道(如CHAN_STATIC、CHAN_STREAM、CHAN_AUTO等)而不是使用不同的名称。由于一系列尚不清楚的原因,这并不总是有效。有关更多信息,详见Soundscript

自定义音景

创建

音景脚本的语法和Soundscripts(en)有很多相似之处,但两者仍然是完全不同的体系

音景需要一些独有的规则,并放置在独立于普通Soundscript的纯文本文件中。通常会命名为soundscape_mall.txt并且可能包含 5 到 30 个不同的音景,这些音景采用以下语法

Icon-Bug.png错误:如果音景名字过长,则可能音景实体无法在游戏中触发,尽管仍可以通过控制台触发,目前尚不清楚具体的最大字符上限  [todo tested in ?]
Tip.png提示:可以使用#include来嵌套其他音景文本
<音景名称>
{
	<音景规则>
	{
		<规则键值>
		...
	}

	...
}

常见参数

wave <string(en)>
要播放的音频文件名称,路径相对于game\sound\目录
Tip.png提示:尽管键值名称如此,但实际可以播放游戏支持的任何音频格式
volume <normal(en)>
1为最大音量,0为静音
pitch <integer(en)>
百分比值,有效范围通常为70-130
music <boolean(en)> (存在于 The Ship: Murder Party 之中)
音效会被视为游戏音乐,并受到音量设置中音乐设置的影响,类似于声音标识符#,只是其受DSP影响并具备空间性
Sound attenuation.jpg
position <0-7>
地图内八个可发出音效的位置(由地图制作者定义)
position random
同上,但音效从玩家附近的任意位置发出
origin <origin> (存在于自 求生之路 以来)
在特定坐标播放音效,格式为"0,0,0"不同轴的坐标必须以逗号进行分割,但可以包含前后空格
Note.png注意:功能上类似于position,但在何处播放音效完全由脚本定义。仅适用于单张地图专用的音景,因为在其他地图里你无法更改声音发出的位置
attenuation <float(en)>
当玩家视野远离音源时,音效音量下降的速度。只有在指定position的情况下有效。默认值为1.00。值越低,声音的半径就越大。相反,值越高,声音的半径就越小。请参见上图示例
soundlevel <string(en)>
可用于代替attenuation,接受引擎提供的预设值.
Warning.png警告:所有包含空格的键值都需要用双引号括住
suppress_on_restore <boolean(en)>
防止在加载存档后重新播放音效
Tip.png提示:可用于音景内播放的音乐

随机值

一些参数接受“最大”和“最小”范围,例如

"pitch"	"80,120"

每当执行规则时,对应的参数将从“最大”与“最小”值之间随机取值

规则

playlooping

"playlooping"
{
	"volume"	"0.98"
	"pitch"		"110"
	"soundlevel"	"SNDLVL_85dB"

	"position"	"0"

	"wave"	"ambient/swamps/water_Lap_loop_st.wav"
}

循环播放音效,不允许随机值

Note.png注意:除非有标记点,否则音效将不会缩放,详见如何创建循环音效(en)
Icon-Bug.png错误:如果触发了另一个包含相同循环播音效的音景,但该声音具有不同的音高(Pitch)值,则声音将停止播放,除非从不包含该声音的音景重新触发前者  [todo tested in ?]

playrandom

"playrandom"
{
        //每1-4秒间播放一次
	"time"		"1,4"

	"volume"	"0.4,1"
	"pitch"		"90,105"
	"soundlevel"	"SNDLVL_85dB"
	
	"position"	"0"
	
	"rndwave"
	{
		"wave"	"ambient/wind/wind_med1.wav"
		"wave"	"ambient/wind/wind_hit1.wav"
	}
}

time键值指定的最短与最长时间之间随机播放音效。允许随机值

Playrandom需要所有wave键值位于rndwave内部(即便只有一个音频)每次执行规则时都会随机播放音效。

Warning.png警告:注意不要在该组中指定任何循环音效,因为即便切换到不同的音景,它们也无法被停止播放
Note.png注意:如果切换到不同的音景,即便是以MP3为格式的非循环音效也无法被停止(已在反恐精英:起源中测试[证实]

playsoundscape

"SubScape"
{
	"playsoundscape"
	{
		"name"	"GenericIndoor"
		
		//子音景音量缩放到50%
		"volume"	"0.5"
		
		//从位置0发出所有带位置的音效
		"positionoverride"	"0"
		
		//从位置1发出所有环境音效
		"ambientpositionoverride"	"1"
	}
}

播放完整的音景,子音景中的DSP预设将被忽略

name
需要播放的音景名称
position <integer(en)>
用于偏移子音景每个位置的索引值
例如,如果偏移值为2,则子音景中位于位置0、1、2、3播放的音效,在主音景中会偏移到位置2、3、4、5
positionoverride <integer(en)>
强制子音景中所有指定位置的音效从主音景的一个位置发出。
ambientpositionoverride <integer(en)>
强制子景观中所有未指定位置的音效(即环境音)从主音景的一个位置发出。

dsp <integer>

// Disable DSP and play no ambient sounds
"Empty"
{
	"dsp"	"0"
	"dsp_volume"	"1.0"
}

//DSP room type with a DSP spatial type
"Empty2"
{ 
	"dsp"	"40"
        "dsp_spatial"	"119"
	"dsp_volume"	"1.0"
}
dsp_spatial <integer(en)>
dsp_volume <float(en)>

设置当前DSP预设。"dsp" "1"将从附近材质(en)表面属性(en)中提取

对于参数列表,请查看scripts\dsp_presets.txt文件。可能需要使用如VPKEdit(en)之类的软件从游戏VPK中提取文件。要预览DSP预设,请在控制台使用room_type <int>指令

Note.png注意:在为需要用于许多不同场景的音景设置预设时要谨慎使用
Note.png注意:还可以使用dsp_volume来控制DSP效果的强度
Note.png注意:在更新的引擎分支中(Souce 2009及以后),调试room_type的指令是dsp_room,还增加了空间DSP类型dsp_spatial
Note.png注意:空间DSP类型也可以通过"dsp_spatial" "n"和房间DSP类型一起分配给音景

fadetime <float>

"SoundScapeName"
{
	"fadetime"  "1.0"
	"playlooping"
	{
		// ...
	}
}

(存在于自 求生之路2 以来)

音效淡入的时间(以秒为单位)

Note.png注意:在没有此功能的游戏中(如反恐精英:起源)可以将音量设置为大于1的值来进行一定程度的控制,这将增加音效的淡出时间

soundmixer <string>

"quiet"
{
	"soundmixer"	"Citadel_Dialog_Only"
	
	// ...
}

选择一个自定义混音器(en),混音器控制一组音效的优先级和音量,关于如何新建混音器,参见scripts\soundmixers.txt(默认情况下始终使用Default_Mix作为模板)

示例

"swamp.water.slow"
{
	"dsp" "1"
	"dsp_spatial" "20"
	"dsp_volume"  "1.0"
	"fadetime"  "1.0"
	"soundmixer" "outside_swap_mixer"
	"playlooping"
	{
		"volume"	"0.98"
		"pitch"		"110"
		"soundlevel"	"SNDLVL_85dB"
		
		"position"	"0"
		
		"wave"	"ambient/swamps/water_Lap_loop_st.wav"
	}
	
	"playrandom"
	{
		"time"		"1,4"
		"volume"	"0.4,1"
		"pitch"		"90,105"
		"soundlevel"	"SNDLVL_85dB"
		"origin"	"3424.676025, 381.604095, 152.927948"
		
		"rndwave"
		{
			"wave"	"ambient/wind/wind_med1.wav"
			"wave"	"ambient/wind/wind_hit1.wav"
		}
	}
}

循环播放MP3音效

MP3格式无法循环播放,仅建议用于非循环声音。不过,可以使用rndwave播放相同的文件来模拟循环,并将时间值设置为这些文件的长度:

//////////// Outside bird sounds (loop mp3 sound file trick by gtamike_TSGK) ////////////
//////////// The 2 .mp3 files are the same as each other just not the same file name ////////////
//////////// MP3 Sound file runtime 3.29mins = 3 X 60 + 29 = 209secs ////////////

// mp3_loop

"mp3_loop"
{
	"dsp" "1"
	"playlooping"
	{
		"volume"	"1.0"
		"pitch"		"100"
		"soundlevel"	"SNDLVL_150dB"

		"wave"	"loop_mp3_soundscape/outside_1MB_20KB_part_1.mp3"
	}

	"playrandom"
	{
		"time"		"209"
		"volume"	"1.0"
		"pitch"		"100"	
		"soundlevel"	"SNDLVL_150dB"

		"rndwave"
		{
			"wave"	"loop_mp3_soundscape/outside_1MB_20KB_part_1.mp3"
			"wave"	"loop_mp3_soundscape/outside_1MB_20KB_part_2.mp3"
		}
	}
} 
Warning.png警告:在音景中使用MP3音频可能会减小自定义地图大小,但不建议用于循环音效。可能会发生"rndwave"播放的第一个文件在time值的半数时间后突然停止播放的情况,在这种情况下则需要将time值翻倍(本示例中为418),但代价是音效播放两次后会暂停。建议使用ADPCM压缩的WAV(en)音频代替,详见Compression_(Source_1)#Audio_Compression(en)

储存与使用自定义音景

引擎使用scripts/soundscapes_manifest.txt作为清单来查找全局音景文件,但也可使用scripts/soundscapes_%地图名%.txt来逐地图加载音景,所有地图专用音景都将在地图加载时读取

Note.png注意:Mapbase Mapbase中,出于一致性考虑,此方法已更改为maps/%地图名%_soundscapes.txt

当不需要/不可能修改音景清单时,应使用地图专用音景(例如没有独立游戏目录的自定义地图),此文件也可以被压缩进地图中

可以通过在底部添加新的“file”行将新的音景添加到清单中,如下所示:

	"file"		"<文件路径>"
Icon-Important.png重要:游戏内的所有音景名称必须是独一无二的
Warning.png混淆的风险:尽管地图专用声音脚本通过maps/%地图名%_level_sounds.txt以类似的方式进行挂载,但地图专用音景必须放置在scripts文件夹并带有soundscapes_前缀

使用“XBLAH的模组制作工具”创建音景

音景现在可以通过XBLAH's Modding Tool XBLAH's Modding Tool进行创建或修改,其工具界面提供了集成的资源管理器来直观的创建新的音景,这可以让用户预览所有已挂载的音频(无论是VPK内音频或松散未打包音频),让用户单独查看音景文件,并预览音景是如何在游戏内播放的


如何使用
可以通过工具内部的Sounds > Soundscape Editor工具栏使用音景编辑器

XBLAH's Modding Tool - Soundscape Editor.png

参见