Blink

纸上得来终觉浅,绝知此事要躬行

Unity:音频可视化实现

实现过程

  1. 创建工程,新建一个场景,在场景中建一个空物体,添加一个AudioSource组件用来播放音乐
    《Unity:音频可视化实现》
  2. Cube创建一个Cube作为预制体,并创建一个材质球,并勾选自发光,将Cube的材质指定为该材质球
    《Unity:音频可视化实现》
  3. 创建脚本,并将脚本挂载到空物体上,并拖拽赋值相应的组件

代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MusicSpectrum : MonoBehaviour
{
    public AudioSource AudioSource;
    public GameObject Prefab;

    private const int LENGHT = 512;
    // 存储频谱数据的数组(注意数组的长度必须为2的次方)
    private float[] m_Samples = new float[LENGHT];
    // 存储实例化的预制体,用来显示频谱
    private GameObject[] m_Gos = new GameObject[LENGHT];
    // 频谱分析类型
    private FFTWindow m_FFT = FFTWindow.Rectangular;

    private void Start()
    {
        // 实例化预制体
        for (int i = 0; i < LENGHT; i++)
        {
            m_Gos[i] = GameObject.Instantiate(Prefab, new Vector3((LENGHT / 2f) * (-0.12f) + i * 0.12f, 1f, 1f), Quaternion.identity, transform);
        }
    }

    private int m_Index = 0;
    private void Update()
    {
        // 获取频谱数据
        AudioSource.GetSpectrumData(m_Samples, 0, m_FFT);
        // 通过设置预制体的缩放进行显示
        for (int i = 0; i < m_Samples.Length; i++)
        {
            m_Gos[i].transform.localScale = new Vector3(0.1f, 0.1f + m_Samples[i] * 250, 1);
        }

        // 按Q键切换频谱分析类型
        if (Input.GetKeyDown(KeyCode.Q))
        {
            m_Index++;
            if (m_Index > 5)
                m_Index = 0;
            m_FFT = (FFTWindow)m_Index;
        }
    }

    private void OnGUI()
    {
        GUIStyle style = new GUIStyle
        {
            fontSize = 45
        };
        style.normal.textColor = Color.red;
        GUILayout.Label(m_FFT.ToString(),style);
    }
}

效果

《Unity:音频可视化实现》

点赞

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注