本文涉及的源碼包含在安卓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吼的效果以下:
不建議在辦公室吼,吹氣也能夠達到這樣的效果。
本人不太熟悉粒子系統,有興趣的朋友能夠本身實現更多更酷的特效。