UDK声音系统

修改
鏉ユ簮: 上帝宝贝 浏览 13263 日期 2011-08-29 0

朱峰社区:这节讲UDK声音系统方面的知识,这节课内容很多,讲的很详细。而且是图文结合的形式,容易接受!希望大家能学以致用!

指南18.1:导入WAV并创建您的第一个SoundCue

1. 启动UnrealEd并打开Generic Browser,从Generic Browser的“文件”菜单选择“导入”。

2.在“导入”窗口找到DVD上本章文件中的“sound_1_plink”,单击“打开SoundFactory”窗口,选择“SoundFactory”并单击“确定”。

确定“SoundFactory”被选择。

3. 创建SoundCue的第一个方法是在导入一个声音时自动生成。在“导入”窗口,为“sound_1_plink”输入以下信息:

* Package: MySoundTest * Group: * Name: sound_1_plink

确定勾选“bAutoCreateCue”,但不要勾选“bIncludeAttenuationNode”。

“导入”窗口应如图所示。

然后单击“确定”按钮。声音文件会出现在upk包内,这时会有一个自动连接到该声音文件的“SoundCue”对象。记得保存这个包文件。

4.创建SoundCue的第二个方法是导入一个声音文件,然后实际创建一个新的SoundCue并手动将声音粘贴到它上面。在Generic Browser中,选择“文件”>“导入”,并找到DVD上本章文件中的“sound_2_bom”文件,单击“打开”。“导入”窗口会再次出现,输入以下信息:

* Package: MySoundTest * Group: * Name: sound_2_bom

勾选“bAutoCreateCue”和“bIncludeAttenuationNode”。

接下来单击“确定”。这时没有创建新的SoundCue,可以自己建。

注意因为没有勾选“bAutoCreateCue”属性,我们没有得到新的SoundCue。

5.在Generic Browser的空白区域右键单击,选择“新建SoundCue”。在“新建”窗口输入以下信息:

* Package: MySoundTest * Group:: * Name::sound_2_bomCue * Factory::SoundCue

然后单击“确定”按钮,将出现新的SoundCue编辑器。我们现在将把“sound_2_bom”文件连到这个新的SoundCue。

[next]

SoundCue编辑器将打开。

6.在Generic Browser中选择“sound_2_bom”声音文件,然后在SoundCue编辑器在大的扬声器图标右侧空白区域右键单击,从上下文菜单选择“SoundNodeWave:sound_2_bom”。声音文件出现后会命名一个新节点。

在右键单击的地方会出现新的“SoundWaveNode”。

7.和我们想的一样,在Kismet编辑器中,从新声音节点的右侧黑框拉一条连线,到扬声器图标右侧的小黑框,这将使声音文件和SoundCue联系起来。

注意SoundCue Editor的流程从右至左移动。

8.关闭SoundCue编辑器并保存包。您现在可以双击新的SoundCue并听到音效的播放。

<<<< 指南结束

指南18.2:使用环境声音简化Actor

1.启动UnrealEd并打开DVD上本章文件中的“SimpleSoundStage”关卡,在Generic Browser中打开同样包含在DVD上本章文件中的“SoundTest”包。

本节课,我们会了解AmbientSoundSimple actor,并看一下如何利用它把音效放入关卡,而无需使用SoundCue。

2.打开Actor Classes Browser,并展开Keypoint,您会看到AmbientSound actor。展开AmbientSound actor,会看到AmbientSoundSimple,选中这个actor。您不必在浏览器中选择这个actor,因为任何时候在Generic Browser中选中一个声音文件,都能自动获得放置AmbientSoundSimple actor的选项。在Generic Browser中,选中包中的“sound_3_pulsingHum USound”(不要错选成SoundCue)。

AmbientSoundSimple actor隐藏在Keypoint actor的下面。

3.在“透视”视图中,右键单击并从上下文菜单选择“添加Actor”>“AmbientSoundSimple: sound_3_pulsingHum”。在选中一个声音文件后才能放置这个actor。

AmbientSoundSimple actor已被放置。

4.打开“属性窗口”(F4),展开AmbientSoundSimple标 签,并展开“环境属性”。您会看到衰减和空间化音效的选项,这会在本章后面讨论。现在,看一下“最小” 和“最大半径”,这些属性允许您创建一个音效的球体,在其中可以听到声音。您也会注意到“最小”和 “最大半径”属性有它们自己的属性子集,它们用于使音效随机选择,这样就不会总是听到在同一地点获得的同样的声音了。

[next]

5.因为不需要任何随机选择,所以设置MaxRadius的“最小”和“最大”值均为500个单位。然后,设置MinRadius“最小”和“最大”属性为100个单位。这意味着声音将会从距离声源500个单位时开始听到,然后在100个单位以内时音量放到最大。

“属性窗口”如图所示。

6.在透视视图单击“实时”按钮,将镜头推近actor,音效会在进入音效球体内时开始播放。

7.运行关卡随意测试效果,完成后不必保存。

<<<< 指南结束

The AmbientSound Actors (环境音效)

所有AmbientSound actor都使用这个图标。

AmbientSound

在Actor Classes Browser中的位置:

Keypoint > AmbientSound

