高级10/Unity中的TimeStretch
TimeStretch是用于处理声音的变速不变调的效果器。
通常的Pitch会更改声音的速度和音调,当声音的速度变快时音调也随之变高,速度变慢时音调随之变低。
对于游戏的一些玩法,比如动作游戏中常用的子弹时间,不希望通过Pitch的效果展现子弹时间引起的其他内容的慢速,因为Pitch变慢后声音的音调会发生变化,此时应用的效果就是TimeStretch。
ADX2中没有直接将TimeStretch加入到效果器插件中,如果希望使用TimeStretch则需要通过引擎进行API的调用,本文主要通过滑块和代码来实现声音的变速不变调效果。
Unity中设置
对声音使用TimeStretch时,首先需要创建声音内容:
我们直接创建一个包含Cue的GameObject于场景中。
随后我们创建一个Slider备用,用以调整TimeStretch的变速率:
完成创建后我们在包含Cue的GameObject上添加脚本如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class TimeStretch : MonoBehaviour
{
public Slider slider;
private CriAtomSource src;
private CriAtomExVoicePool vpTimeStretch;
private uint vpId = 1;
void Start()
{
src = GetComponent<CriAtomSource>();
if (slider != null) {
slider.onValueChanged.AddListener(ChangeSpeed);
}
/* 新建自定义VoicePool */
vpTimeStretch = new CriAtomExStandardVoicePool(
32, /* 最大Voice数(最大播放数)。
* CriwareLibraryInitializer中的“MaxVirtualVoices”
* 也应该设置为所有VoicePool的这个数值之和以上。
* 当使用流播放时“NumberOfLoaders”也应同样提高 */
2, /* 最大声道 */
96000, /* 最大采样率 */
true, /* 使用流播放 */
vpId /* 自定义ID; 应设为 0(默认)以外的数值*/
);
/* 在自定义VoicePool上添加DSP */
vpTimeStretch.AttachDspTimeStretch();
/* 让AtomExPlayer使用自定义(而非默认的)VoicePool */
src.player.SetVoicePoolIdentifier(vpId);
src.Play();
}
private void OnDisable()
{
vpTimeStretch.DetachDsp();
vpTimeStretch.Dispose();
}
void ChangeSpeed(float speedRate)
{
if (src != null) {
src.player.SetDspTimeStretchRatio(1.0f / speedRate); /* 1 ÷ 速度倍率 = 延长倍率 */
src.player.UpdateAll();
}
}
}
脚本中明确了各个内容并添加了相关的注释,完成后我们将脚本和滑块相关联即可:
注意:
使用TimeStretch会创建一个新的VoicePool因此需要调整相关设置,原先在场景中创建的CriWareLibraryInitializer初始化组件中的部分内容需要进行调整:
我们需要增加Number of Loaders以及Max Virtual Voice的数量,应该设置为所有VoicePool的这个数值之和以上。
如此一来运行场景后就能够更改滑块来调整TimeStretch的相关效果变化了。