Unity3D/Unity & C#
Unity & C# ~ Mic 음성을 Spectrum 표현하기
캬캬백곰
2022. 10. 5. 12:49
728x90
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
[RequireComponent(typeof(AudioSource))]
public class AudioSourceGetSpectrumDataExample : MonoBehaviour
{
[SerializeField] private Image bar; // 원본 막대 prefab
[SerializeField] private Transform trBarParent; // 막대 부모
// 스펙트럼 표현 막대들
// Canvas 하위 객체
private RectTransform[] bars = new RectTransform[128];
private float[] spectrum = new float[128]; // 스펙트럼 샘플 수
private AudioSource audioSource = null; // audiosource
// Start is called before the first frame update
void Start()
{
// 바 초기화
for(int i=0; i < bars.Length; i++)
{
bars[i] = (Instantiate(bar) as Image).GetComponent<RectTransform>();
bars[i].parent = trBarParent;
bars[i].localPosition = new Vector2(i * 5, 0);
//color 랜덤 초기화
bars[i].GetComponent<Image>().color = new Vector4(Random.Range(0.0f, 0.1f), Random.Range(0.0f, 0.1f), Random.Range(0.0f, 0.1f), 1f);
bars[i].sizeDelta = new Vector2(2.5f, 1);
}
// audiosource 초기화
audioSource = GetComponent<AudioSource>();
audioSource.clip = Microphone.Start(null, true, 1, 44100);
audioSource.Play();
Invoke("LoopMicAudio", 1);
}
// Update is called once per frame
void Update()
{
//스펙트럼 값에 따른 막대 사이즈 변화
AudioListener.GetSpectrumData(spectrum, 0, FFTWindow.Rectangular);
for(int i = 0; i < bars.Length; i++)
{
bars[i].sizeDelta = new Vector2(2.5f, spectrum[i] * 700);
}
}
// loop mic audio
void LoopMicAudio()
{
audioSource.Play();
Invoke("LoopMicAudio", 1);
}
}
728x90
반응형