2023-10-12 19:12:46 +09:00
|
|
|
|
using FirstVillain.Singleton;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using UnityEngine;
|
2023-10-16 18:47:52 +09:00
|
|
|
|
using UnityEngine.Rendering.Universal;
|
2023-10-12 19:12:46 +09:00
|
|
|
|
|
|
|
|
|
public class UIManager : UnitySingleton<UIManager>
|
|
|
|
|
{
|
|
|
|
|
[SerializeField] private Canvas _uiCanvas;
|
|
|
|
|
private Dictionary<E_UI_ROOT_TYPE, Transform> _uiRootDict = new();
|
|
|
|
|
private Dictionary<E_UI_TYPE, GameObject> _loadedUIDict = new();
|
|
|
|
|
|
|
|
|
|
//Basic UI
|
|
|
|
|
private Stack<UIBase> _uiStack = new();
|
|
|
|
|
|
|
|
|
|
//Loading UI - Loading<6E><67> 2<><32><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ŷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> 1<><31><EFBFBD><EFBFBD>
|
|
|
|
|
private UIBase _loadingUI;
|
|
|
|
|
public UIBase LoadingUI { get { return _loadingUI; } }
|
|
|
|
|
|
|
|
|
|
//SystemUI
|
|
|
|
|
private List<UIBase> _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<6C><64> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>ѵ<EFBFBD> Ȥ<><C8A4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ <20><> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
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
|
2023-10-18 20:45:27 +09:00
|
|
|
|
public UIBase OpenUI(E_UI_TYPE type)
|
2023-10-12 19:12:46 +09:00
|
|
|
|
{
|
|
|
|
|
if(_loadedUIDict.ContainsKey(type))
|
|
|
|
|
{
|
2023-10-18 20:45:27 +09:00
|
|
|
|
return GenerateUI(_loadedUIDict[type], E_UI_ROOT_TYPE.UI);
|
2023-10-12 19:12:46 +09:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2023-10-18 20:45:27 +09:00
|
|
|
|
var obj = AddressableManager.Instance.LoadAssetAsync<GameObject>(type.ToString());
|
|
|
|
|
|
|
|
|
|
_loadedUIDict.Add(type, obj);
|
|
|
|
|
return GenerateUI(obj, E_UI_ROOT_TYPE.UI);
|
2023-10-12 19:12:46 +09:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//<2F>ý<EFBFBD><C3BD><EFBFBD> <20><EFBFBD><DEBD><EFBFBD>, <20>佺Ʈ <20><EFBFBD><DEBD><EFBFBD> - <20>ֻ<EFBFBD><D6BB><EFBFBD>
|
2023-10-18 20:45:27 +09:00
|
|
|
|
public UIBase OpenSystemUI(E_UI_TYPE type)
|
2023-10-12 19:12:46 +09:00
|
|
|
|
{
|
|
|
|
|
if (_loadedUIDict.ContainsKey(type))
|
|
|
|
|
{
|
2023-10-18 20:45:27 +09:00
|
|
|
|
return GenerateUI(_loadedUIDict[type], E_UI_ROOT_TYPE.System);
|
2023-10-12 19:12:46 +09:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2023-10-18 20:45:27 +09:00
|
|
|
|
var obj = AddressableManager.Instance.LoadAssetAsync<GameObject>(type.ToString());
|
|
|
|
|
_loadedUIDict.Add(type, obj);
|
|
|
|
|
return GenerateUI(obj, E_UI_ROOT_TYPE.System);
|
2023-10-12 19:12:46 +09:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-10-18 20:45:27 +09:00
|
|
|
|
public UIBase OpenLoadingUI(E_UI_TYPE type)
|
2023-10-12 19:12:46 +09:00
|
|
|
|
{
|
|
|
|
|
if (_loadedUIDict.ContainsKey(type))
|
|
|
|
|
{
|
2023-10-18 20:45:27 +09:00
|
|
|
|
return GenerateUI(_loadedUIDict[type], E_UI_ROOT_TYPE.Loading);
|
2023-10-12 19:12:46 +09:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2023-10-18 20:45:27 +09:00
|
|
|
|
var obj = AddressableManager.Instance.LoadAssetAsync<GameObject>(type.ToString());
|
|
|
|
|
_loadedUIDict.Add(type, obj);
|
|
|
|
|
return GenerateUI(obj, E_UI_ROOT_TYPE.Loading);
|
2023-10-12 19:12:46 +09:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion OpenUI
|
|
|
|
|
|
2023-10-18 20:45:27 +09:00
|
|
|
|
private UIBase GenerateUI(GameObject uiObj, E_UI_ROOT_TYPE rootType)
|
2023-10-12 19:12:46 +09:00
|
|
|
|
{
|
|
|
|
|
var obj = Instantiate(uiObj, _uiRootDict[rootType]);
|
|
|
|
|
var uiBase = obj.GetComponent<UIBase>();
|
|
|
|
|
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();
|
2023-10-18 20:45:27 +09:00
|
|
|
|
return uiBase;
|
2023-10-12 19:12:46 +09:00
|
|
|
|
}
|
|
|
|
|
|
2023-10-21 18:40:11 +09:00
|
|
|
|
#region Close UI
|
2023-10-12 19:12:46 +09:00
|
|
|
|
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;
|
|
|
|
|
}
|
2023-10-16 18:47:52 +09:00
|
|
|
|
//StartCoroutine(DelayCloseLoading());
|
|
|
|
|
_loadingUI.CloseAction();
|
|
|
|
|
Destroy(_loadingUI.gameObject);
|
|
|
|
|
_loadingUI = null;
|
2023-10-12 19:12:46 +09:00
|
|
|
|
}
|
2023-10-21 18:40:11 +09:00
|
|
|
|
|
2023-10-12 19:12:46 +09:00
|
|
|
|
|
|
|
|
|
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();
|
|
|
|
|
}
|
2023-10-16 18:47:52 +09:00
|
|
|
|
|
2023-10-21 18:40:11 +09:00
|
|
|
|
#region Close UI
|
|
|
|
|
|
|
|
|
|
#region Utils
|
2023-10-16 18:47:52 +09:00
|
|
|
|
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;
|
|
|
|
|
}
|
2023-10-21 18:40:11 +09:00
|
|
|
|
#endregion Utils
|
2023-10-12 19:12:46 +09:00
|
|
|
|
}
|