AmbientSound actor允许在关卡中放置发音actor。它使用SoundCue而不是声音文件。它的属性非常简单,因为多数对声音的控制将来自SoundCue Editor中SoundCue的自身设置。

AmbientSoundSimple

在Actor Classes Browser中的位置:

Keypoint > AmbientSound > AmbientSoundSimple

这个actor有点像AmbientSound actor,它只能接受一个未加工的声音文件,而不是必须使用SoundCue。它还带有内部属性用以控制衰减、空间化和调制,因为您不会用SoundCue编辑器来生成这样的音效。

AmbientSoundNonLoop

在Actor Classes Browser中的位置:

Keypoint > AmbientSound > AmbientSoundSimple > AmbientSoundNonLoop

AmbientSoundNonLoop是AmbientSoundSimple actor的补充,可播放WAV文件。您需要在Actor Classes Browser中选中这个actor,以便将其放在关卡中。它的好处是,不会随意地自动循环播放声音文件,就像AmbientSoundSimple actor那样。

AmbientSoundSimpleToggleable

在Actor Classes Browser中的位置:

[next]

Keypoint > AmbientSound > AmbientSoundSimple > AmbientSoundSimpleToggleable

这个actor也是AmbientSoundSimple actor的补充,意味着它将使用WAV而非SoundCue。它可以通过Kismet序列触发打开或关闭,它的好处是,当它被触发时有自己的淡入和淡出设置。

18.2:SoundCue编辑器

SoundCue编辑器功能非常像Kismet和“材质编辑器”,为您提供可视化的界面,来处理声音和适用于它们的各种修改器。它的界面分为三个重要的区域:预览回放按钮、可视化布局图、属性编辑器。

SoundCue 编辑器用户界面

预览按钮包括:

* “播放SoundCue” --.jpg用于收听SoundCue网络的最终结果。 * “播放选中的节点” .jpg允许在选中节点播放网络结果。 * “停止”.jpg终止回放。

当观察布局图时,您会看到一个大的扬声器图标,这是SoundCue本身的图标。如果在它上面单击,SoundCue的属性就会出现在属性编辑器区域。这些属性使您可以在全局上改变整个SoundCue的性质,而仅仅是在个别节点上改变。

编辑器的真正强大之处在于在WAV和SoundCue图标间可以连接的各种节点,您可以使用这些节点来创建精细的网络,将声音转换为更复杂和丰富的内容。下面是SoundCue编辑器中的可用节点。

SoundNodeWave(声音节点)

SoundWave节点

该节点有助于引入SoundCue的声音文件。每个SoundCue中的WAV文件都将有自己的SoundNodeWave。

Attenuation(衰减)

这个通常使用的节点允许游戏声音创建的两个最重要特性:“衰减”和“空间化”。“衰减”实际上是在玩家离开时声音变弱的能力。它通过两个半径起作用:MinRadius与MaxRadius。如果您从声源走开并通过MinRadius,声音音量会是100%。当您从MinRadius到MaxRadius时,音量从100%到0呈线性减弱,减弱发生的速度取决于DistanceModel属性,它提供了几种下降曲线来控制半径间的音量。一旦走出MaxRadius之外,您就在声音的界限以外,什么都听不到了。

每一MinRadius和MaxRadius属性也有各自的“最小”和“最大”属性子集,它们允许游戏中每次SoundCue被触发时半径的随机选择。如果不要求随机选择,就将“最小”和“最大”值设为同一数字。

[next]

空间化是声音系统在3D空间使声音本地化的能力,提供一种“环绕声”风格的特效。它取决于bSpatialize属性。如果该属性不活动,声音会在两个(或更多)扬声器间音量相等地播放,就不能提示它源于何方。

如果想使SoundCue展示衰减和空间化,需要将该节点连接到图形,并将bAttenuate和bSpatialize属性设为“真”(勾选)。

Concatenator(连接器)

连接器节点。

这个节点允许将两个或更多声源串接在一起按顺序播放它们。通过右键单击节点并从上下文菜单选择“添加输入”,可以向该节点添加更多输入。通过在未用的输入方块上右键单击并从上下文菜单选择“删除输入”,可以移除输入。

Delay(延迟)

延迟节点。

这将放置一个数秒的延迟,它由节点内的“最小”和“最大”属性指定。每次SoundCue被触发,“最小”和“最大”值间的范围都会指定一个随机选择,如果不需要随机选择,就将两个值设为同一数字。

Distance CrossFade(距离交叉衰减)

Distance CrossFade节点

这个外形有些复杂的节点允许在多重声音间淡入淡出,这取决于玩家距离声源有多远。各输入都有FadeInDistance与FadeOutDistance,而这两种属性都有“最小”和“最大”值,允许您指定在多远的距离淡入淡出。例如,如果属性如下:

* Sound[0] o FadeInDistance + Min: 0.00 + Max: 0.00 o FadeOutDistance + Min: 1000.00 + Max: 1280.00 * Sound[1] o FadeInDistance + Min: 512.00 + Max: 640.00 o FadeOutDistance + Min: 1600 + Max: 2048

