工程截图
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; /// <summary> /// 实时频谱效果 /// </summary> public class AudioSpectrumEffect : MonoBehaviour { [SerializeField] private AudioSource m_AudioSource; [Tooltip("采样通道")] [SerializeField] [Range(0, 10)] private int channel = 0; [Tooltip("采样点数量")] [SerializeField] [Range(64, 8192)] //取值范围[64,8192]且必须为2的指数次方 private int numSamples = 4096; private float[] samples; [SerializeField] private Transform m_Container; [SerializeField] private Slider m_SliderTemplet; [SerializeField] private int m_SliderCount = 32; [SerializeField] private float m_Multiply = 15;//倍乘因子 [SerializeField] private bool m_Loop = true; private List<Slider> sliders = new List<Slider>(); private void Awake() { samples = new float[numSamples]; m_AudioSource.loop = m_Loop; m_AudioSource.Play(); if (m_AudioSource.clip != null && channel >= m_AudioSource.clip.channels) channel = m_AudioSource.clip.channels - 1; CreateSliders(); } private void Update() { GetSpectrumData(); UpdateSliders(); } private void GetSpectrumData() { m_AudioSource.GetSpectrumData(samples, channel, FFTWindow.BlackmanHarris); } private void CreateSliders() { for (int i=0; i < m_SliderCount; i++) { Slider slider = Instantiate<Slider>(m_SliderTemplet); slider.gameObject.name = "Slider_"+i.ToString("D2"); slider.transform.SetParent(m_Container); sliders.Add(slider); } m_SliderTemplet.gameObject.SetActive(false); } private void UpdateSliders() { for (int i = 0; i < m_SliderCount; i++) { Slider slider = sliders[i]; slider.value = samples[i] * m_Multiply; } } }
运行效果