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