65 lines
2.4 KiB
C#
65 lines
2.4 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public class SoundMaterial : MonoBehaviour
|
|
{
|
|
[SerializeField] private Material[] materials; // 머티리얼 배열
|
|
[SerializeField] private float sensitivity = 1.0f; // 소리 감도 조절
|
|
[SerializeField] private float smoothTime = 0.1f; // 부드러운 전환을 위한 시간
|
|
[SerializeField] private float minPower = 0f; // 최소 파워 값
|
|
[SerializeField] private float maxPower = 1f; // 최대 파워 값
|
|
|
|
private float[] spectrumData = new float[1024]; // 스펙트럼 데이터 배열
|
|
private float[] currentPower; // 현재 파워 값 배열
|
|
private float[] targetPower; // 목표 파워 값 배열
|
|
private float[] velocity; // 부드러운 전환을 위한 속도 배열
|
|
|
|
// Start is called before the first frame update
|
|
void Start()
|
|
{
|
|
// 배열 초기화
|
|
currentPower = new float[materials.Length];
|
|
targetPower = new float[materials.Length];
|
|
velocity = new float[materials.Length];
|
|
|
|
// 초기 파워 값 설정
|
|
for (int i = 0; i < materials.Length; i++)
|
|
{
|
|
currentPower[i] = minPower;
|
|
targetPower[i] = minPower;
|
|
}
|
|
}
|
|
|
|
// Update is called once per frame
|
|
void Update()
|
|
{
|
|
// 오디오 스펙트럼 데이터 가져오기
|
|
AudioListener.GetSpectrumData(spectrumData, 0, FFTWindow.BlackmanHarris);
|
|
|
|
// 각 머티리얼에 대해 파워 값 업데이트
|
|
for (int i = 0; i < materials.Length; i++)
|
|
{
|
|
// 해당 머티리얼의 주파수 대역에 해당하는 스펙트럼 데이터 평균 계산
|
|
int startIndex = i * (spectrumData.Length / materials.Length);
|
|
int endIndex = (i + 1) * (spectrumData.Length / materials.Length);
|
|
float average = 0f;
|
|
|
|
for (int j = startIndex; j < endIndex; j++)
|
|
{
|
|
average += spectrumData[j];
|
|
}
|
|
average /= (endIndex - startIndex);
|
|
|
|
// 목표 파워 값 설정
|
|
targetPower[i] = Mathf.Lerp(minPower, maxPower, average * sensitivity);
|
|
|
|
// 부드러운 전환을 위해 SmoothDamp 사용
|
|
currentPower[i] = Mathf.SmoothDamp(currentPower[i], targetPower[i], ref velocity[i], smoothTime);
|
|
|
|
// 머티리얼의 파워 값 업데이트
|
|
materials[i].SetFloat("_Power", currentPower[i]);
|
|
}
|
|
}
|
|
}
|