那么行为将会是(当您向声源移动时):距离声源2048个单位时,Sound[1]的声音会变大,到1600时变为全音量。距离1280时,Sound[0]会开始淡入,距离声源1000个单位时变为全音量。在该点,两个声音会同时以全音量播放。

距离声源640单位时,Sound[1]开始逐渐淡出,直到达到512单位时完全消失。自此以后,您就只能听到Sound[0],它不会淡出直到再次距离声源超过1600个单位。注意Sound[0]的FadeInDistance“最小”和“最大”均被设为0,意味着只要您在FadeOutDistance“最小”值以内,就会一直听到全音量的声音。这些行为显示如下图:

[next]

(注:该图中的“体积”应更正为“音量”)

在对Distance CrossFade的描述中演示的音量衰减图表。

通过右键单击节点并从上下文菜单选择“添加输入”,可以向该节点添加更多输入。通过在未用的输入方块上右键单击并从上下文菜单选择“删除输入”,可以移除输入。

Looping(循环 )

循环节点。

该 节点重复已连接的声音,重复次数在“最小”和“最大”属性中指定。本例中,“最小 ”和“最大”代表一定程度的随机选项。如果不想要随机选项,就将这两个数字设为同一值,默认设置为1,000,000,对大部分音效来说,它考虑到了足够多的无穷循环。

SoundNodeMature(成人声音节点)

SoundNodeMature节点

此节点允许标记某音效为“十八禁”,这样如果游戏将其成人内容设为非活动时,就可以将其排除在外。例如,如果将一列语句排列,其中某句含有亵渎的语言,您可以对这句使用SoundNodeMature,确保如果用户关闭游戏中的成人内容时,它不会播放出来。这只在SoundWaveNode将其bMature属性设为真(勾选)时才有效。

注意:如果使用Unreal Engine3运行时,成人内容声音是由bAllowMatureLanguag属性控制的,该属性必须在ExampleEngine.ini文件中手动设置。默认设置为“False”。

Mixer(混音器)

混音器节点

“ 混音器”节点允许同时回放多重声音。可以在节点属性中调整各输入声音的音量,通过右键单击节点并从上下文菜单选择“添加输入 ”,可以向“混音器”节点添加更多输入。通过在未用的输入方块上右键单击并从上下文菜单选择“删除输入 ”,可以移除输入。

Modulator(调制器)

调制器节点

“调制器”节点允许调整声音的音高和音量。它有两个属性,PitchModulation和VolumeModulation,它们各自都有最小和最大值。这些值在每次SoundCue被触发时都提供一个随机选项。如果不需要,“最小”和“最大”就必须设为同一值。

关 于本节点的随机选项有一个有趣的地方:如果向“调制器”的输入(从右向左移动)插入一个循环节点,声音会以调制过的同一值重复,重复次数在循环中指定;然而,如果将“调制器”插入“循环”节点的输入,就能在每次循环开始时获得一个 随机化的值。

注意:在本文,调制的最高可能数量是2,最低为0.2。为得到最佳结果,请将调制值保持在这个限度内。

[next]

Continuous Modulator(持续调制器)

持续调制器节点

本节点允许根据游戏内的参数调整声音的音高和音量。例如,您可以根据车辆速度改变发动机的音高,或当玩家的健康值过低时改变预警音的音量。但是,本节点只能通过代码扩展,并且不能在SoundCue编辑器本身有效使用。

Oscillator(振荡器)

振荡器节点

“振荡器”节点允许通过使用正弦波连续调整声音的音高和/或音量。它非常适合于随时间在声音中进行精细的改变,或不断改变循环声音。除了控制调制音高或音量的两个属性(分别是bModulatPitch 和bModulateVolume)以外,该节点还有四个控制波形自身的属性,描述如下:

Amplitude振幅.jpg该属性控制波的高度。它有“最大’和”最小”值,可提供随机选择。

Center中心.jpg该属性控制波中心的值。它也有“最大”和“最小”提供随机选择。

Frequency频率.jpg它控制每秒会发生多少次振荡。值1表示每秒一次振荡,大于1的值会加速振荡,而分数值会降速。

Offset平移.jpg使波形向左或右边移动。

Random (随机)

随机节点

该节点可接收任意数量的输入声音,并在每次SoundCue被触发时随机选择其中一个。通过右键单击节点并从上下文菜单选择“添加输入”,可以向随机节点添加更多输入。通过在未用的输入方块上右键单击并从上下文菜单选择“删除输入”,可以移除输入。

该节点包含一个“权重”列表,允许调整一个声音相对另一个的播放概率。如果所有权重值相等,那么所有声音都有平均的机会被播放。

SoundNodeWaveParam(声音节点波形参数 )

SoundNodeWaveParam节点

该节点允许使用gameplay代码修改声音本身的各种属性。它只能通过代码扩展,不能在SoundCue编辑器自身有效使用。

指南18.3:在您的SoundCue中使用声音节点

1.启动UnrealEd并打开包含在DVD上本章文件中的SimpleSoundStage关卡和SoundTest包。

2.打开Generic Browser并找到SoundTest包。右键单击sound_1_plinkCue SoundCue,从上下文菜单选择SoundCue Editor。

SoundCue Editor生成叮铃音效。

