using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class UI_Popup : UI_Base
{
public virtual void init()
{
Managers.UI.SetCanvas(gameObject, true);
}
public virtual void ClosePopupUI()
{
Managers.UI.ClosePopupUI(this);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class UI_Scene : UI_Base
{
public virtual void init()
{
Managers.UI.SetCanvas(gameObject, false);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class UIManager
{
int _order = 10;
Stack<UI_Popup> _popupStack = new Stack<UI_Popup>();
UI_Scene _sceneUI = null;
public GameObject Root
{
get
{
GameObject root = GameObject.Find("@UI_Root");
if (root == null)
root = new GameObject { name = "@UI_Root" };
return root;
}
}
public void SetCanvas(GameObject go, bool sort = true)
{
Canvas canvas = Util.GetOrAddComponent<Canvas>(go);
canvas.renderMode = RenderMode.ScreenSpaceOverlay;
canvas.overrideSorting = true;
if (sort)
{
canvas.sortingOrder = _order;
_order++;
}
else
{
canvas.sortingOrder = 0;
}
}
public T ShowSceneUI<T>(string name = null) where T : UI_Scene
{
if (string.IsNullOrEmpty(name))
name = typeof(T).Name;
GameObject go = Managers.Resource.Instantiate($"UI/Scene/{name}");
T SceneUI = Util.GetOrAddComponent<T>(go);
_sceneUI = SceneUI;
go.transform.SetParent(Root.transform);
return SceneUI;
}
public T ShowPopupUI<T> (string name = null) where T : UI_Popup
{
if (string.IsNullOrEmpty (name))
name = typeof (T).Name;
GameObject go = Managers.Resource.Instantiate($"UI/Popup/{name}");
T popup = Util.GetOrAddComponent<T>(go);
_popupStack.Push(popup);
go.transform.SetParent(Root.transform);
return popup;
}
public void ClosePopupUI(UI_Popup popup)
{
if(_popupStack.Count == 0)
return;
if (_popupStack.Peek() != popup)
{
Debug.Log("Close Popup Failed");
return;
}
ClosePopupUI();
}
public void ClosePopupUI()
{
if (_popupStack.Count == 0)
return;
UI_Popup popup = _popupStack.Pop();
Managers.Resource.Destroy(popup.gameObject);
popup = null;
_order--;
}
public void CloseAllPopupUI()
{
while (_popupStack.Count > 0)
ClosePopupUI();
}
}
스택을 이용해 팝업 UI를 관리한다. 씬 UI같은 경우에는 스택이 필요가 없으므로 스택을 사용하지 않는다.
또한 객체들을 씬 내에서 정리하기 위해 Root라는 프로퍼티를 사용해 게임이 실행될 때 씬 내에서 Root 객체 내에 저장되게 하였다.