using FirstVillain.Singleton; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering.Universal; 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 UIBase OpenUI(E_UI_TYPE type) { if(_loadedUIDict.ContainsKey(type)) { return GenerateUI(_loadedUIDict[type], E_UI_ROOT_TYPE.UI); } else { var obj = AddressableManager.Instance.LoadAssetAsync(type.ToString()); _loadedUIDict.Add(type, obj); return GenerateUI(obj, E_UI_ROOT_TYPE.UI); } } //½Ã½ºÅÛ ¸Þ½ÃÁö, Å佺Ʈ ¸Þ½ÃÁö - ÃÖ»ó´Ü public UIBase OpenSystemUI(E_UI_TYPE type) { if (_loadedUIDict.ContainsKey(type)) { return GenerateUI(_loadedUIDict[type], E_UI_ROOT_TYPE.System); } else { var obj = AddressableManager.Instance.LoadAssetAsync(type.ToString()); _loadedUIDict.Add(type, obj); return GenerateUI(obj, E_UI_ROOT_TYPE.System); } } public UIBase OpenLoadingUI(E_UI_TYPE type) { if (_loadedUIDict.ContainsKey(type)) { return GenerateUI(_loadedUIDict[type], E_UI_ROOT_TYPE.Loading); } else { var obj = AddressableManager.Instance.LoadAssetAsync(type.ToString()); _loadedUIDict.Add(type, obj); return GenerateUI(obj, E_UI_ROOT_TYPE.Loading); } } #endregion OpenUI private UIBase GenerateUI(GameObject uiObj, E_UI_ROOT_TYPE rootType) { 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(); return uiBase; } #region Close UI 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()); _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(); } #region Close UI #region Utils public Camera GetUICam() { var uiCam = _uiCanvas.worldCamera; uiCam.GetUniversalAdditionalCameraData().renderType = CameraRenderType.Overlay; return uiCam; } public void ResetUICam() { var uiCam = _uiCanvas.worldCamera; uiCam.GetUniversalAdditionalCameraData().renderType = CameraRenderType.Base; } #endregion Utils }