[next]

假设我们想使该音效空间化,将其妥当地放置在3D空间,我们还想使其音高下降约50%。您会发现,在开始向SoundCue编辑器中加入节点前就知道您在期待什么效果是很有好处的。

3.首先,在SoundCue中靠近扬声器图标处右键单击,从上下文菜单选择“Attenuation(衰减)”。从sound_1_plink节点到“衰减”节点的输入(右侧)连结一条线,然后从“衰减”节点的输出(左侧)到扬声器图标的输入再连一条线。

任何时候想将声音放入3D空间,都必须使用“衰减”节点。

4.选中新的“衰减”节点并看一下它在“属性窗口”的设置。将MaxRadius的“最小”和“最大”属性都设置为1000,然后将MinRadius的“最小”和“最大”都设为500。

“衰减”节点的属性应如图所示。

5.选中sound_1_plink节点并将其稍微右移,为新节点腾出空间。然后右键单击并从上下文菜单选择“Modulator(调制器)”。将新“调制器”节点的输入(右侧)连至声波节点,并将输出(左侧)连至“衰减”。

新“调制器”已被连接。

6.选中新“调制器”并观察其属性。它可以调节音高和音量,但目前我们只关心音高。在PitchModulation的“分布”下,设置“最大”为2.0,“最小”为0.5,它们是这些属性的最值,并将带来宽广范围的变化。

7.单击“播放SoundCue” 按钮数次,注意每次回放的差别。

8. 保存Package包文件。

<<<< 指南结束

指南18.4:创建一个更复杂的SoundCue

接前一指南,或启动UnrealEd并打开包含在DVD上本章文件中的SimpleSoundStage关卡和SoundTest包。我们现在将使用SoundCue编辑器创建一个更复杂的SoundCue设置。

我们将使用一个风声片段,通过调制制作几个版本,并将它与雷声随机混合。

1.首先,打开Generic Browser,选择SoundTest包,并在浏览器中右键单击,从上下文菜单选择“新建SoundCue”。用以下信息命名该SoundCue:

* 包:MySoundTest* 组: *名称:sound_windAndThunder * 工作组: SoundCue

新的SoundCue一出现,就右键单击它并从上下文菜单选择SoundCue编辑器。

2.在Generic Browser中选择sound_wind音效,然后在SoundCue编辑器中右键单击并选择SoundNodeWave: sound_wind。对sound_thunder音效重复该过程。

[next]

为风声和雷声音效放置SoundWaveNode。

3.创建一个新“调制器”节点并将“风”声音节点与其连接。调整ModulatePitch属性,提供一个介于0.8和1.5的随机调制。

将新的“调制器”贴附到风。

4.添加一个新的“混音器”节点,将“调制器”连到它最顶端的输入。由于我们不会削弱该音效,所以可以将“混音器”的输出直接连到SoundCue的扬声器图标。

已添加一个“混音器”。

5.创建一个新“随机”节点,将其连到“混音器”的第二个输入。然后右键单击这个新随机节点并从上下文菜单选择“添加输入”,重复该过程创建“随机”节点的全部六个输入。

向新的“随机”添加四个输入。

6.将sound_thunder声波节点连到“随机”的第一个输入。在“随机”的属性中,确定不勾选bRandomizeWithoutReplacement。

7.创建一个新的“调制器”,将sound_thunder与它连接。在“调制器”的属性中,设置VolumeModulatio的最小和最大均为0.0,造成静音。然后,将这个调制器同“随机”的剩下全部五个输入连接。

最终网络应如图所示。

8.按Play SoundCue按钮数次,您会听到随机调制的风声,夹杂着偶然的雷声。自然,您可以添加不同的雷声以改变效果,甚至附加其他节点使最后的SoundCue更加复杂。然而现在, 您可以很好地理解怎样运用SoundCue编辑器的节点和连接了。

<<<< 指南结束

指南18.5:使用距离衰减节点

1.启动UnrealEd,并打开包含在DVD上本章文件中的SimpleSoundStage和SoundTest。

2. 使用本章目前所讲述的技巧在SoundTest包创建一个新的SoundCue,将其命名为DistanceCrossFadeTest。

3.打开SoundCue编辑器,为下列在SoundTest包中找到的各音效添加一个新的SoundWaveNode。

* sound_C_Tone * sound_E_Tone * sound_G_Tone

4.在SoundCue编辑器中右键单击并添加一个新的Distance CrossFade节点。立即在新节点上右键单击并从上下文菜单选择“添加输入”。然后将声波节点按如下方式连到Distance CrossFade:

* sound_G_Tone -> First input * sound_E_Tone -> Second input * sound_C_Tone -> Third input * Distance CrossFade Output -> SoundCue input

[next]

音调和Distance CrossFade的连接如图所示。

5.选中Distance CrossFade并观察其属性窗口,您可以以任意距离间隔设置各个声音淡入淡出,但为了有秩序,我们将从内部开始向外进行,请使用以下步骤:

注意:本例中,我们想让所有声音叠加,就像钢琴的和声,所以我们将FadeOutDistance的最小和最大值都设为0,意味着当我们靠近声源时音调不会淡出。

    1. 针对element [0] (G_Tone),设置FadeInDistance最小为500,最大为750。

