首页 科技正文

联博api:Unity音量可视化——粒子随声浪跳动

admin 科技 2020-07-08 39 0

本文涉及的源码包含在安卓Unity渲染互通的 Demo 里,直接打开 Unity 工程的 Test 场景就行,不用管安卓工程。

剧本控制粒子

起初是看到这么一篇博客 Shader特效—— 音符跳动,效果如下图:

详细的shader代码就不贴在这里了,他的博客里都有。
处置音频的要害代码如下:

private int m_NumSamples = 256;
private float[] m_Samples;
private float sum, rms;

private void Start()
{
    audioSource = GetComponent<AudioSource>();
    audioSource.clip = Microphone.Start(null, true, 10, 44100);
    m_Samples = new float[m_NumSamples];
}

private void Update()
{
    audioSource.GetOutputData(m_Samples, 0);
    sum = m_Samples[m_NumSamples - 1] * m_Samples[m_NumSamples - 1];
    rms = Mathf.Sqrt(sum/* / m_NumSamples*/);
    float intensity = rms;
    Debug.Log(intensity);
    if (intensity > bootIntensity)
    {
        //change in shader
        material.SetFloat("_Intensity", intensity);
    }
    else
    {
        material.SetFloat("_Intensity", 0);
    }
}

那么能不能用到粒子效果上呢,查了一下API果真不难做到。

这里用一个球状发射的粒子模块来做示例:

我希望粒子随着音乐发射,音量越大数目越多,于是乎我们需要在剧本内通过检测音量来改变 Emission 模块的 Rate over Time 值(只是举个例子,当然有其他更漂亮的实现)

一开始我盲写,果真有 rateOverTime 这个值,然则不允许我直接更改。

联博api:Unity音量可视化——粒子随声浪跳动 第1张

查了下 API-ParticleSystem.EmissionModule 后发现不能直接用剧本赋值,而是需要实例化之后赋值:

var emission = m_ParticleSystem.emission;
emission.rateOverTime = 100f;

那么事情就好办了,复用上面的剧本代码就可以控制粒子了:

private void Update()
{
    var emission = m_ParticleSystem.emission;
    audioSource.GetOutputData(m_Samples, 0);
    sum = m_Samples[m_NumSamples - 1] * m_Samples[m_NumSamples - 1];
    rms = Mathf.Sqrt(sum/* / m_NumSamples*/);
    float intensity = rms;
    Debug.Log(intensity);
    if (intensity > bootIntensity)
    {
        emission.rateOverTime = 10f * (1 + intensity * 1000);
    }
    else
    {
        emission.rateOverTime = 10f;
    }
}

接入Mic

Unity给的接口很利便,在剧本中开启Mic即可,详细代码如下:

private void Start()
{
    audioSource = GetComponent<AudioSource>();
    BeginListener(0);
    //audioSource.clip = Microphone.Start(null, true, 10, 44100);
    m_Samples = new float[m_NumSamples];
}

......

public void BeginListener(int index)
{
    int min = 0;
    int max = 0;

    Microphone.GetDeviceCaps(Microphone.devices[index], out min, out max);

    audioSource.clip = Microphone.Start(Microphone.devices[index], true, 2, max);

    while (!(Microphone.GetPosition(Microphone.devices[index]) > 1))
    {
        // Wait until the recording has started
    }

    audioSource.loop = true;
    audioSource.Play();
}

对着Mic吼的效果如下:

联博api:Unity音量可视化——粒子随声浪跳动 第2张

联博api:Unity音量可视化——粒子随声浪跳动 第3张

不建议在办公室吼,吹气也可以到达这样的效果。

本人不太熟悉粒子系统,有兴趣的同伙可以自己实现更多更酷的特效。

,

联博接口

www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。

版权声明

本文仅代表作者观点,
不代表本站AllbetGaming的立场。
本文系作者授权发表,未经许可,不得转载。

评论