一. 前言
我們可以在音頻軟件中可以看到音頻一些特效效果,比如這樣:
在Unity中如何製作類似的這種效果呢。
我做了個簡易的效果(雖然效果很簡單,但我相信懂了原理之後,上面這種效果也可以做出來了),如下:
二. GetSpectrumData接口
AudioSources
有一個接口,用於採樣聲譜數據塊:
public static void GetSpectrumData(float[] samples, int channel, FFTWindow window);
參數說明:
samples:函數返回值。將音頻樣本數據傳送至samples數組,數組大小必須爲2的n次方,最小64,最大8192。
channel:一般設置爲0。
window:轉換信號所用的窗函數,算法越複雜,聲音越柔和,但速度更慢。
用法 :
先聲明一個浮點數組:
public float[] samples = new float[8192];
在Update方法裏面使用方法:
audiosource.GetSpectrumData(samples, 0, FFTWindow.BlackmanHarris);
三. 具體制作
準備資源:
1 一個音頻文件
2 一個材質球
3 一個Main腳本(腳本代碼見文章下面)
材質球效果自己看着喜歡設置,我的材質球設置如下:
場景中,創建一個物體,命名爲LienRenderer
,掛上LienRenderer
組件,並給設置材質球:
給Main Camera
掛上Main
腳本,並賦值Audioclip
和Linerender
:
Main.cs腳本如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Main : MonoBehaviour
{
private AudioSource m_audiosource;
public AudioClip audioclip;
public float[] samples;
public LineRenderer linerender;
private readonly int LINERENDER_POINT_CNT = 32;
void Start()
{
m_audiosource = gameObject.GetComponent<AudioSource>();
m_audiosource.Play();
samples = new float[1024];
linerender.positionCount = LINERENDER_POINT_CNT;
linerender.startWidth = 0.02f;
linerender.endWidth = 0.02f;
}
// Update is called once per frame
void Update()
{
m_audiosource.GetSpectrumData(samples, 0, FFTWindow.BlackmanHarris);
for (int i = 0, cnt = LINERENDER_POINT_CNT; i < cnt; ++i)
{
var v = samples[i];
linerender.SetPosition(i, new Vector3((i - LINERENDER_POINT_CNT / 2) * 0.2f, v * 20, -5));
}
}
}
最後運行Unity即可看到效果。