2025-05-18 03:13:58 +09:00

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]);
}
}
}