Soundscape
Soundscape(音景)是一种音效脚本,用于向地图添加环境音效,它在地图中的数量没有严格限制,只需一个实体即可完成所有步骤,并且不会产生任何网络开销。音景通常为循环音效和随机音效的组合,这些声音可以通过从8个可分配的目标位置之一发出;同时还可以强制使用DSP 和Soundmixer
每次只能同时播放一个音景,并且其中的任何声音都无法用I/O系统控制,当另一个音景启用时,游戏会自动淡入淡出


- 在不正常编译VVIS的情况下(如:以快速模式(
-fast
)编译),音景将无法正常工作 - 除非音频文件有标记点,否则它们无法作为循环音效,详见Looping a Sound
- 在大部分起源游戏中,音景无法同时播放统一音效,即便音调,音量和SoundLevel不同,有关解决方法详见下方
- 玩家出生点 至少应位于一个音景的半径范围内(或边界框 ),否则玩家将在没有音景播放的情况下生成
音景
浏览音景
音景通常位于游戏的scripts\
文件夹下多个以soundscapes_
为前缀的文本文件。每一个音景都由全局清单scripts\soundscapes_manifest.txt
控制,其中列出了游戏应读取的所有音景脚本。通过这种方法加载的音景可以用于游戏中的任何地方,即便它们是为某个场景专门设计的
音景同时还可以以地图专用的方法进行使用
scripts\soundscapes_<地图名>.txt
此处的<地图名>
应为它们所对应的BSP文件名称。这种音景可以在不修改全局清单的情况由地图自动读取,但也只能用于该地图中。


maps/<地图名>_soundscapes.txt

你可以在页面底部找到部分游戏的音景列表链接,以及社区对部分音景效果的描述
你也可以在游戏中使用PlaySoundscape
指令来显示当前所有可用音景,输入任意字符,游戏的自动填充功能便会显示所有符合条件的音景
配置音景
音景只能通过以下实体进行配置:
还有其他实体可以启用音景,但只有上述这些真正定义了音景的属性。其他实体将以此为主实体远程控制音景 每当这些实体启用音景的时候,任何具备预定义位置的音效都将会从音景实体指定的Sound Position实体位置触发

<game>/scripts/soundscapes_manifest.txt
文件找到。要更好的理解音景,详见下方 。激活音景
任何已启用并被玩家触发的音景实体,都会播放其自身(或主实体)指定的音景条目,音景本身会持续播放,即便最初启用自身的实体已被禁用,除非玩家触发了另一个音景,或者地图发生变化

soundscape_flush
将取消当前正在播放的音景
音景相关实体
音景可由以下实体播放:
- env_soundscape
- env_soundscape_triggerable (通常由trigger_soundscape 激活)
- env_soundscape_proxy (通常反过来激活env_soundscape或者env_soundscape_triggerable)
音景本身是基于点实体 ,但是当玩家处在所属半径内并且视野内可见时,即可触发它们
不过env_soundscape_proxy和env_soundscape_triggerable是两个例外,前者通过env_soundscape或者env_soundscape_triggerable触发;后者通常由trigger_soundscape触发
由于一次只能播放一个音景,因此如果同时触发一个或多个音景,则位置最近的优先(音景实体的半径范围始终优先于trigger_soundscape的边界框)
注意音景不会玩家离开其半径范围或者视野内不可见而停止播放

