实现过程
- 创建工程,新建一个场景,在场景中建一个空物体,添加一个AudioSource组件用来播放音乐
- Cube创建一个Cube作为预制体,并创建一个材质球,并勾选自发光,将Cube的材质指定为该材质球
- 创建脚本,并将脚本挂载到空物体上,并拖拽赋值相应的组件
代码
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);
}
}
效果