b.针对element [1] (E_Tone),设置FadeInDistance最小为1250,最大为1500。

c.针对element[2] (C_Tone),设置FadeInDistance最小为1750,最大为2000。

6.保存包,然后在Generic Browser中选择DistanceCrossFadeTest SoundCue。在关卡地面上一个靠近边缘的位置右键单击,并选择“添加actor”>“添加AmbientSound: DistanceCrossFadeTest”,在关卡放置一个AmbientSound actor。

AmbientSound actor将作为声音的声源。

7.测试关卡。即使看不到AmbientSound actor,在您走近时声音也会添加一层。看看您能不能使用变化着的声音来估计actor的位置!

<<<< 指南结束

指南18.6:使用Kismet触发SoundCue

注意:由于Kismet的多功能特性,几乎有无限多种方法来触发音效。因此,该指南会用几个事件仅仅为我们展示基础的部分,剩下的要靠您在第10章对Kismet的学习和用Unreal处理可视化脚本的经验而定。

1.启动UnrealEd并打开包含在DVD上本章文件中的SimpleSoundStageTriggers关卡和SoundTest包。这个关卡显示了一个可视的触发器和一个通红的Volume。

SimpleSoundStageTrigger关卡内有一个触发器和一个体积。

2.单击“打开Kismet”按钮打开“Kismet编辑器”。右键单击并选择“新建事件”>“关卡启动”,然后右键单击并选择“新建动作”>“声音”>“播放声音”。将“关卡启动”的“出”连接到“播放声音”的输入。

[next]

新的Kismet网络如图所示。

3.选择“播放声音”,并观察属性窗口,会看到有控制器可以设置初始延迟,使声音淡入淡出,并增加音高和音量。

选择PlaySound属性,并使用Generic Browser将sound_startVoiceCue SoundCue放在属性内。如果测试关卡,您会在关卡一开始就听到这段语音剪辑。

,

PlaySound属性窗口如图所示。

注意:如果该音效需要空间化,您需要将一个包含关卡actor的对象变量粘贴到序列对象底部的“目标”输入。引擎将使用这个或这些actor的位置来确定声音在3D空间中的位置。

4.单击“Search for Actors”按钮并找到TrigerVolume_0,双击选中它,然后在Kismet编辑器右键单击,并从上下文菜单选择“New Event using Trigger_0 > Touched”,然后在“属性窗口”为该事件设置MaxTriggerCount的属性为0。

您现在已经为TriggerVolume_0创建了一个“Touch(接触)”事件。

5.创建一个“播放声音”序列对象,将其连接到新事件的“已接触”输出。使用上面获得的技巧,将sound_volumeInCue SoundCue放在 PlaySound的属性中。

新网络如图所示。

6.创建第二个“播放声音”对象,将sound_volumeOutCue SoundCue 放入PlaySound的属性。将这个新对象连接到“Touched(接触)”事件的UnTouched输出。

您现在可以在离开体积时播放第二个声音了。

7.最后,在“透视”视图中选择Trigger_0,在Kismet编辑器中右键单击,并从上下文菜单选择“New Event using Trigger_0 > Used”。创建一个新的播放声音序列对象,无论何时使用触发器,它都会播放sound_triggerCue SoundCue。记着将触发器的MaxTriggerCount属性设置为0。

现在当您使用触发器时,也会听到一个声音。

8.保存并测试关卡,试用所有新的语音剪辑。

<<<< 指南结束

18.3:使用音乐

向关卡中添加音乐和只是播放声音稍微不同。Unreal提供了一个强大的系统,可以对基于多种游戏事件的多重乐曲的回放进行精细的控制,例如,您可以在进行战斗或在玩家HP值变低时播放某种类型的音乐。为了达到这样的目的,您需要了解Kismet内一些可以控制乐曲的节点,还有一点关于它们怎样共同使关卡的音乐合成尽可能流畅的理论。

[next]

但是首先,您需要对系统试图怎样工作的有个总的了解。音乐系统的思想是提供一个简捷的途径,使设计者可以只通过调用某段音乐的名称来启动它。不需要有许多不同的序列对象来播放不同的音乐选择,您可以仅仅将所有音乐保存为一个列表,就像点唱机,当需要时就点出一首。

Music Track(音轨)

MusicTrack 变量序列对象

“乐曲”仅仅是以SoundCue的形式保存了一段音乐的Kismet变量,它有一些重要的参数,列在它的“乐曲”属性下,允许向乐曲添加适当的SoundCue,也可以赋予它由TrackType属性定义的名称。同样列出的还有淡入淡出时间参数,以及淡入淡出音量。

Music Track Bank音轨库

MusicTrackBank变量序列对象

这 是您的音乐列表。它允许您为各个希望在关卡中用到的乐曲添加一个索引。这可以用作多重“乐曲”的备用办法,取决于您对工作流程的选择。各添加的索引都有其独立的淡入时间和音量控制,还有轨道类型的独立名称。“乐曲库”可以在关卡设计过程手工设置,或根据玩家位置变化而动态选择。

CrossFadeMusicTracks (交叉衰减音轨)

