高级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的相关效果变化了。

Ringo

CRI Middleware Global Expansion Group

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据