본문 바로가기
Project

[유니티 / 게임 개발] 오브젝트 그라데이션(스펙트럼) 색깔로 바꿔주기

by 배애앰이 좋아 2020. 5. 10.
반응형
Color[] m_colortable;

m_colortable = new Color[5];
m_colortable[0] = new Color(0, 0, 1);
m_colortable[1] = new Color(0, 1, 1);
m_colortable[2] = new Color(0, 1, 0);
m_colortable[3] = new Color(1, 1, 0);
m_colortable[4] = new Color(1, 0, 0);

int high = 0, low = 0;
float t = 0;
if (num < 0.25f)
{
low = 3;
high = 4;
t = 1-((num-0.1f) * 4);
}
else if (0.25f < num && num < 0.5f)
{
low = 2;
high = 3;
t = 1 - ((num - 0.25f) * 4);
}
else if (0.5f < num && num < 0.75f)
{
low = 1;
high = 2;
t = 1 - ((num - 0.5f) * 4f);
}
else if (0.75f < num)
{
low = 0;
high = 1;
t = 1 - ((num - 0.75f) * 4);
}
Color c = new Color();
c = Color.Lerp(m_colortable[low], m_colortable[high], t+0.8f);

 

5가지의 색깔에서 4구간으로 나눠서 색깔이 바뀌도록 코딩.

 

위를 응응하여 만들어 본 영상 : 소리의 크기를 이용하여 색깔 값을 그라데이션으로 바꿔주게 하였더니 다음과 영상이 만들어졌습니다. 생각보다 세부적인 색깔이랄까 예를 들면 빨간색 - 노랑색 사이의 주황색같은 색깔들도 나오길 바랬는데 그런 부분이 제대로 구현되지 않는 점이 아쉬운 것 같습니다.

 

위 영상에 대한 코드 :

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent (typeof(AudioSource))]
public class AudioPeer : MonoBehaviour
{
    AudioSource _audioSource;
    public float loudness;
    public GameObject[] temp;
    public float[] _samples = new float[512];
    Color[] m_colortable;
    float num;
    int i = 0;

    void Start()
    {
        _audioSource = GetComponent<AudioSource>();
        temp = GameObject.FindGameObjectsWithTag("cube");
        m_colortable = new Color[5];
        m_colortable[0] = new Color(0, 0, 1);
        m_colortable[1] = new Color(0, 1, 1);
        m_colortable[2] = new Color(0, 1, 0);
        m_colortable[3] = new Color(1, 1, 0);
        m_colortable[4] = new Color(1, 0, 0);
        i = temp.Length-1;
    }

    // Update is called once per frame
    void Update()
    {
        if (i == -1) i = temp.Length-1;
        Debug.Log("i : " +i);
        temp[i].AddComponent<AudioListener>();
        GetSpectrumAudioSource();
        loudness = GetAveragedVolume() * 100;
        num = loudness;
        Debug.Log(num);
        temp[i].GetComponent<MeshRenderer>().material.color = ChangeColor();
        Destroy(temp[i].GetComponent<AudioListener>());
        i--;
    }

    void GetSpectrumAudioSource()
    {
        _audioSource.GetSpectrumData(_samples, 0, FFTWindow.Blackman);
    }

    float GetAveragedVolume()
    {
        float[] data = new float[256];
        float a = 0;
        _audioSource.GetOutputData(data, 0);
        foreach (float s in data)
        {
            a += Mathf.Abs(s);
        }
        return a / 256;
    }

    Color ChangeColor()
    {

        int high = 0, low = 0;
        float t = 0;
        if (num < 2.5f)
        {
            low = 3;
            high = 4;
            t = 1 - ((num - 0.1f) * 4);
        }
        else if (2.5f < num && num < 5f)
        {
            low = 2;
            high = 3;
            t = 1 - ((num - 0.25f) * 4);
        }
        else if (5f < num && num < 7.5f)
        {
            low = 1;
            high = 2;
            t = 1 - ((num - 0.5f) * 4f);
        }
        else if (7.5f < num)
        {
            low = 0;
            high = 1;
            t = 1 - ((num - 0.75f) * 4);
        }
        Color c = new Color();
        c = Color.Lerp(m_colortable[low], m_colortable[high], t + 0.8f);
        return c;
    }
}

 

반응형

댓글