using FirstVillain.Singleton; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class UIManager : UnitySingleton { [SerializeField] private Canvas _uiCanvas; private Dictionary _uiRootDict = new(); private Dictionary _loadedUIDict = new(); //Basic UI private Stack _uiStack = new(); //Loading UI - LoadingÀº 2°³°¡ ³ª¿ÀÁö ¾ÊÀ»°Å¶ó »ý°¢µÇ¾î 1°³·Î private UIBase _loadingUI; public UIBase LoadingUI { get { return _loadingUI; } } //SystemUI private List _systemUIList = new(); protected override void AwakeSingleton() { base.AwakeSingleton(); InitRoot(); } private void InitRoot() { for (int i = 0; i < _uiCanvas.transform.childCount; i++) { var root = _uiCanvas.transform.GetChild(i); //GetChild°¡ ¼øÂ÷·Î °¡Á®¿Ã °Í °°±ä Çѵ¥ Ȥ½Ã ¸ô¶ó¼­ üũ ÈÄ ´ëÀÔ foreach (E_UI_ROOT_TYPE rootType in System.Enum.GetValues(typeof(E_UI_ROOT_TYPE))) { if (rootType.ToString() == root.name) { _uiRootDict.Add(rootType, root); } } } } #region Open UI public void OpenUI(E_UI_TYPE type, Action onComplete = null) { if(_loadedUIDict.ContainsKey(type)) { GenerateUI(_loadedUIDict[type], E_UI_ROOT_TYPE.UI, onComplete); } else { AddressableManager.Instance.LoadAssetAsync(type.ToString(), result => { _loadedUIDict.Add(type, result); GenerateUI(result, E_UI_ROOT_TYPE.UI, onComplete); }); } } //½Ã½ºÅÛ ¸Þ½ÃÁö, Å佺Ʈ ¸Þ½ÃÁö - ÃÖ»ó´Ü public void OpenSystemUI(E_UI_TYPE type, Action onComplete = null) { if (_loadedUIDict.ContainsKey(type)) { GenerateUI(_loadedUIDict[type], E_UI_ROOT_TYPE.System, onComplete); } else { AddressableManager.Instance.LoadAssetAsync(type.ToString(), result => { _loadedUIDict.Add(type, result); GenerateUI(result, E_UI_ROOT_TYPE.System, onComplete); }); } } public void OpenLoadingUI(E_UI_TYPE type, Action onComplete = null) { if (_loadedUIDict.ContainsKey(type)) { GenerateUI(_loadedUIDict[type], E_UI_ROOT_TYPE.Loading, onComplete); } else { AddressableManager.Instance.LoadAssetAsync(type.ToString(), result => { _loadedUIDict.Add(type, result); GenerateUI(result, E_UI_ROOT_TYPE.Loading, onComplete); }); } } #endregion OpenUI private void GenerateUI(GameObject uiObj, E_UI_ROOT_TYPE rootType, Action onComplete) { var obj = Instantiate(uiObj, _uiRootDict[rootType]); var uiBase = obj.GetComponent(); uiBase.SetUIBaseType(rootType); switch (rootType) { case E_UI_ROOT_TYPE.UI: _uiStack.Push(uiBase); break; case E_UI_ROOT_TYPE.Loading: _loadingUI = uiBase; break; case E_UI_ROOT_TYPE.System: _systemUIList.Add(uiBase); break; } uiBase.Open(); onComplete?.Invoke(uiBase); } public void CloseUI(UIBase ui) { switch(ui.UI_ROOT_TYPE) { case E_UI_ROOT_TYPE.UI: if(_uiStack.Count > 1) { var targetUI = _uiStack.Pop(); targetUI.CloseAction(); Destroy(targetUI.gameObject); } break; case E_UI_ROOT_TYPE.System: _systemUIList.Remove(ui); Destroy(ui.gameObject); break; } } public void CloseLoadingUI() { if(_loadingUI == null) { return; } StartCoroutine(DelayCloseLoading()); } private IEnumerator DelayCloseLoading() { yield return new WaitForSeconds(1.5f); _loadingUI.CloseAction(); Destroy(_loadingUI.gameObject); _loadingUI = null; } public void ReleaseUI() { while(_uiStack.Count > 0) { var ui = _uiStack.Pop(); ui.CloseAction(); Destroy(ui.gameObject); } foreach (var systemUI in _systemUIList) { Destroy(systemUI.gameObject); } _systemUIList = new(); } }