using System; using System.Collections.Generic; using UnityEngine; namespace LapinerTools.uMyGUI { public class uMyGUI_PopupManager : MonoBehaviour { public const string POPUP_LOADING = "loading"; public const string POPUP_TEXT = "text"; public const string POPUP_DROPDOWN = "dropdown"; public const string BTN_OK = "ok"; public const string BTN_YES = "yes"; public const string BTN_NO = "no"; private static uMyGUI_PopupManager s_instance; [SerializeField] private uMyGUI_Popup[] m_popups = new uMyGUI_Popup[0]; [SerializeField] private string[] m_popupNames = new string[0]; [SerializeField] private CanvasGroup[] m_deactivatedElementsWhenPopupIsShown = new CanvasGroup[0]; public static uMyGUI_PopupManager Instance { get { if (s_instance == null) { s_instance = UnityEngine.Object.FindObjectOfType(); } if (s_instance == null) { s_instance = new GameObject(typeof(uMyGUI_PopupManager).Name).AddComponent(); } return s_instance; } } public static bool IsInstanceSet { get { return s_instance != null; } } public uMyGUI_Popup[] Popups { get { return m_popups; } set { m_popups = value; } } public string[] PopupNames { get { return m_popupNames; } set { m_popupNames = value; } } public CanvasGroup[] DeactivatedElementsWhenPopupIsShown { get { return m_deactivatedElementsWhenPopupIsShown; } set { m_deactivatedElementsWhenPopupIsShown = value; } } public bool IsPopupShown { get { for (int i = 0; i < m_popups.Length; i++) { if (m_popups[i] != null && m_popups[i].IsShown) { return true; } } return false; } } public uMyGUI_Popup ShowPopup(string p_name) { for (int i = 0; i < m_popupNames.Length && i < m_popups.Length; i++) { if (m_popupNames[i] == p_name) { return ShowPopup(i); } } if (LoadPopupFromResources(p_name) != null) { return ShowPopup(p_name); } return null; } public uMyGUI_Popup HidePopup(string p_name) { for (int i = 0; i < m_popupNames.Length && i < m_popups.Length; i++) { if (m_popupNames[i] == p_name) { return HidePopup(i); } } return null; } public uMyGUI_Popup ShowPopup(int p_index) { if (p_index >= 0 && p_index < m_popups.Length) { m_popups[p_index].Show(); return m_popups[p_index]; } Debug.LogError("uMyGUI_PopupManager: ShowPopup: popup index '" + p_index + "' is out of bounds [0," + m_popups.Length + "]!"); return null; } public uMyGUI_Popup HidePopup(int p_index) { if (p_index >= 0 && p_index < m_popups.Length) { m_popups[p_index].Hide(); return m_popups[p_index]; } Debug.LogError("uMyGUI_PopupManager: HidePopup: popup index '" + p_index + "' is out of bounds [0," + m_popups.Length + "]!"); return null; } public bool HasPopup(string p_name) { for (int i = 0; i < m_popupNames.Length; i++) { if (m_popupNames[i] == p_name) { return true; } } return false; } public bool AddPopup(uMyGUI_Popup p_popup, string p_name) { Canvas canvas = null; if (m_popups.Length > 0 && m_popups[0] != null && m_popups[0].transform.parent != null) { canvas = m_popups[0].transform.parent.GetComponentInParent(); } if (canvas == null) { canvas = GetComponentInParent(); } if (canvas == null) { canvas = UnityEngine.Object.FindObjectOfType(); } if (canvas == null) { Debug.LogError("uMyGUI_PopupManager: AddPopup: there is no Canvas in this level!"); return false; } uMyGUI_Popup[] popups = m_popups; string[] popupNames = m_popupNames; m_popups = new uMyGUI_Popup[m_popups.Length + 1]; m_popupNames = new string[m_popupNames.Length + 1]; Array.Copy(popups, m_popups, popups.Length); Array.Copy(popupNames, m_popupNames, popupNames.Length); m_popups[m_popups.Length - 1] = p_popup; m_popupNames[m_popups.Length - 1] = p_name; p_popup.transform.SetParent(canvas.transform, false); HidePopup(m_popups.Length - 1); return true; } public bool RemovePopup(uMyGUI_Popup p_popup) { for (int i = 0; i < m_popups.Length; i++) { if (m_popups[i] == p_popup) { List list = new List(m_popups); list.RemoveAt(i); m_popups = list.ToArray(); List list2 = new List(m_popupNames); list2.RemoveAt(i); m_popupNames = list2.ToArray(); return true; } } return false; } private uMyGUI_Popup LoadPopupFromResources(string p_name) { uMyGUI_Popup uMyGUI_Popup2 = UnityEngine.Object.Instantiate(Resources.Load("popup_" + p_name + "_root")); if (uMyGUI_Popup2 != null && AddPopup(uMyGUI_Popup2, p_name)) { return uMyGUI_Popup2; } return null; } private void Awake() { if (m_popups.Length != m_popupNames.Length) { Debug.LogError("uMyGUI_PopupManager: m_popups and m_popupNames must have the same length (" + m_popups.Length + "!=" + m_popupNames.Length + ")!"); } for (int i = 0; i < m_popups.Length; i++) { HidePopup(i); } } private void Update() { bool interactable = !IsPopupShown; for (int i = 0; i < m_deactivatedElementsWhenPopupIsShown.Length; i++) { m_deactivatedElementsWhenPopupIsShown[i].interactable = interactable; } } } }