using IVDataFormat; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.Audio; public enum SoundName { BtnPress, ReinforceSuccess, ReinforceFailed, OneSummon, MultiSummon, SummonBoss, GetGoods, UnlockThing, none } [System.Serializable] public class Sound { public SoundName name; public AudioClip clip; } public class SoundMgr : MonoBehaviour { #region Const private static SoundMgr curMgr = null; #endregion Const private static bool BBgmOn = true; public static bool BgmOn { get { return BBgmOn; } set { if (curMgr != null) { if (BBgmOn && !value) curMgr.StopBgm(); if (!BBgmOn && value) curMgr.PlayBgmSelected(); } BBgmOn = value; } } private static bool BEfcOn = true; public static bool EfcOn { get { return BEfcOn; } set { BEfcOn = value; } } private static bool BVoiceOn = true; public static bool VoiceOn { get { return BVoiceOn; } set { BVoiceOn = value; } } private AudioSource asPlayer = null; private AudioSource[] sfxPlayer = null; private int iLoading = 1; private BGM iSelectedBgm = BGM.none; #region ASSFX [SerializeField] Sound[] sfx; #endregion #region Base private void Awake() { if (curMgr != null) { Destroy(gameObject); return; } curMgr = this; DontDestroyOnLoad(gameObject); } void Start() { asPlayer = GetComponent(); sfxPlayer = new AudioSource[3]; sfxPlayer[0] = asPlayer.transform.Find("sfx").GetComponent(); sfxPlayer[1] = asPlayer.transform.Find("sfx (1)").GetComponent(); sfxPlayer[2] = asPlayer.transform.Find("sfx (2)").GetComponent(); iLoading--; } #endregion Base #region Control public static void SSetAmxGroupBgm(AudioMixerGroup amxg) { if (curMgr != null) curMgr.SetAmxGroupBgm(amxg); } public void SetAmxGroupBgm(AudioMixerGroup amxg) { //if (ilPlayer != null) // ilPlayer.SetMixerGroup(amxg); if (asPlayer != null) asPlayer.outputAudioMixerGroup = amxg; } #endregion Control #region Select // 선택된 상태의 배경음 로드 & 재생. private void PlayBgmSelected() { if (iSelectedBgm == BGM.none) return; Addressables.LoadAssetAsync(FormatString.StringFormat(AddressableMgr.PathBgmClip, DataHandler.GetBgmPath(iSelectedBgm))).Completed += ALoadBgmComp; } public static bool SPlayBgm(BGM bgm) { if (curMgr != null) return curMgr.PlayBgm(bgm); return false; } // 배경음 로드 요청. private bool PlayBgm(BGM bgm) { if (bgm == iSelectedBgm) return false; iSelectedBgm = bgm; if (!BBgmOn) { GameUIMgr.SOnChangeBgm(LocalizationText.GetText(FormatString.StringFormat("bgm : {0}", iSelectedBgm))); return true; } Addressables.LoadAssetAsync(FormatString.StringFormat(AddressableMgr.PathBgmClip, DataHandler.GetBgmPath(bgm))).Completed += ALoadBgmComp; return true; } // 배경음 로드 완료. private void ALoadBgmComp(AsyncOperationHandle obj) { asPlayer.Stop(); if (asPlayer.clip != null) Addressables.Release(asPlayer.clip); asPlayer.clip = obj.Result; asPlayer.Play(); GameUIMgr.SOnChangeBgm(LocalizationText.GetText(FormatString.StringFormat("bgm : {0}", iSelectedBgm))); AddressableMgr.SAddUnload(); } // 배경음 멈춤 및 리소스 해제. private void StopBgm() { asPlayer.Stop(); if (asPlayer.clip != null) Addressables.Release(asPlayer.clip); asPlayer.clip = null; } // 배경음 일시 정지. public static void SPauseBgm() { if (curMgr != null) curMgr.asPlayer.Pause(); GameUIMgr.SPrintTestLog("SPauseBgm"); } // 배경음 다시 재생. public static void SResumeBgm() { if (curMgr != null) curMgr.asPlayer.Play(); GameUIMgr.SPrintTestLog("SResumeBgm"); } public static bool SChangeBgm() { if (curMgr != null) return curMgr.ChangeBgm(); return false; } // 배경음 변경. private bool ChangeBgm() { if (iLoading > 0) return false; iLoading++; BGM next = iSelectedBgm + 1; if (!DataHandler.IsAvailBgm(next)) { next = BGM.stage; } ES3.Save(Global.ES3_Bgm, next); iLoading--; return PlayBgm(next); } #endregion Select #region SFX public static void PlaySfx(SoundName name1, SoundName name2 = SoundName.none, SoundName name3 = SoundName.none) { if (EfcOn) { curMgr.sfxPlayer[0].clip = curMgr.sfx[(int)name1].clip; curMgr.sfxPlayer[0].Play(); if (name2 != SoundName.none) { curMgr.sfxPlayer[1].clip = curMgr.sfx[(int)name2].clip; curMgr.sfxPlayer[1].Play(); } if (name3 != SoundName.none) { curMgr.sfxPlayer[2].clip = curMgr.sfx[(int)name3].clip; curMgr.sfxPlayer[2].Play(); } } } public void ButtonSFXPlay() { curMgr.sfxPlayer[0].clip = curMgr.sfx[(int)SoundName.BtnPress].clip; curMgr.sfxPlayer[0].Play(); } #endregion }