Zh/Soundscape: Difference between revisions

From Valve Developer Community
< Zh
Jump to navigation Jump to search
(Created page with "{{LanguageBar}} <!-- Add the categories to the main page, not here. Some template, such as {{This is a}}, and all Table templates should be placed to the main page. --> {{subpage|Sound and Music}} '''Soundscape(音景)'''是一种音效脚本,用于向地图添加环境音效,它在地图中的数量没有严格限制,只需一个实体即可完成所有步骤,并且不会产生任何网络开销。音景通常为循环音效和随机音效的组合,...")
 
m (Setting bug notice hidetested=1 param on page where the bug might not need tested in param specified)
 
(3 intermediate revisions by one other user not shown)
Line 4: Line 4:
{{subpage|[[Sound and Music]]}}
{{subpage|[[Sound and Music]]}}


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


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


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


==音景==
==音景==
Line 34: Line 34:
===配置音景===
===配置音景===
音景只能通过以下实体进行配置:
音景只能通过以下实体进行配置:
*[[env_soundscape]]
*{{L|env_soundscape}}
*[[env_soundscape_triggerable]]
*{{L|env_soundscape_triggerable}}
还有其他实体可以启用音景,但只有上述这些真正定义了音景的属性。其他实体将以此为主实体远程控制音景
还有其他实体可以启用音景,但只有上述这些真正定义了音景的属性。其他实体将以此为主实体远程控制音景
每当这些实体启用音景的时候,任何具备预定义位置的音效都将会从音景实体指定的Sound Position实体位置触发
每当这些实体启用音景的时候,任何具备预定义位置的音效都将会从音景实体指定的Sound Position实体位置触发
{{tip|许多音景定义了声音发出的位置,因此最好查看音景条目并了解您可以做什么。大部分音景条目都可以在<code><game>/scripts/soundscapes_manifest.txt</code>文件找到。要更好的理解音景,[[Soundscape#Custom_Soundscapes|详见下方]]。}}
{{tip|许多音景定义了声音发出的位置,因此最好查看音景条目并了解您可以做什么。大部分音景条目都可以在<code><game>/scripts/soundscapes_manifest.txt</code>文件找到。要更好的理解音景,{{L|Soundscape#Custom_Soundscapes|详见下方}}。}}


===激活音景===
===激活音景===
Line 48: Line 48:
音景可由以下实体播放:
音景可由以下实体播放:


*[[env_soundscape]]
*{{L|env_soundscape}}
*[[env_soundscape_triggerable]] (通常由[[trigger_soundscape]]激活)
*{{L|env_soundscape_triggerable}} (通常由{{L|trigger_soundscape}}激活)
*[[env_soundscape_proxy]] (通常反过来激活env_soundscape或者env_soundscape_triggerable)
*{{L|env_soundscape_proxy}} (通常反过来激活env_soundscape或者env_soundscape_triggerable)


音景本身是基于[[point_entities|点实体]],但是当玩家处在所属半径内并且[[line of sight|视野内可见]]时,即可触发它们
音景本身是基于{{L|point_entities|点实体}},但是当玩家处在所属半径内并且[[line of sight|视野内可见]]时,即可触发它们


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




{{tip|使用[[cvar|控制台指令]] [[soundscape_debug]]来检查哪些音景处于播放状态}}
{{tip|使用{{L|cvar|控制台指令}}{{L|soundscape_debug}}来检查哪些音景处于播放状态}}
 


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


此问题已{{csgo|since}}得到修复,允许音景同时播放多个相同的音效
{{csgo|since}}此问题已得到修复,允许音景同时播放多个相同的音效
{{clarify|是否已在CSGO前的起源游戏/分支中修复?}}
{{clarify|是否已在CSGO前的起源游戏/分支中修复?}}


Line 120: Line 119:
==自定义音景==
==自定义音景==
===创建===
===创建===
音景脚本的语法和[[Soundscripts]]有很多相似之处,但两者仍然是完全不同的体系
音景脚本的语法和{{L|Soundscripts}}有很多相似之处,但两者仍然是完全不同的体系


音景需要一些独有的规则,并放置在独立于普通Soundscript的纯文本文件中。通常会命名为<code>soundscape_mall.txt</code>并且可能包含 5 到 30 个不同的音景,这些音景采用以下语法
音景需要一些独有的规则,并放置在独立于普通Soundscript的纯文本文件中。通常会命名为<code>soundscape_mall.txt</code>并且可能包含 5 到 30 个不同的音景,这些音景采用以下语法
{{bug|如果音景名字过长,则可能音景实体无法在游戏中触发,尽管仍可以通过控制台触发,目前尚不清楚具体的最大字符上限}}
{{bug|hidetested=1|如果音景名字过长,则可能音景实体无法在游戏中触发,尽管仍可以通过控制台触发,目前尚不清楚具体的最大字符上限}}
{{tip|可以使用{{code|<nowiki>#include</nowiki>}}来嵌套其他音景文本}}
{{tip|可以使用{{code|<nowiki>#include</nowiki>}}来嵌套其他音景文本}}
{{pre|
{{pre|
Line 139: Line 138:


===常见参数===
===常见参数===
; <code>wave <[[string]]></code>
; <code>wave <{{L|string}}></code>
: 要播放的音频文件名称,路径相对于<code>game\sound\</code>目录{{tip|尽管键值名称如此,但实际可以播放游戏支持的任何音频格式}}
: 要播放的音频文件名称,路径相对于<code>game\sound\</code>目录{{tip|尽管键值名称如此,但实际可以播放游戏支持的任何音频格式}}
<!--Not explicitly mentioning MP3: while only WAV and MP3 are supported in vanilla first-party titles, third-party games and mods can add other types (ex: Black Mesa adds Ogg Vorbis).}}-->
<!--Not explicitly mentioning MP3: while only WAV and MP3 are supported in vanilla first-party titles, third-party games and mods can add other types (ex: Black Mesa adds Ogg Vorbis).}}-->
; <code>volume <[[normal]]></code>
; <code>volume <{{L|normal}}></code>
: 1为最大音量,0为静音
: 1为最大音量,0为静音
; <code>pitch <[[integer]]></code>
; <code>pitch <{{L|integer}}></code>
: 百分比值,有效范围通常为70-130
: 百分比值,有效范围通常为70-130
; <code>music <[[boolean]]></code> {{ship|only}}
; <code>music <{{L|boolean}}></code> {{ship|only}}
: 音效会被视为游戏音乐,并受到音量设置中音乐设置的影响,类似于[[sound character|声音标识符]]{{code|<nowiki>#</nowiki>}},只是其受[[DSP]]影响并具备空间性
: 音效会被视为游戏音乐,并受到音量设置中音乐设置的影响,类似于[[sound character|声音标识符]]{{code|<nowiki>#</nowiki>}},只是其受[[DSP]]影响并具备空间性
[[File:Sound_attenuation.jpg|right|200px]]
[[File:Sound_attenuation.jpg|right|200px]]
Line 154: Line 153:
: 同上,但音效从玩家附近的任意位置发出
: 同上,但音效从玩家附近的任意位置发出
; <code>origin <origin></code> {{l4d|since}}
; <code>origin <origin></code> {{l4d|since}}
: 在特定坐标播放音效,格式为<tt>"0,0,0"</tt>不同轴的坐标必须以逗号进行分割,但可以包含前后空格 {{note|功能上类似于<code>position</code>但在何处播放音效完全由脚本定义。仅适用于单张地图专用的音景,因为在其他地图里你无法更改声音发出的位置}}
: 在特定坐标播放音效,格式为<tt>"0,0,0"</tt>不同轴的坐标必须以逗号进行分割,但可以包含前后空格 {{note|功能上类似于<code>position</code>,但在何处播放音效完全由脚本定义。仅适用于单张地图专用的音景,因为在其他地图里你无法更改声音发出的位置}}
; <code>attenuation <[[float]]></code>
; <code>attenuation <{{L|float}}></code>
: 当玩家视野远离音源时,音效音量下降的速度。只有在指定position的情况下有效。默认值为1.00。值越低,声音的半径就越大。相反,值越高,声音的半径就越小。请参见上图示例
: 当玩家视野远离音源时,音效音量下降的速度。只有在指定position的情况下有效。默认值为1.00。值越低,声音的半径就越大。相反,值越高,声音的半径就越小。请参见上图示例
; <code>soundlevel <string></code>
; <code>soundlevel <{{L|string}}></code>
: 可用于代替<code>attenuation</code>,接受[[Soundscripts#SoundLevel|引擎提供的预设值]].
: 可用于代替<code>attenuation</code>,接受[[Soundscripts#SoundLevel|引擎提供的预设值]].
{{warning|所有包含空格的键值都需要用双引号括住}}
{{warning|所有包含空格的键值都需要用双引号括住}}
; <code>suppress_on_restore <0 or 1></code>
; <code>suppress_on_restore <{{L|boolean}}></code>
: 防止在加载存档后重新播放音效{{tip|可用于音景内播放的音乐}}
: 防止在加载存档后重新播放音效{{tip|可用于音景内播放的音乐}}


Line 186: Line 185:
循环播放音效,不允许随机值
循环播放音效,不允许随机值


{{note|除非有标记点,否则音效将不会缩放,详见[[Looping a Sound|如何创建循环音效]]}}
{{note|除非有标记点,否则音效将不会缩放,详见{{L|Looping a Sound|如何创建循环音效}}}}
{{bug|如果触发了另一个包含相同循环播音效的音景,但该声音具有不同的音高(Pitch)值,则声音将停止播放,除非从不包含该声音的音景重新触发前者}}
{{bug|hidetested=1|如果触发了另一个包含相同循环播音效的音景,但该声音具有不同的音高(Pitch)值,则声音将停止播放,除非从不包含该声音的音景重新触发前者}}
{{clr}}
{{clr}}
====playrandom====
====playrandom====
Line 215: Line 214:


{{warning|注意不要在该组中指定任何循环音效,因为即便切换到不同的音景,它们也无法被停止播放}}
{{warning|注意不要在该组中指定任何循环音效,因为即便切换到不同的音景,它们也无法被停止播放}}
:{{note|如果切换到不同的音景,即便是以MP3为格式的非循环音效也无法被停止(Tested in {{css}}{{confirm}})}}
:{{note|如果切换到不同的音景,即便是以MP3为格式的非循环音效也无法被停止(已在{{css}}中测试{{confirm}}}}
{{clr}}
{{clr}}


Line 241: Line 240:
; <code>name</code>
; <code>name</code>
: 需要播放的音景名称
: 需要播放的音景名称
; <code>position <int></code>
; <code>position <{{L|integer}}></code>
: 用于偏移子音景每个位置的索引值
: 用于偏移子音景每个位置的索引值
: 例如,如果偏移值为2,则子音景中位于位置0、1、2、3播放的音效,在主音景中会偏移到位置2、3、4、5
: 例如,如果偏移值为2,则子音景中位于位置0、1、2、3播放的音效,在主音景中会偏移到位置2、3、4、5
; <code>positionoverride <int></code>
; <code>positionoverride <{{L|integer}}></code>
: 强制子音景中所有指定位置的音效从主音景的一个位置发出。
: 强制子音景中所有指定位置的音效从主音景的一个位置发出。
; <code>ambientpositionoverride <int></code>
; <code>ambientpositionoverride <{{L|integer}}></code>
: 强制子景观中所有未指定位置的音效(即环境音)从主音景的一个位置发出。
: 强制子景观中所有未指定位置的音效(即环境音)从主音景的一个位置发出。
{{clr}}
{{clr}}
Line 266: Line 265:
}
}
}}
}}
;dsp_spatial <[[integer]]>
;dsp_spatial <{{L|integer}}>
;;dsp_volume <[[float]]>
;;dsp_volume <{{L|float}}>


设置当前[[DSP]]预设。{{code|"dsp" "1"}}将从附近[[material|材质]][[$surfaceprop|表面属性]]中提取
设置当前[[DSP]]预设。{{code|"dsp" "1"}}将从附近{{L|material|材质}}{{L|$surfaceprop|表面属性}}中提取


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


{{note|在为需要用于许多不同场景的音景设置预设时要谨慎使用}}
{{note|在为需要用于许多不同场景的音景设置预设时要谨慎使用}}
Line 305: Line 304:
}
}
}}
}}
选择一个自定义[[soundmixer|混音器]],混音器控制一组音效的优先级和音量,关于如何新建混音器,参见<code>scripts\soundmixers.txt</code>(默认情况下始终使用Default_Mix作为模板)
选择一个自定义{{L|soundmixer|混音器}},混音器控制一组音效的优先级和音量,关于如何新建混音器,参见<code>scripts\soundmixers.txt</code>(默认情况下始终使用Default_Mix作为模板)
{{clr}}
{{clr}}
===示例===
===示例===
Line 380: Line 379:
}}
}}


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


===储存与使用自定义音景===
===储存与使用自定义音景===
Line 414: Line 413:
{{soundscape lists}}
{{soundscape lists}}


[[Category:Sound System]]
{{ACategory|Sound System}}
[[Category:Level Design]]
{{ACategory|Level Design}}
[[Category:Plain text formats]]
{{ACategory|Plain text formats}}
[[Category:Plain text files]]
{{ACategory|Plain text files}}
[[Category:Tutorials]] <!-- due to XBLAH's Modding Tool -->
{{ACategory|Tutorials}} <!-- due to XBLAH's Modding Tool -->

Latest revision as of 07:24, 20 May 2025

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错误:如果音景名字过长,则可能音景实体无法在游戏中触发,尽管仍可以通过控制台触发,目前尚不清楚具体的最大字符上限
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)值,则声音将停止播放,除非从不包含该声音的音景重新触发前者

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

参见