使用ADX2中的数据來控制Unity中的闪电效果
簡介
上个月的博客(「使用ADX2创建动态下雨音景」)中,我们在AtomCraft v3版中创建了一个简单的互动式下雨音景。本月,我们将细看如何在Unity中, 使用来自Thunder Cue的振幅数据来控制闪电场景,摹拟我们游戏中闪电的效果。这是使虚拟环境更动态和增加玩家沉浸感的极好方法。请下载下面的一个已修改过的AtomCraft项目和一个已完成的Unity项目,又或者您可从上一个教程下载Atom Craft项目开始测试本博客的教程。
ADX2_WeatherControl_v2.zip
(This project was created using CRI Atom Craft Ver3.40.02)
下載ADX2_WeatherControl_v2.zip
(此项目是使用CRI AtomCraft Ver3.40.02创建的)
并在这里下載已完成的Unity项目:
Unity_LightningControlProject.zip
(This project was created using Unity 2018.2.13f1)
Unity_LightningControlProject.zip
(此项目是使用Unity 2018.2.13f1创建的)
创建总线(Bus)
打开您刚下载的Atom Craft项目, 现在我们只需要创建一个bus并将Thunder Cue发送给它。本教程将令您加深了解有关AtomCraft中的总线图(bus map)。
这将允许我们分别控制雷声的响度。方法如下:
- 使用混音器用户布局(Mixer User Layout)(默认为Ctrl + 5)
- 从项目树(Project Tree)中选择“DspBusSettings”
- 此时您会看到如下所示的blank channel strip,现在可以右键单击并选择“创建DSP总线(Create DSP Bus)”。这将在MasterOut旁边创建一个名为BUS1的新通道
- 现在您可重新命名,但请务必记下其新名称,因为我们稍后将在Unity中引用它
接下来,我们需要分配(assign)它。从项目树中选择“BusMap_Default”(在BusMap / BusMapforCue下),并将DspBusName1设置为新创建的bus。
最后,我们需要选择Thunder Cue并勾选检查器中BusSend1旁边的框(下图箭头位置)。根据您此时需要的处理声音方式,您可以添加效果及调整主电平控制以进行一些混音。而回到这一次教程的目的,我们只需使用一个bus来简单的把迅雷信号与下雨声分开。实际上我们不会听到这个bus,我们只想测量它的幅度而已。
AtomCraft的工作已完成,剩下的只需要构建Atom CueSheet Binary(ACB)。由于我们将在Unity中实现此功能,请确保在构建之前勾选“With Unity Assets”和“With ACF Binary”框。
Unity整合
在Unity中打开一个新项目,并按照本教程将ADX2整合到这新项目中,链接在上一个构建阶段创建的ACF文件。
设置场景
在项目设置后,我们来创建一些资产,以看到闪电的效果。在层次结构选项卡(Hierarchy)中:
- 右键单击,创建一个3D对象 – > 平面(Plane)
- 右键单击并创建一个3D对象 – > 立方体(Cube)
- 定位Cube,使其位于Plane上方的某个位置
- 单击层次结构中的Directional Light,并在检查器中将Light组件的Intensity值更改为0.1(以模拟夜间的效果)
- 在层次结构中创建一个空对象(Empty Object),命名为Lightning Controller
你的场景应该看起来像这样:
单击“窗口 – > CRIWARE – >打开CRI Atom窗口”,按照对话框标题中的说明进行操作,记得勾选“使用复制资产文件夹(Use Copy Assets Folder)”, 将其指向“使用复制资产文件夹” 并链接到之前完成构建的文件夹。做好的话, 您现在的画面上应该像下图一样:
当您“重新加载信息(Reload Info)”时,您只需要Unity处于播放模式。之后,您可以停止Unity运行后:
- 确保如上图一样, Cri Atom Cue Sheet中突出显示天气(Weather)
- 确保在Unity的层次结构选项卡中选择了Lightning Controller
- 单击CRI Atom窗口中的“添加组件(Add Component)”
如下所示,现在我们应该在Lightning Controller上有一个Cri Atom Source。确保勾选“在开始时播放(Play on Start)”,然后您可以在检查器中取消选中“3D定位(3D Positioning)”。 此时播放场景的话,您应该能够听到我们在上一个教程中创建的天气声音。
创造闪电
这一步比較技术性,需要一些代码。首先,我们可以从CRIWARE SDK中的Unity示例访问LevelMeter.cs script。
此script根据歌曲的响度改变立方体的大小,这与我们希望实现的用例非常相似。是次教程中,我们将需要改变Directional Light的强度。
最终调整大家可以在下面的代码片段中看到,现在我们来逐步解构其思考过程。
using System.Collections;public class LevelMeter : MonoBehaviour {public Light skyLight;
public int monitoredChannelId = 0;
private float objScaleBaseVal = 1.0f;IEnumerator Start() {
while (CriAtom.CueSheetsAreLoading) {
yield return null;
}CriAtom.AttachDspBusSetting(“DspBusSetting_0”);
CriAtom.SetBusAnalyzer(true);
}void Update() {
CriAtomExAsr.BusAnalyzerInfo lBusInfo = CriAtom.GetBusAnalyzerInfo(“BUS1”);float lObjScaleNewVal = 0.1f + objScaleBaseVal * lBusInfo.rmsLevels[monitoredChannelId];Debug.Log(“Channel_” + monitoredChannelId + ” : ” + lBusInfo.peakLevels[monitoredChannelId]);
skyLight.intensity = lObjScaleNewVal;
}
}
因其本身是自记录代码(self-documenting code); 为使得本教程的目的更容易阅读,笔者在上图代码中把注释删除了,放在下面供大家参阅。
- 首先,我们需要创建一个新的Public变量skyLight,将其定义为Light类型,以便我们可以对Directional Light object进行更改。创建变量Public后会在检查器中公开。
- 接下来,我们需要确保已将AttachDspBusSetting设置为正确的bus设置,在本教程的情况下,应设置为“DspBusSetting_0”。
- 然后我们需要从正确的bus拿到“GetBusAnalzyerInfo”,如果你之前没有改变它,应命名为BUS1。如果您已重新命名它,请返回AtomCraft项目中查找您修改了的名称。
- 现在我们需要在RMS和Peak检测之间进行选择,前者已经在原始script中被注释了。这一次教程的任何一方都能做到这一点,所以体验两者对我们将来运用都有帮助。
- 最后,我们需要更新skyLight强度(可通过将其值设置为lObjScaleNewVal来实现)
注意
- 您还可以使用objScaleBaseVal来改变光强度的动态范围。
- rmsLevels正在寻找一个通道ID,这意味着它只在一个通道上执行。如演示中所见,当我们想要单独处理立体声通道时,这很有用。
回到Unity引擎中,请在Lightning Controller object的Level Meter脚本组件(script component)下找到一个新的Sky Light参数。只需将Directional Light object从Hierarchy视图拖到Sky Light旁边的框中,即变成“Directional Light(Light)”。或者,您亦可以单击带有圆点的圆圈(在框的右侧),它将显示一个对话框,显示您可以改变所有相关对象。
记得保存所有内容,然后播放您的场景。你现在应该有一个全部由CRIWARE控制、光线因应迅雷声的振幅而改变的互动场景。
结论
使用ADX2,您不仅可以控制游戏信息中的声音,还可以通过声音控制游戏玩法。这增添了无限新的创意可能性,更允许声音设计师和音频程序员以更少的努力去创建及实现更完美的系统!