GetSpectrumData 함수 만들기
using UnityEngine;
public class AudioPeer : MonoBehaviour
{
public static AudioPeer Instance;
public enum AudioChannel
{
Left = 0,
Right = 1,
Center = 2,
LFE = 3,
RearLeft = 4,
RearRight = 5
}
[Header("[Ref]")]
[SerializeField] private AudioSource audioSource;
[Space(3)]
[Header("[Value]")]
[SerializeField, Tooltip("첫 번째 (왼쪽) 스테레오 채널 또는 모노 채널 \n두 번째 (오른쪽) 스테레오 채널 \n센터 채널 \nLFE (저주파 효과) 채널 \n후방 왼쪽 채널 \n후방 오른쪽 채널")] private AudioChannel channel = AudioChannel.Left;
[Range(8, 12)] public int Pow = 8;
[Space(3)]
[Header("[OutPut]")]
public float[] Samples;
private void Awake()
{
Instance = this;
Samples = new float[(int)Mathf.Pow(2,Pow)];
}
private void Update()
{
GetSpectrumAudioSource();
}
private void GetSpectrumAudioSource()
{
audioSource.GetSpectrumData(samples: Samples, channel: (int)channel, FFTWindow.Blackman);
}
}
구성 | 요소설명 |
AudioChannel 열거형 | 왼쪽, 오른쪽, 센터, LFE(저주파 효과), 후방 왼쪽, 후방 오른쪽 채널을 나타냅니다. |
Pow | 샘플 배열의 크기를 결정하는 데 사용되는 변수입니다. 샘플 배열의 크기는 2^Pow가 됩니다. |
Samples | 오디오 스펙트럼 데이터를 저장하는 배열입니다. |
메서드 | 설명 |
GetSpectrumAudioSource() | audioSource의 GetSpectrumData() 메서드를 호출하여 오디오 스펙트럼 데이터를 가져와 Samples 배열에 저장합니다. 이 때 사용하는 FFT 윈도우는 Blackman 윈도우입니다. |
큐브 소환하기 & 큐브 스케일 변화
using UnityEngine;
public class SpawnCubes : MonoBehaviour
{
[SerializeField] private GameObject SpawnObject;
private GameObject[] spawnedObjects;
public float Radius = 3f;
[SerializeField] private float sizePower = 10f;
[SerializeField] private float minYScale = 1f;
private float x = 1f;
private float z = 1f;
private int SampleLength;
private bool isStart;
private void Start()
{
SampleLength = AudioPeer.Instance.Samples.Length;
Spawn();
}
private void Spawn()
{
spawnedObjects = new GameObject[SampleLength];
for (int i = 0; i < SampleLength; i++)
{
float angle = i * 360f / SampleLength;
transform.rotation = Quaternion.Euler(0, angle, 0);
GameObject go = Instantiate(SpawnObject, transform.forward * Radius, Quaternion.identity);
go.name = "Cube" + i;
spawnedObjects[i] = go;
}
isStart = true;
}
private void Update()
{
if (!isStart) return;
for (int i = 0; i < SampleLength; i++)
{
spawnedObjects[i].transform.localScale = new Vector3(x, (AudioPeer.Instance.Samples[i] * sizePower) + minYScale, z);
}
}
}
프로퍼티 | 요소설명 |
SpawnObject | 인스턴스화할 게임 오브젝트를 나타내는 변수입니다. |
Radius | 생성된 게임 오브젝트들이 원형으로 배치될 때의 반지름을 나타내는 변수입니다. |
sizePower | 오디오 샘플 값이 생각보다 약하므로 세기를 더해주는 변수입니다. |
minYScale | 큐브의 최소 Y축 스케일을 나타내는 변수입니다. 이게 없으면 사이즈가 0이되는 큐브도 생깁니다. |
x, z | 큐브의 X축과 Z축 스케일을 나타내는 변수입니다. |
SampleLength | 오디오 샘플의 길이를 저장하는 변수입니다. |
메서드 | 설명 |
Spawn() | 오브젝트를 생성하고, 이들을 원형으로 배치합니다. |
Update() | 매 프레임마다 각 큐브의 스케일을 업데이트합니다. 큐브의 Y축 스케일은 오디오 샘플 값에 sizePower를 곱하고 minYScale을 더한 값이 됩니다. |