这个方法是源自Unity的官方文档Unity - Scripting API: AudioSource.GetSpectrumData可以去这里看相关的数据解释;
在编辑器中,们首先创建一个空物体,然后作为父节点创建多个子物体
排列分布可以使用UGUI快速排列,也可以手动进行调整
然后将控制代码挂载到那个空物体上
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
[RequireComponent(typeof(AudioSource))]
public class CubeRy : MonoBehaviour
{
public List<Transform> cubeList;
public float[] Spectrum;
public const int Spec_num= 32;
public float heightScale= 10;
public float heightMax= (float)5;
public float delta_time = (float)0.1;//方块的更新间隔
public float Remain_timer;
private void Start()
{
for(int i = 0;i<Spec_num;i++)
cubeList.Add(transform.GetChild(i));
Remain_timer = delta_time;
Thread.Sleep(millisecondsTimeout:500);
}
void Update()
{
if(Remain_timer>0)
{
Remain_timer-= Time.deltaTime;
return;
}
Spectrum = new float[256];
AudioListener.GetSpectrumData(Spectrum,channel:0,FFTWindow.Rectangular);
for(int j= 0;j<bin_num;j++)
{
float height = heightScale*Spectrum[j];//限制最大高度
if(height >heightMax)
{
height= heightMax;
}
try
{
cubeList[j].transform.localScale=
new Vector3(cubeList[j].localScale.x,y:height,cubeList[j].localScale.z);
}
catch(Exception)
{
Debug.Log("....");
}
}
Remain_timer = delta_time;
}
}
挂载好之后会自动挂载一个AudioSource组件(无法移除)
然后在AudioClip处挂载一段音频即可实现对该音频的可视化
挂载控制代码之后,可以在编辑器里修改高度范围(Height Scale)、最大高度(Height Max)、以及更新范围(delta_time)来控制显示效果
音频也可以通过GameController等进行更换。