经常使用的Asset和ADX2的联动
制作游戏音频,我们经常会使用音频中间件来方便游戏音频开发,同时有可能需要合Unity的其他的Asset(运行库)进行联动。
比如在工程中使用游戏综合声音中间件ADX2的时候,经常使用到的运行库有:MusicEngine,宴,等。
运行库本身就提供了与ADX2的联动功能,但是与声音功能没有直接关系的Asset则一般没有这样的功能。因此,我们选出Unity里经常用到的Asset,然后来考虑如何自制这个联动的功能。这次我们主要介绍:
“DOTween”“UniTask”“Doozy UI”这三个Asset。
使用DOTween来使得AISAC值平滑的变化
DOTween是面向Unity的Tween运行库。在UnityAsset Store里贩卖。
使用DOTween的话,可以将各式各样的值的设置方法进行Tween化。和ADX2联动的话,受益最大的应该就是“SetAisac”这个方法了。
ADX可以将各种控制信息埋入声音数据里。AISAC,就是其中一个通过从0到1的参数变化来控制实际的声音的变化的功能。
比如,“体育场馆的欢呼声”这样的循环效果音有着强中弱3个种类的时候,通过同时播放并且调整这个3个声音的音量,然后实现普通的兴奋感到逆转胜利的那种超级兴奋感的变化处理。使用ADX2的AISAC功能,可以根据情况来变更音量更各种各样的参数,或者通过图表来设计。
上图是ADX2同捆的编辑工具Atom Craft的AISAC设置画面。黄色的线表示了音量的变化。在Unity中只需要赋予“从0到1的值”这一个参数,就可以同时变更3个循环声音的各自的音量。虽然AISAC功能非常的方便,但是ADX2这边对于AISAC的值没有进行Tween变化的功能。Cue的播放中变更AISAC值的时候,加入Tween处理可以使数值的变化更加的圆滑。这个可以通过导入DOTween,来实现以下的扩张方法。
public static class CriAtomDotweenExtension
{
public static TweenerCore<float, float, FloatOptions> DOSetAisacControl(this CriAtomSource target, CriAtomExPlayback playback, string aisacName, float startValue,float endValue, float duration)
{
return DOSetAisacControl(target.player, playback, aisacName, startValue, endValue, duration);
}
public static TweenerCore<float, float, FloatOptions> DOSetAisacControl(this CriAtomExPlayer target, CriAtomExPlayback playback, string aisacName, float startValue,float endValue, float duration)
{
TweenerCore<float,
float, FloatOptions> t = DOTween.To(()=> startValue, x=>
{
target.SetAisacControl(aisacName, x);
target.Update(playback);
}, endValue, duration);
t.SetTarget(target);
return t;
}
}
这个脚本是在CriAtomSource类与CriAtomExPlayer类里添加了扩展方法“DOSetAisacControl”。
方法内部则使用了DOTween.To中,用来更新AISAC的值的SetAisacControl方法,以及为了及时反映这个更新还调用了Update。调用这边则如下。
public CriAtomSource loopSeAtomSource;
private void Start()
{
var atomPlayback = loopSeAtomSource.Play();
loopSeAtomSource.DOSetAisacControl(atomPlayback ,"YellHeatUp",0f,
0.5f,
2f);
}
在这个例子中,我们将Aisac名为“YellHeatUp”的参数,从0到0.5用2秒的时间进行变化。
这样声音就不会发生过于急促的变化。ADX2与DOTween的并用,实现了更加圆滑的变化。
源代码已经全部上传到了Github。
GitHub链接地址gist.github.com使用DOTween来进行ADX2声音播放的渐入渐出
DOTween在Unity的标准声音组件的AudioSource里追加了叫做“DoFade”的渐入渐出方法、上面的源代码中CriAtomSource方法里也准备了DOFader。同样的,音高也通过DOTween而可以使用。
当然ADX2本身也拥有渐变的组件(AttachFader),以及数据方面也可以设置渐入渐出基本来说直接使用这边的功能即可。
不过偶尔会出现没办法使用Fader的情况(ADX2中使用了特殊功能的情况等,或者想要从脚本进行简单操作的时候可以使用DOFade。
使用UniTask异步加载CueSheet
UniTask是从C# 5.0开始导入的可以让“async/await”在Unity中简单使用的运行库。可以与Unity的Object进行联动,可以让Unity所提供的处理的大多数都可以异步。
Cysharp/UniTask
Cysharp/UniTaskgithub.com在ADX2中,需要用到异步功能的一个典型就是“CueSheet的读取”。从StreamingAssets文件夹中(或者任意存储器里的文件夹)异步读取ADX2的压缩文件ACB文件。
CriAtomCueSheet类中通过添加GetAwaiter则同样可以实现await。
using UniRx.Async;
public static UniTask<CriAtomCueSheet>.Awaiter GetAwaiter(this CriAtomCueSheet cueSheet)
{
UniTask<CriAtomCueSheet> task =
new UniTask<CriAtomCueSheet>(async ()=>
{
await UniTask.WaitWhile(() => cueSheet.IsLoading);
return cueSheet;
});
return new UniTask<CriAtomCueSheet>.Awaiter(task);
}
将上面的脚本置于任意一个地方,则可以让CriAtom.AddCueSheetAsync方法直接可以进行await。而且返回值是CriAtomCueSheet,可以直接交给CriAtomExPlayer然后进行播放,非常的方便。
CriAtomCueSheet cueSheet = await CriAtom.AddCueSheetAsync("cueSheetName","cuesheet.acb","cuesheet.awb");
criAtomExPlayer.SetCue(cueSheet.acb, cueName);
criAtomExPlayer.Start();
从DoozyUI的Node编辑器中播放ADX2的数据
Doozy UI是用于UI开发的综合型运行库。除了可以用Node为基盘来设计UI的过渡,还拥有丰富的UI动画以及玩家自定义功能。
Doozy UI使用了UI过渡专用的Node编辑器Nody。播放声音则是用通过叫做Soundy的Asset来构建的一个管理系统,如果要播放ADX2的数据的话则需要额外的功能的扩展。
样本代码在这里装不下,于是打包上传到github了。
ADX2forDoozyUI
TakaakiIchijo/ADX2forDoozyUIgithub.com通过导入这个.unitypackage至已经导入了ADX2的工程中,就可以使用联动功能。另外Doozy UI的运作需要前面所说的DOTween(免费版即可)。这个包里也会一并导入刚才的CriAtomDotweenExtension.cs。
和DoozyNode的统合
和Doozy UI本身准备的Node一样,准备一个同样的ADX2的Node。
可以执行CueSheet的读取以及之后的等待,Cue的播放以及停止处理。
Nody里的右键菜单里选择上“ADX2”则可以创建相应的Node。将Action变更为“Load Cue Sheet”,然后指定CueSheet名称、acb文件的路径(串流播放的时候还需要awb的路径)。
这样,就可以在Nody中的任意的时机播放ADX2的Cue。处理的内部实际上是创建了一个场景里的叫做“DoozyAtomSourceManager”的CriAtomSource的管理类来执行播放处理。
通过Doozy UI的按钮输入来进行ADX2的播放
Doozy UI同捆的声音管理运行库Soundy是以AudioSouce为基准来制作的。可以通过UI的过渡以及动画为触发来进行声音的播放。
使用ADX2播放声音的时候,通过勾住Doozy UI的UI View类中定义的Unity Event的触发器来播放声音。
using Doozy.Engine.UI;
using UnityEngine;
namespace Doozy.Engine.ADX2
{
[RequireComponent(typeof(UIView))]
public class DoozyActionAtomPlayer : MonoBehaviour
{
public string cueSheetName;
public void PlayCue(string cueName)
{
DoozyAtomSourceManager.Instance.Play(cueSheetName, cueName);
}
}
}
以下的图片显示了OnClick事件中绑定Cue的播放的设置。
如果要使用这个脚本的话,需要之前的DoozyAtomSourceManager.cs的实例需要在场景中存在。
ADX2与其他Unity Asset的联动
Unity里也有其也很多关于UI以及动画的Asset,需要将这些Asset与ADX2联动的话,可以参考这里所介绍的各种实现思路。
希望本篇文章可以给大家带来一定的启发。
本文由CRIWARE官方授权转载,如有需要请与本人联系