using UnityEngine; using System.Collections.Generic; namespace GameSupport { [System.Serializable] public class UIScreenPrefabFile { public UIScreenType uiScreenType; public string fileName; } public class UIManager : MonoBehaviour { [SerializeField] List m_uiPrefabs; Dictionary m_prefabFiles = new Dictionary(); Stack m_screenStack = new Stack(); UIScreenBase m_hud; UIScreenBase m_transitionScreen; const int MIN_SCREEN_PANEL_DEPTH = 10; int m_transitionPanelDepth = 300; int m_currentPanelDepth = MIN_SCREEN_PANEL_DEPTH; void Awake() { InitializePrefabFiles(); } public void ReleaseResources() { PopAllScreens(); SetHUD(UIScreenType.None, null); SetTransitionScreen(UIScreenType.None, null); } public UIScreenBase PushScreen(UIScreenType screenType, UIScreenArgs args) { UIScreenBase screen = LoadScreen(screenType); if(screen == null) { return null; } m_currentPanelDepth = IncrementScreenPanelDepth(screen, m_currentPanelDepth); m_screenStack.Push(screen); screen.Initialize(args); return screen; } public void PopScreen() { if(m_screenStack.Count == 0) return; UIScreenBase old = m_screenStack.Peek(); m_screenStack.Pop(); old.ReleaseResources(); old.transform.SetParent(null); GameObject.Destroy(old.gameObject); } public void PopAllScreens() { while(m_screenStack.Count > 0) { PopScreen(); } m_currentPanelDepth = MIN_SCREEN_PANEL_DEPTH; } public void PopAllButTopScreen() { if(m_screenStack.Count <= 1) return; UIScreenBase topScreen = m_screenStack.Peek(); m_screenStack.Pop(); PopAllScreens(); m_screenStack.Push(topScreen); } public void HidePreviousScreen() { if(m_screenStack.Count <= 1) return; UIScreenBase topScreen = m_screenStack.Peek(); m_screenStack.Pop(); UIScreenBase previousScreen = m_screenStack.Peek(); previousScreen.Hide(); m_screenStack.Push(topScreen); } public UIScreenBase GetTopScreen() { if(m_screenStack.Count > 0) { return m_screenStack.Peek(); } return null; } public UIScreenBase SetHUD(UIScreenType screenType, UIScreenArgs args) { if(m_hud != null) { m_hud.ReleaseResources(); m_hud.transform.parent = null; m_hud.gameObject.SetActive(false); GameObject.Destroy(m_hud.gameObject); } if(screenType == UIScreenType.None) { m_hud = null; return null; } m_hud = LoadScreen(screenType); if(m_hud == null) { return null; } m_hud.Initialize(args); return m_hud; } public UIScreenBase GetHUD() { return m_hud; } public UIScreenBase SetTransitionScreen(UIScreenType screenType, UIScreenArgs args) { if(m_transitionScreen != null) { m_transitionScreen.ReleaseResources(); m_transitionScreen.transform.parent = null; m_transitionScreen.gameObject.SetActive(false); GameObject.Destroy(m_transitionScreen.gameObject); } if(screenType == UIScreenType.None) { m_transitionScreen = null; return null; } m_transitionScreen = LoadScreen (screenType) as UIScreenBase; if(m_transitionScreen == null) { return null; } IncrementScreenPanelDepth(m_transitionScreen, m_transitionPanelDepth); m_transitionScreen.Initialize(args); return m_transitionScreen; } public UIScreenBase GetTransitionScreen() { return m_transitionScreen; } int IncrementScreenPanelDepth(UIScreenBase screen, int increment) { int maxPanelDepth = 0; int minPanelDepth = 0; Canvas[] canvases = screen.gameObject.GetComponentsInChildren(); for(int i=0; i(fileName); if(prefab == null) { Debug.LogError("Could not load the ui prefab file: " + fileName); return null; } UIScreenBase screen = GameObject.Instantiate(prefab) as UIScreenBase; GameObject go = screen.gameObject; go.transform.SetParent(gameObject.transform); go.SetActive(true); return screen; } void InitializePrefabFiles() { for(int i=0; i