반응형
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;
}
}
반응형
'Project' 카테고리의 다른 글
[R stdio] Word Cloud(워드 클라우드) 만들기 - 1 (0) | 2020.05.25 |
---|---|
[unity] sound project - 3 days (0) | 2020.05.25 |
[유니티] 특정 키를 눌렸을 때 다시 시작, 다시 씬 로드 (0) | 2020.05.05 |
[Leap motion] Leap Service 이(가) 작동하지 않습니다 - 수동 실행하 (0) | 2020.04.26 |
[unity + leap motion project] 립모션 제스처 만들기 프로젝트 5번째 정리 (2) | 2020.04.20 |
댓글