CrossFade乐曲序列对象。

这个序列对象是音乐选择系统的DJ。您只需呼叫并告诉他您想听哪种音乐,他就会为您转换。用技术的话说,就是通过调用这个序列对象,输入一个包含您想要的TrackType的字符串,您就可以转换到保存在“乐曲库”中的任何乐曲。

设置音轨

设置乐曲序列对象

如果不够仔细,您可能开始想该序列对象是用来播放音乐的,但并非如此。存在“设置乐曲”对象是为了使您在gameplay中向“乐曲库”中添加乐曲,或者将某种乐曲换成另一种。

举个例子,假如您正从Level_1移动到Level_2,两个关卡都有其独立的“室外”音乐,并且这些“乐曲”都将其TrackType设为“室外”。通过使用“设置乐曲”对象,您可以将Level_1的“室外”音乐换成Level_2的“室外”音乐,以便下一次您告诉CrossFadeMusicTracks播放“室外”音乐时,您会听到Level_2的音乐而不是Level_1的。

工作流程选项

在Unreal中有两种主要方法来处理声音,您可以创建一个SoundCue,控制音乐播放方式的各个方面;您也可以通过一个AmbientSoundSimple actor,只是简单地处理WAV文件本身。两种方法各有优势。有两个主要方法来处理音乐系统,第一个是在设计关卡的过程中手动填充MusicTrackBank,这非常简单,只需在Kismet中选中MusicTrackBank,展开其MusicTrackBank属性,并为您将在关卡中使用的每一首歌曲添加一个新项目。这对于单独关卡来说是一种完美的工作流程,但它确是非常麻烦的,因为您需要将某特定歌曲同另一首进行交换。

[next]

第二种方法是动态更新你的音轨库,这种方法对查看哪首歌曲在您的库中特别有用,它对于动态载入的关卡来说非常适合。动态更新MusicTrackBank允许每一动态载入的关卡都有它们自己的乐曲选择。当玩家从一个关卡进入另一个关卡时,音乐系统能在后台交换乐曲,意味着下一次当播放某种类型的音乐时,就能获得为新关卡所设计的版本。我们会在下面的指南中探讨第二种方法。

这种方法的优点是,您只需向CrossFadeMusicTracks序列对象发送很少几条命令。您可以只告诉crossfader您想听到“室外”音乐,它就会为其中一个关卡播放室外音乐,而在不同的关卡同一命令仍将播放不同的音乐。

指南18.7:设置一个动态的音乐系统,第一部分:建立主音乐系统

注意:在进入本指南之前,请确认City_Persistent、City_Stream_01、City_Stream_02已复制到Unreal Engine运行时安装程序的内容/地图文件夹。该指南使用关卡流,这些文件都需要在地图文件夹使其正常工作。

1.启动UnrealEd并打开City_Persistent关卡,它包含一个在体积的使用中动态载入的的简化城市,这个稳固的世界中央包含一个大型体积,用来提示转换音乐。

我们的测试关卡是一个小城市的堆积。

2.我们需要做的第一件事就是创建常量,请完成以下步骤:

    1. 在Kismet编辑器中右键单击,并选择New Variable > Sound > Music Track Bank。

“乐曲库”已被创建。

b.选中新的“乐曲库”,在Kismet编辑器,把它的VarName属性设置为MyBank,其他属性暂且不动。

“乐曲库”的属性如图所示。

c.在Kismet编辑器中右键单击,并选择“New Variable > String”。把这个新字符串变量的VarName属性设置为TrackName。

完成后,变量应显示TrackName。

d.通过Ctrl-拖动使这两个对象互相靠近。

e.按住Ctrl-Alt,拖出一个选取框围住这两个变量,然后右键单击并选择“New Comment(新建注释)”,在出现的对话框中,输入“Variables”并按回车。

这两个变量已被注释。

3.我们现在需要建立游戏开始时的初始音乐选择,这可以通过动态使用“关卡启动”事件和三个SetMusicTrack对象来完成,然而为简化Kismet序列,我们将它们应用于此处,请按以下步骤完成:

[next]
    1. 选择MyBank MusicTrackBank,并打开Generic Browser。

b.在“Kismet编辑器”的“属性窗口”,选择MusicTrackBank属性并点击“添加新项目”三次。

您需要添加三个新位置以保存乐曲。

c.展开element [0]及其Params属性,并设置以下值:

* FadeInTime: 1 * FadeOutTime: 2 * TrackType: Outdoor * TheSoundCue: music_Outdoor_1Cue

注意:在以下步骤和子步骤中,TheSoundCue属性必须设置为使用 Generic Browser。

d.展开element [1]及其Params属性,并设置以下值:

* FadeInTime: 1 * FadeOutTime: 2 * TrackType: Indoor * TheSoundCue: music_Indoor_1Cue

e.展开element [2]及其Params属性,并设置以下值:

* FadeInTime: 1 * FadeOutTime: 2 * TrackType: Indoor室内 * TheSoundCue: music_TransitionCue

4.我们现在需要建立音乐选择系统的“大脑”.jpgCrossFadeMusicTrack对象。请完成以下步骤:

    1. 在Kismet编辑器中右键单击并选择“New Action > Sound > CrossFadeMusicTracks”,为简化,我们以后将用CrossFader指代它。

