유니티 Audio Spectrum을 이용한 큐브 스케일 변화 시키기 #기초

Audio Spectrum을 이용한 스케일 변화

 


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을 더한 값이 됩니다.