using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using DG.Tweening; using System.Collections; public enum EPopupType { Blind, SettingPopup, AllMonthTypePopup, AllMonthTypePopup_AI, AllMonthTypePopup_Floor, ResultPopup, PausePopup, FirstBbugPopup, ShakeSelectPopup, ShakePopup, ShakeSelectPopup_AI, DoublePeeSelectPopup, FloorCardSelectPopup, GoStopPopup, WaitForAIBehaviourPopup, QuitPopup, NagariPopup, KeyChargePopup, HeartChargePopup, GoldChargePopup, Max, NotMinimumVersionPopup, FailDowonloadPopup, PrivacyPoilcyPopup, AgreeConditionsPopup, NotOnline_ClosePopup, NotEnoughGoldPopup, SuccessIAPPopup, FailIAPPopup, FailLoadADSPopup, NotVaildFreeHeartPopup, NotVaildFreeHaert_ADS_Popup, MonthlyPurchaselimitPopup, DoubleHeartWarningPopup, ADSRemovePopup, AlbumOpenPopup, PreViewPopup, PreViewUIPopup, MissionOpenPopup, CloudSavePopup, CloudSaveCompletePopup, CloudSaveFailPopup, CloudLoadPopup, CloudLoadCompletePopup, CloudLoadFailPopup, CloudLoadNoDataPopup, CashOverPopup, NoDiaPPopup, } public enum EGraphicRaycasterType { Max } public class UIManager : MonoBehaviour { #region Fields private Stack<(EPopupType key, PopupBase value)> _stkActivatedPopupbases; private HashSet _hashActivatedPopupTypes; private Dictionary> _dicRegitedGRs; private Dictionary _dicUnDetroyedPopups; private CanvasGroup _rootPanelCG; private IEnumerator _eHideDirect; private bool _isInStoreDuringGame; #endregion #region Properties public EPopupType TopPopup { get => _stkActivatedPopupbases.Count > 0 ? _stkActivatedPopupbases.Peek().key : EPopupType.Max; } public Transform PopupCanvasTransform; public bool Escapeable { get; set; } = true; #endregion #region Behaviour private void Awake() { this.InitializeContainers(); _dicUnDetroyedPopups = new Dictionary { { EPopupType.Blind, null }, }; } private void Start() { GameManager.Event.RegistEvent(EEventType.MoveToStore_Heart_DuringGame, this.MoveToStore_Heart_DuringGameCallback); } private void Update() { if (Input.GetKeyDown(KeyCode.Escape)) { if (_isInStoreDuringGame) { GameManager.Event.InvokeEvent(EEventType.OnReturnToGameFromStore); } else if (_stkActivatedPopupbases.Count <= 0) { if (Escapeable && GamePanel.Instance != null) { if (!GamePanel.Instance.GameOver) { //if (GameManager.UI.IsOpendPopup(EPopupType.PausePopup) == false) // GameManager.UI.ShowNStackPopup(EPopupType.PausePopup); } else { if (GameManager.UI.IsOpendPopup(EPopupType.QuitPopup) == false) GameManager.UI.ShowNStackPopup(EPopupType.QuitPopup); } } } //else // HideTopPopup(); } } #endregion #region Methods #region Public Methods ==================== public void RegisterGraphicRaycaster(EGraphicRaycasterType grType, GraphicRaycaster raycaster) { if (_dicRegitedGRs.ContainsKey(grType)) { _dicRegitedGRs[grType].Add(raycaster); } else { Debug.LogError($"{nameof(_dicRegitedGRs)} has not {grType}!, Please Check this Container."); } } public void ReleaseGraphicRaycaster(EGraphicRaycasterType grType, GraphicRaycaster raycaster) { if (_dicRegitedGRs.ContainsKey(grType)) { for (int i = 0; i < _dicRegitedGRs[grType].Count; i++) { if (_dicRegitedGRs[grType][i] == raycaster) { _dicRegitedGRs[grType].RemoveAt(i); break; } } } else { Debug.LogWarning($"{grType} is Already Removed."); } } public void ShowNStackPopup(EPopupType type) { StartCoroutine(coroShowNStackPopup(type)); } private System.Collections.IEnumerator coroShowNStackPopup(EPopupType type) { yield return new WaitForEndOfFrame(); this.CreatePopup(type).ShowPopup(_stkActivatedPopupbases.Count); } public T ShowNStackPopup(EPopupType type) where T : PopupBase { PopupBase pBase = this.CreatePopup(type); pBase.ShowPopup(_stkActivatedPopupbases.Count); return pBase as T; } public void HideTopPopup() { var popup = _stkActivatedPopupbases.Pop(); popup.value.HidePopup(); _hashActivatedPopupTypes.Remove(popup.key); if (_stkActivatedPopupbases.Count == 0) { _dicUnDetroyedPopups[EPopupType.Blind].HidePopup(); this.HideDirectEnabled(false); } else _dicUnDetroyedPopups[EPopupType.Blind].SetDrawOrder(_stkActivatedPopupbases.Count); } public void HideAllPopup() { StartCoroutine(coroHideAllPopup()); } private IEnumerator coroHideAllPopup() { while (_stkActivatedPopupbases.Count > 0) { HideTopPopup(); yield return null; } } public bool IsOpendPopup(EPopupType type) { return _hashActivatedPopupTypes.Contains(type); } public bool IsAnyPopupOpened() { return _hashActivatedPopupTypes.Count > 0; } public void AllRaycastEnabled(bool enabled) { foreach (var pair in _dicRegitedGRs) { for (int i = 0; i < pair.Value.Count; i++) pair.Value[i].enabled = enabled; } } public void BlindPopupEnabled(bool b) { _dicUnDetroyedPopups[EPopupType.Blind].GetComponent().alpha = b ? 1 : 0; } public void ActivateLoadingPage() { } public void DeactivateLoadingPage() { } #endregion #region Private Methods ==================== private void InitializeContainers() { _dicRegitedGRs = new Dictionary>(); _stkActivatedPopupbases = new Stack<(EPopupType key, PopupBase value)>(); _hashActivatedPopupTypes = new HashSet(); for (EGraphicRaycasterType i = 0; i < EGraphicRaycasterType.Max; i++) _dicRegitedGRs.Add(i, new List()); } private void MoveToStore_Heart_DuringGameCallback() { } private PopupBase CreatePopup(EPopupType type) { if (_stkActivatedPopupbases.Count == 0) { if (_dicUnDetroyedPopups[EPopupType.Blind] == null) { _dicUnDetroyedPopups[EPopupType.Blind] = this.LoadPopupPrefab(EPopupType.Blind); } BlindPopupEnabled(true); } PopupBase pBase; if (IsUnDestroyedPopup(type)) pBase = this.GetUnDestroyedPopup(type); else pBase = this.LoadPopupPrefab(type); _stkActivatedPopupbases.Push((type, pBase)); _hashActivatedPopupTypes.Add(type); _dicUnDetroyedPopups[EPopupType.Blind].ShowPopup(_stkActivatedPopupbases.Count); return pBase; } private bool IsUnDestroyedPopup(EPopupType type) { switch (type) { case EPopupType.Blind: return true; default: return false; } } private PopupBase GetUnDestroyedPopup(EPopupType type) { switch (type) { case EPopupType.Blind: { if (_dicUnDetroyedPopups[type] == null) _dicUnDetroyedPopups[type] = LoadPopupPrefab(type); return _dicUnDetroyedPopups[type]; } default: return LoadPopupPrefab(type); } } private PopupBase LoadPopupPrefab(EPopupType type) { if (PopupCanvasTransform == null) { if (GameManager.Scene.CurrentSceneType == ESceneType.Main) { } PopupCanvasTransform = GameObject.Find("PopupPanel").transform; _rootPanelCG = PopupCanvasTransform.GetComponent(); } string path = ResourceManager.PREFAB_PATH + "Popups/"; switch (type) { case EPopupType.Blind: return Instantiate(Resources.Load(path + "BlindPopup"), PopupCanvasTransform); case EPopupType.ResultPopup: return Instantiate(Resources.Load(path + "ResultPopup"), PopupCanvasTransform); case EPopupType.AllMonthTypePopup: return Instantiate(Resources.Load(path + "AllMonthTypePopup"), PopupCanvasTransform); case EPopupType.AllMonthTypePopup_AI: return Instantiate(Resources.Load(path + "AllMonthTypePopup_AI"), PopupCanvasTransform); case EPopupType.AllMonthTypePopup_Floor: return Instantiate(Resources.Load(path + "AllMonthTypePopup_Floor"), PopupCanvasTransform); case EPopupType.PausePopup: return Instantiate(Resources.Load(path + "PausePopup"), PopupCanvasTransform); case EPopupType.FirstBbugPopup: return Instantiate(Resources.Load(path + "FirstBbugPopup"), PopupCanvasTransform); case EPopupType.ShakeSelectPopup: return Instantiate(Resources.Load(path + "ShakeSelectPopup"), PopupCanvasTransform); case EPopupType.ShakePopup: return Instantiate(Resources.Load(path + "ShakePopup"), PopupCanvasTransform); case EPopupType.ShakeSelectPopup_AI: return Instantiate(Resources.Load(path + "ShakeSelectPopup_AI"), PopupCanvasTransform); case EPopupType.DoublePeeSelectPopup: return Instantiate(Resources.Load(path + "DoublePeeSelectPopup"), PopupCanvasTransform); case EPopupType.FloorCardSelectPopup: return Instantiate(Resources.Load(path + "FloorPeeSelectPopup"), PopupCanvasTransform); case EPopupType.GoStopPopup: return Instantiate(Resources.Load(path + "GoStopPopup"), PopupCanvasTransform); case EPopupType.WaitForAIBehaviourPopup: return Instantiate(Resources.Load(path + "WaitForAIBehaviourPopup"), PopupCanvasTransform); case EPopupType.QuitPopup: return Instantiate(Resources.Load(path + "QuitPopup"), PopupCanvasTransform); case EPopupType.NagariPopup: return Instantiate(Resources.Load(path + "NagariPopup"), PopupCanvasTransform); case EPopupType.KeyChargePopup: return Instantiate(Resources.Load(path + "KeyChargePopup"), PopupCanvasTransform); case EPopupType.HeartChargePopup: return Instantiate(Resources.Load(path + "HeartChargePopup"), PopupCanvasTransform); case EPopupType.GoldChargePopup: return Instantiate(Resources.Load(path + "GoldChargePopup"), PopupCanvasTransform); case EPopupType.SettingPopup: return Instantiate(Resources.Load(path + "SettingPopup"), PopupCanvasTransform); case EPopupType.NotMinimumVersionPopup: return Instantiate(Resources.Load(path + "NotMinimumVersionPopup"), PopupCanvasTransform); case EPopupType.FailDowonloadPopup: return Instantiate(Resources.Load(path + "FailDowonloadPopup"), PopupCanvasTransform); case EPopupType.PrivacyPoilcyPopup: return Instantiate(Resources.Load(path + "PrivacyPoilcyPopup"), PopupCanvasTransform); case EPopupType.AgreeConditionsPopup: return Instantiate(Resources.Load(path + "AgreeConditionsPopup"), PopupCanvasTransform); case EPopupType.NotOnline_ClosePopup: return Instantiate(Resources.Load(path + "NotOnline_ClosePopup"), PopupCanvasTransform); case EPopupType.SuccessIAPPopup: return Instantiate(Resources.Load(path + "SuccessIAPPopup"), PopupCanvasTransform); case EPopupType.FailIAPPopup: return Instantiate(Resources.Load(path + "FailIAPPopup"), PopupCanvasTransform); case EPopupType.FailLoadADSPopup: return Instantiate(Resources.Load(path + "FailLoadADSPopup"), PopupCanvasTransform); case EPopupType.NotEnoughGoldPopup: return Instantiate(Resources.Load(path + "NotEnoughGoldPopup"), PopupCanvasTransform); case EPopupType.NotVaildFreeHeartPopup: return Instantiate(Resources.Load(path + "NotVaildFreeHeartPopup"), PopupCanvasTransform); case EPopupType.NotVaildFreeHaert_ADS_Popup: return Instantiate(Resources.Load(path + "NotVaildFreeHaert_ADS_Popup"), PopupCanvasTransform); case EPopupType.MonthlyPurchaselimitPopup: return Instantiate(Resources.Load(path + "MonthlyPurchaselimitPopup"), PopupCanvasTransform); case EPopupType.DoubleHeartWarningPopup: return Instantiate(Resources.Load(path + "DoubleHeartWarningPopup"), PopupCanvasTransform); case EPopupType.ADSRemovePopup: return Instantiate(Resources.Load(path + "ADSRemovePopup"), PopupCanvasTransform); case EPopupType.AlbumOpenPopup: return Instantiate(Resources.Load(path + "AlbumOpenPopup"), PopupCanvasTransform); case EPopupType.PreViewPopup: return Instantiate(Resources.Load(path + "PreViewPopup"), PopupCanvasTransform); case EPopupType.PreViewUIPopup: return Instantiate(Resources.Load(path + "PreViewUIPopup"), PopupCanvasTransform); case EPopupType.MissionOpenPopup: return Instantiate(Resources.Load(path + "MissionOpenPopup"), PopupCanvasTransform); case EPopupType.CloudSavePopup: return Instantiate(Resources.Load(path + "CloudSavePopup"), PopupCanvasTransform); case EPopupType.CloudSaveCompletePopup: return Instantiate(Resources.Load(path + "CloudSaveCompletePopup"), PopupCanvasTransform); case EPopupType.CloudSaveFailPopup: return Instantiate(Resources.Load(path + "CloudSaveFailPopup"), PopupCanvasTransform); case EPopupType.CloudLoadPopup: return Instantiate(Resources.Load(path + "CloudLoadPopup"), PopupCanvasTransform); case EPopupType.CloudLoadCompletePopup: return Instantiate(Resources.Load(path + "CloudLoadCompletePopup"), PopupCanvasTransform); case EPopupType.CloudLoadFailPopup: return Instantiate(Resources.Load(path + "CloudLoadFailPopup"), PopupCanvasTransform); case EPopupType.CloudLoadNoDataPopup: return Instantiate(Resources.Load(path + "CloudLoadNoDataPopup"), PopupCanvasTransform); case EPopupType.CashOverPopup: return Instantiate(Resources.Load(path + "CashOverPopup"), PopupCanvasTransform); case EPopupType.NoDiaPPopup: return Instantiate(Resources.Load(path + "NoDiaPPopup"), PopupCanvasTransform); default: return null; } } public void HideDirectEnabled(bool b) { if (PopupCanvasTransform == null) { if (GameManager.Scene.CurrentSceneType == ESceneType.Main) { PopupCanvasTransform = GameObject.Find("PopupPanel").transform; _rootPanelCG = PopupCanvasTransform.GetComponent(); } } else if (_rootPanelCG == null) { _rootPanelCG = PopupCanvasTransform.GetComponent(); } if (b) { if (_eHideDirect == null) { _eHideDirect = this.coroHideDirectEnabled(true); StartCoroutine(_eHideDirect); } } else { if (_eHideDirect != null) { StopCoroutine(_eHideDirect); } _eHideDirect = this.coroHideDirectEnabled(false); StartCoroutine(_eHideDirect); } } private IEnumerator coroHideDirectEnabled(bool b) { _rootPanelCG.DOFade(b ? 0 : 1, 0.1f).SetEase(Ease.Linear).SetRecyclable(true); yield return new WaitForSeconds(0.1f); _rootPanelCG.alpha = b ? 0 : 1; _eHideDirect = null; } #endregion #endregion } [RequireComponent(typeof(Canvas), typeof(GraphicRaycaster))] public class PopupBase : MonoBehaviour { protected float OpenDuration = 0.25f; protected float OpenStartScale = 0.8f; protected UnityEngine.Canvas canvas; protected virtual void Awake() { canvas = this.GetComponent(); if (canvas.worldCamera == null) canvas.worldCamera = Camera.main; } public virtual void ShowPopup(int drawOrder) { this.SetDrawOrder(drawOrder); this.GetComponent().DOScale(1f, OpenDuration).From(OpenStartScale).SetEase(Ease.OutExpo); if (!this.gameObject.activeInHierarchy) gameObject.SetActive(true); } public virtual void SetDrawOrder(int drawOrder) { if (canvas == null) canvas = this.GetComponent(); canvas.sortingOrder = (drawOrder + 1) * 2; } public virtual void GraphicRaycastEnabled(bool b) { UnityEngine.UI.GraphicRaycaster raycaster; if (this.TryGetComponent(out raycaster)) { raycaster.enabled = b; } else { Debug.LogWarning($"{this.gameObject.name} has not 'Graphic Raycaster!'"); } } public virtual void HidePopup() { GameManager.UI.HideDirectEnabled(false); Destroy(this.gameObject); } public void HideCanvasButtonDown() { GameManager.UI.HideDirectEnabled(true); } public void HideCanvasButtonUp() { GameManager.UI.HideDirectEnabled(false); } }