CrossFadeMusicTracks现已被添加。

b.选中CrossFade并设置它的TrackBankName属性为mybank。注意如果您用全部小写输入名称,一旦探测到MusicTrackBank,大写将转换为“MyBank”。

c.在绿色的 TrackTypeToFadeTo输入附近(不是在其上面)右键单击,并从上下文菜单选择“New Variable > Named Variable”。把这个新变量的FindVarName属性设置为TrackName。这表示您在与前面创建的TrackName变量“无线地”连接。

新命名的变量会同前面创建的TrackName变量进行通信。

d.从TrackTypeToFadeTo的输入拖一条线到这个新的“已命名变量”。

[next]

e.在CrossFader左侧右键单击,并从上下文菜单选择“New Event > Remote Event(远程事件)”。把这个新事件的MaxTriggerCount设置为0,EventName属性设置为PlayMusic。

f.从“远程事件”的“出”输出连一条线到CrossFader的CrossFade属性。

新的“远程事件”会处理歌曲的转换。

初步的音乐转换系统现已建立。

5.保存关卡。

<<<<指南结束

指南18.8:设置一个动态的音乐系统,第二部分:初始化播放和传输

请接前一指南。如果您还没有完成指南18.7,请在往下进行前完成。在本指南,我们会建立关卡音乐的初始回放。

1.我们首先需要做的是向CrossFader发送一条命令,告诉它播放“室外”音乐。这是因为我们的PlayerStart actor位于外面。请完成以下步骤:

    1. 在Kismet编辑器中右键单击,并从上下文菜单选择“New Event > Level Startup”。

创建一个新的“关卡启动”事件。

b.右键单击并从上下文菜单选择“New Action > Set Variable > String”,把“Level Startup”事件的“Out”连到该“String”对象的“In”。

连线的连接如图所示。

c.选择当前已连接到CrossFader的TrackName 已命名变量。按Ctrl-C、Ctrl-V复制它,然后将副本连接到“String”对象的“Target”输出。

复制并连接“已命名变量”。

d.右键单击“String”对象上标记为“Value”的绿色输入框,并从上下文菜单选择“New String Variable”。这会创建一个新的字符串变量,自动连到“Value”输入。

新的“字符串”变量已被添加。

e.将新字符串变量的StrValue属性设置为“Outdoor(室外)”。

f.在”String”对象的右侧右键单击,并选择“New Action > Event > Activate Remote Event”。将这个新“Activate Remote Event(活动远程事件)”对象的EventName属性设置为PlayMusic,这将激活当前贴附在CrossFader上的事件。

“Activate Remote Event”将用于和CrossFader进行通信。

[next]

2.我们现在想要建立触发器系统,当我们进入存在于两关卡间的大型触发器体积时,它将播放“转换”音乐。

    1. 单击“搜索actor”按钮并找到 TriggerVolume_3。双击选中这个actor。

“搜索actor”窗口。

b.编辑器中右键单击,并从上下文菜单选择“Create New Event using TriggerVolume_3 > Touch”,将它的 MaxTriggerCount设置为0。

为TriggerVolume_3创建一个新的“接触”事件。

c.按住Ctrl键,选中前一步骤创建的“String”序列对象,插入的两个变量,以及其中准备好的“Activate Remote Event”对象,使用 Ctrl-C、Ctrl-V复制所有这些序列对象。

所有需要的序列对象都已被复制。

d.将“Touch”事件的“已接触”输出连到新复制的“String”对象的“In”上。

新副本被连接。

e.选择贴附在新”String”对象”Value”输入上的字符串变量。把它的StrValue属性设置为“Transition(转换)”。

Volome(体积)现在将“转换”音乐进行排队。

3.如果现在马上测试,您会听到为关卡1播放的室外音乐,然后当您进入第二个关卡时听到“转换”音乐。“转换”音乐可能不确定地继续播放,因为我们进入其他关卡时,尚未让“室外”音乐再次播放。我们将用以下步骤解决这个问题:

    1. 选中当前贴附在“接触”事件上的”String”对象,以及连接到它上面的两个变量,使用Ctrl-C、 Ctrl-V复制它们。

b.选中连接到新复制的”String”对象的”String”变量,并把它的StrValue属性设置为“Outdoor”。

c.从”Touched”事件的UnTouched 输出连一连线到新”String”对象的“In”。

新网络准备好以后,“室外”音乐被再次排列。

现 在,如果您要测试关卡,就会发现当关卡开始时关卡一的“室外”音乐开始播放,当通过“转换”体积时会播 放“转换”音乐,当离开该区域时“室外”音乐再次响起。然而,我们现在需要建立MusicTrackBank,以便在您通过“转换”体积时,关卡一的乐曲被转换为关卡二的音乐。

<<<<指南结束

指南18.9:设置一个动态的音乐系统,第三部分:动态设置音轨

[next]

请接前一指南。如果您还没有完成指南16.7和16.8,请在往下进行前完成。在本指南,我们将使用Kismet在使用第二个关卡时改变乐曲。这是因为默认第一关卡的音乐已被保存在MusicTrackBank中。我们现在将建立“关卡二”以便测试关卡,然后在下一指南中创建“关卡一”序列。

