本文涉及的源码包含在安卓Unity渲染互通的 Demo 里,直接打开 Unity 工程的 Test 场景就行,不用管安卓工程。html
起初是看到这么一篇博客 Shader特效—— 音符跳动,效果以下图:git
具体的shader代码就不贴在这里了,他的博客里都有。
处理音频的关键代码以下:github
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果真不难作到。c#
这里用一个球状发射的粒子模块来作示例:oop
我但愿粒子随着音乐发射,音量越大数量越多,因而乎咱们须要在脚本内经过检测音量来改变 Emission 模块的 Rate over Time 值(只是举个例子,固然有其余更漂亮的实现).net
一开始我盲写,果真有 rateOverTime 这个值,可是不容许我直接更改。3d
查了下 API-ParticleSystem.EmissionModule 后发现不能直接用脚本赋值,而是须要实例化以后赋值:code
var emission = m_ParticleSystem.emission; emission.rateOverTime = 100f;
那么事情就好办了,复用上面的脚本代码就能够控制粒子了:htm
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; } }
Unity给的接口很方便,在脚本中开启Mic便可,具体代码以下:blog
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吼的效果以下:
不建议在办公室吼,吹气也能够达到这样的效果。
本人不太熟悉粒子系统,有兴趣的朋友能够本身实现更多更酷的特效。