유튜브에서 뭔가 신나는 노래만 나오는 영상에 자주 나오는 움직이는 정신사나운 막대.

그 막대기들을 유니티로 만들어 보자

--동영상 예시(화질구지)--



아래는 소스코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
 
public class Visualizer : MonoBehaviour {
 
    public GameObject bar;//막대 원본
 
    public Transform barsParent;//막대 부모
 
    private RectTransform[] bars = new RectTransform[64];//막대들
 
    private AudioSource audioSur;//오디오 소스
 
    public float[] samples = new float[64]; //샘플//샘플수는 64가 최소 2의 거듭제곱으로 해야함
        
    private void OnEnable()
    {
        for(int i=0;i<bars.Length;i++)//막대들 만들기
        {
            bars[i] = (Instantiate(bar) as GameObject).GetComponent<RectTransform>();//막대생성
            bars[i].parent = barsParent;//부모설정
            bars[i].localPosition = new Vector2(i * 100);//포지션설정
 
            //색깔 랜덤
            bars[i].GetComponent<Image>().color = 
                new Vector4(Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f), 1);
 
            bars[i].sizeDelta = new Vector2(51);//사이즈 초기화
        }
 
        audioSur = GetComponent<AudioSource>();//오디오 소스 가지고오기
 
        audioSur.Play();//플레이
    }
 
    private void Update()
    {
        //스펙트럼 가지고오는 함수
        audioSur.GetSpectrumData(samples, 0, FFTWindow.Rectangular);
    
        for(int i=0;i< 64; i++)//크기 조절
        {
            bars[i].sizeDelta = new Vector2(5, samples[i] * 700);
        }
    }
}


cs





오디오 스펙트럼의 막대는 이렇게 구성되어있다.

RectTransform의 Height를 조정하여 크기를 조절한다.

그냥 흰색으로만 되어있으면 심심하기 때문에 막대를 만들때 색깔을 랜덤으로 하였다.



하이라키 구성은 이렇게 되어있다.

하이라키의 GameObject에 위에 있는 소스와 오디오 소스가 들어있다.

당연히 GameObject의 오디오소스에는 세계적인 뮤지션 samsung의 대표곡 Over The Horizon을 넣어두었다.

막대를 만들때 부모를 캔버스의 Bars로 설정해두었다.


위에있는 소스코드의 메인인 스펙트럼을 가지고 오는 함수는 AudioSource.GetSpectrumdata이다


첫번째 인자는 샘플들을 저장할 수 있는 float배열을 받는데 배열의 길이는 무조건 64이상의 2의 승수다.


두번째 인자는 채널(뭔지는 모르겠다)


세번째 인자는 FFTWindow형이다

FFT는 고속 푸리에 변환(Fast Fourier Transform)의 약자이며 주파수를 사인파의 집합으로 분해 하는 알고리즘이라고 한다.

그리고 FFTWindow는 스펙트럼 분석 창 유형을 정하는 데 쓰인다.


참고로 푸리에 변환 알고리즘은 위같은 스펙트럼을 분석하는데 쓰거나 mp3파일을 만들때 심지어 MRI에도 쓰인다고 한다





고속 푸리에 변환에 대한 위키백과 링크

https://ko.wikipedia.org/wiki/%EA%B3%A0%EC%86%8D_%ED%91%B8%EB%A6%AC%EC%97%90_%EB%B3%80%ED%99%98


그 푸리에 변환을 만든 사람에 대한 위키백과 링크

https://ko.wikipedia.org/wiki/%EC%A1%B0%EC%A0%9C%ED%94%84_%ED%91%B8%EB%A6%AC%EC%97%90


FFTWindow에 대한 유니티 도큐먼트

https://docs.unity3d.com/ScriptReference/FFTWindow.html


AudioSource.GetSpectrumdata에 대한 유니티 도큐먼트

https://docs.unity3d.com/ScriptReference/AudioSource.GetSpectrumData.html


이글의 원본인 내 옛날 네이버 블로그

http://stuban.blog.me/220984744908


블로그 이미지

stuban

ㅇ.ㅇ

,