using UnityEngine; using System.Collections.Generic; public enum SfxType { Walk, Jump, Land, Cheese, Die, Replay } public class SoundManager : MonoBehaviour { public static SoundManager instance; [Header("오디오 소스")] [SerializeField] private AudioSource sfxSource; [SerializeField] private AudioSource bgmSource; [Header("BGM 설정")] [SerializeField] private AudioClip lobbyBgmClip; [SerializeField] private AudioClip stageBgmClip; [SerializeField, Range(0f, 1f)] private float bgmVolume = 0.5f; [Header("사운드 클립 등록")] [SerializeField] private List sfxClips; private Dictionary sfxDictionary = new Dictionary(); private void Awake() { if (instance == null) { instance = this; DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); return; } foreach (var data in sfxClips) { if (!sfxDictionary.ContainsKey(data.type)) { sfxDictionary.Add(data.type, data.clip); } } } private void Start() { PlayLobbyBGM(); } public void PlayLobbyBGM() { ChangeBGM(lobbyBgmClip); } public void PlayStageBGM() { ChangeBGM(stageBgmClip); } private void ChangeBGM(AudioClip clip) { if (bgmSource == null || clip == null) return; if (bgmSource.clip == clip && bgmSource.isPlaying) return; bgmSource.Stop(); bgmSource.clip = clip; bgmSource.loop = true; bgmSource.volume = bgmVolume; bgmSource.Play(); } public void PlaySFX(SfxType type) { if (sfxDictionary.TryGetValue(type, out AudioClip clip)) { if (type == SfxType.Walk) { sfxSource.pitch = Random.Range(0.8f, 1.2f); sfxSource.volume = 0.7f; } else { sfxSource.volume = 1f; sfxSource.pitch = 1f; } sfxSource.PlayOneShot(clip); } else { Debug.Log($"인스펙터 창에서 사운드 클립 넣어주기 --> {type}"); } } public void PlaySFX(AudioClip audioClip, float minPitch, float maxPitch) { sfxSource.pitch = Random.Range(minPitch, maxPitch); sfxSource.volume = 1f; sfxSource.PlayOneShot(audioClip); } } [System.Serializable] public class SoundData { public SfxType type; public AudioClip clip; }