1.打开Kismet编辑器,在编辑器的右下角找到”Sequences”窗口并选择City_Stream_02的序列。您会注意到该序列已包含了一个 Level Loaded and Visible事件,我们将使用这个事件来改变MusicTrackBank中的乐曲。

2.对象的右侧右键单击,并从上下文菜单选择“New Action > Sound > Set Music Track”。选中这个新对象并把它的TrackBankName属性设置为MyBank,然后把它连接到Level Loaded and Visible事件。

新的“Set Music Track”对象将用于改变音轨。

3.右键单击MusicTrack标签下面的小输入框,并从上下文菜单选择“New Music Track Variable”。选中这个变量并将它的TrackType属性设置为Outdoor,再利用Generic Browser设置它的TheSoundCue属性为music_Outdoor_2Cue。

“Music Track”变量会告诉“Set Music Track”把哪首歌放进库中。

4.选中“Set Music Track”对象、“Named Variable”和”String”变量,用Ctrl-C、Ctrl-V复制它们,然后选中”String”变量并将其StrValue属性设置为“Indoor”,用Generic Browser将其TheSoundCue属性设置为music_Indoor_2。将它也连到Loaded事件。

现在“室内”和“室外”乐曲都已被调整。

5.现在需要建立触发器,它在您走进建筑时开启“室内”音乐,请使用以下步骤完成:

    1. 双击以选中这个体积。

b.回到Kismet编辑器,确定您还在City_Stream_02序列,然后右键单击并选择“New Event using TriggerVolume_0 > Touch”。

为TriggerVolume_0创建一个新”Touch”事件。

[next]

c.在序列窗口,选中City_Persistent序列,然后按住Ctrl,选中两个”String”对象和互相连接的“已命名变量”与”String”变量,以及“Activate Remote Event”对象,所有七个序列对象选中后,按Ctrl-C复制它们。

所有框内的对象均应被选中。

d.回到City_Stream_02序列,并按Ctrl-V把这些对象粘贴到序列,选中当前读为“转换”的“String Variable”,并把它的StrValue属性设置为“Indoor”。

通过复制所有这些节点,您已经节省了可观的时间。

e.将贴附于室内字符串变量的”String”对象连接到事件的“Touched”输出。将其它“String”对象连接至UnTouched输出。最终,当字符“触发”音量时,您可以播放“室内”音乐,而字符离开音量时,将播放“室外”音乐。

现在设立“室内”触发音量。

6.保存并测试关卡。确保已经在“编辑”按钮中 按下了“Play Level in Editor(在编辑器中运行关卡)”。虽然室内音乐是非功能性的,但游戏开始时,您会听到“关卡一”中的音乐在播放。当您穿过进入到“关卡二”时,“转换”音乐会响起。您退出“转换”关卡时, “关卡二”的“室外”音乐将会响起。现在您可以进入建筑,而“室内”音乐也将 会响起。

如 果您想返回到“关卡一”,“转换”音乐会开始倒退,但是一旦您退出“转换”音 量,您会发现即使您已经回到“关卡一”,“关卡二”的“室外”音乐仍在播放。现在让我们来修复这个问题。

7.点击搜索按钮,并双击TriggerVolume_2 选中它,然后,回到Kismet编辑器,确保您已在City_Stream_01序列中,使用该触发器来创建一个新的“Touch(触发)”事件。

为TriggerVolume_2创建一个新的“触发”事件,为“关卡一”放置到序列中。

8.现在我们通过快速复制来为该序列创建所有必需的动作。

    1. 在Kismet编辑器的序列窗口中选中City_Stream_02序列。

b.按住Ctrl键,选中所有的非事件序列对象,其中不包括“Touch”事件和“Level Loaded and Visible”事件。选中这些序列对象后,按Ctrl-C进行复制。

应选中该方框内的所有序列对象。

c.返回到City_Stream_01序列,按下Ctrl-V将所有的序列对象粘贴到关卡中。

[next]

立即粘贴所有的对象。

d.将两个Set Music Track 对象连接至Level Loaded and Visibled事件。

将Set Music Track对象连接到Level Loaded对象。

e.最后,将包括“Indoor”变量在内的”String”对象连接到“Touch”事件的“Touched”输出,并将对应的”String”对象连接至UnTouched 输出。

像您在“关卡二”中所做的那样连接“室内”触发器。

9.保存并测试关卡。

此时,应该能够进入到“关卡一”或“关卡二”中的“室内”区域,能听到为该关卡设置的音乐。您还会发现从“关卡一”移至“关卡二”时的无缝转移。该项设置中有许多变化,而这也取决于您需要通过什么来完成您的音乐。

这节课就到这了,大家学的怎么样啊!想了解更多的请登录www.zf3d.com

评论

{{ username ? username.charAt(0).toUpperCase() : '?' }}
Ctrl+Enter 发布
{{ (c.username || c.author_name || '?').charAt(0).toUpperCase() }}
{{ c.username || c.author_name }} {{ Utils.formatDate(c.created_at) }}