Unity音頻效果可視化顯示(GetSpectrumData接口)

一. 前言

我們可以在音頻軟件中可以看到音頻一些特效效果,比如這樣:
在這裏插入圖片描述
在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腳本,並賦值AudioclipLinerender
在這裏插入圖片描述
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即可看到效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章