音景放置
一般来讲,只放置你绝对需要的音景数量。先选择一个需要全局播放的音景,之后在每个特殊位置(如房屋,发电机房)放置特定于该场景的次要音景。确保每个具有位置的局部音效都有自己的主音景,并指定了适当的目标实体。
一旦你大致了解了音景的位置,你就可以开始添加/配置触发音景的实体,并创建一种蓝图,说明音景如何从一个流向另一个。在许多情况下,你会放置实体来阻挡对比位置的所有出口,并触发全局音景。
基本上,目标是预测玩家在整个地图上的移动,并以一种始终激活正确音景的方式阻挡每个区域。
在音景内多次使用同一音效
目前在大多数起源游戏/分支中,一次只能在音景内同时播放一个或多个相同的音效,即便音量,音调和SoundLevel有差异
(存在于自 以来)此问题已得到修复,允许音景同时播放多个相同的音效
有一种不是办法的办法,即复制粘贴并重命名音效,适用于一些非常短的音效(如灯光的嗡嗡声)但不推荐用于其他音效,因为会增加冗余的文件大小。这是V社在CSS版野战训练营中使用的解决方法:在T家厨房里,有两个发出嗡嗡声的荧光灯。但第一个音效是"ambient/machines/fluorescent_hum_1.wav
"而第二个音效是"ambient/machines/fluorescent_hum_2.wav
"。这两个音效完全一样,但由于上述问题必须使用不同的名字才能用于音景
另一个示例如下:我们有三盏需要发出嗡嗡声的荧光灯。为了使其正常运作,音景文件和实体配置应该如下
"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 有很多相似之处,但两者仍然是完全不同的体系
音景需要一些独有的规则,并放置在独立于普通Soundscript的纯文本文件中。通常会命名为soundscape_mall.txt
并且可能包含 5 到 30 个不同的音景,这些音景采用以下语法


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

suppress_on_restore <boolean >
- 防止在加载存档后重新播放音效
提示:可用于音景内播放的音乐
随机值
一些参数接受“最大”和“最小”范围,例如
"pitch" "80,120"
每当执行规则时,对应的参数将从“最大”与“最小”值之间随机取值
规则
playlooping
"playlooping" { "volume" "0.98" "pitch" "110" "soundlevel" "SNDLVL_85dB" "position" "0" "wave" "ambient/swamps/water_Lap_loop_st.wav" }
循环播放音效,不允许随机值


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
内部(即便只有一个音频)每次执行规则时都会随机播放音效。

playsoundscape
"SubScape" { "playsoundscape" { "name" "GenericIndoor" //子音景音量缩放到50% "volume" "0.5" //从位置0发出所有带位置的音效 "positionoverride" "0" //从位置1发出所有环境音效 "ambientpositionoverride" "1" } }
播放完整的音景,子音景中的DSP预设将被忽略
name
- 需要播放的音景名称
position <integer >
- 用于偏移子音景每个位置的索引值
- 例如,如果偏移值为2,则子音景中位于位置0、1、2、3播放的音效,在主音景中会偏移到位置2、3、4、5
positionoverride <integer >
- 强制子音景中所有指定位置的音效从主音景的一个位置发出。
ambientpositionoverride <integer >
- 强制子景观中所有未指定位置的音效(即环境音)从主音景的一个位置发出。
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 >
- dsp_volume <float >
设置当前DSP预设。"dsp" "1"将从附近材质 的表面属性 中提取
对于参数列表,请查看scripts\dsp_presets.txt
文件。可能需要使用如VPKEdit 之类的软件从游戏VPK中提取文件。要预览DSP预设,请在控制台使用room_type <int>
指令


dsp_volume
来控制DSP效果的强度

"dsp_spatial" "n"
和房间DSP类型一起分配给音景fadetime <float>
"SoundScapeName" { "fadetime" "1.0" "playlooping" { // ... } }
音效淡入的时间(以秒为单位)
soundmixer <string>
"quiet" { "soundmixer" "Citadel_Dialog_Only" // ... }
选择一个自定义混音器 ,混音器控制一组音效的优先级和音量,关于如何新建混音器,参见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" } } }

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


maps/%地图名%_soundscapes.txt
当不需要/不可能修改音景清单时,应使用地图专用音景(例如没有独立游戏目录的自定义地图),此文件也可以被压缩进地图中
可以通过在底部添加新的“file”行将新的音景添加到清单中,如下所示:
"file" "<文件路径>"


maps/%地图名%_level_sounds.txt
以类似的方式进行挂载,但地图专用音景必须放置在scripts
文件夹并带有soundscapes_
前缀使用“XBLAH的模组制作工具”创建音景
音景现在可以通过 XBLAH's Modding Tool进行创建或修改,其工具界面提供了集成的资源管理器来直观的创建新的音景,这可以让用户预览所有已挂载的音频(无论是VPK内音频或松散未打包音频),让用户单独查看音景文件,并预览音景是如何在游戏内播放的
如何使用
可以通过工具内部的Sounds > Soundscape Editor工具栏使用音景编辑器
参见
- env_soundscape
- env_soundscape_proxy
- env_soundscape_triggerable
- trigger_soundscape
- Notepad++ VDF languages
|