[3D跑酷] GUIManager UI管理
UI元素更新及界面跳转
继上篇日志《Unity开发之 GUIClickEventReceiver》,再谈一下我们如何管理游戏中的UI元素更新及界面跳转
UI绑定
图一:Inspector面板 Public GameObjectName与GameObject一一对应
UI结构及命名规范
图二:Hierarchy面板 UI父子结构及组件命名规范
UI枚举种类
图三:enum GUIState
UI绑定代码
图四:public UI控件定义 与Hierarchy命名规范
UI主要方法及逻辑
图五:主要方法及逻辑
主要方法
1、隐藏Transform及子Transform
#if !UNITY_3_5 private void activeRecursively(Transform obj, bool active) { foreach (Transform child in obj) { activeRecursively(child, active); } obj.gameObject.SetActive(active); } #endif
private GameObject panelFromState(GUIState state) { switch (state) { case GUIState.MainMenu: return mainMenuPanel; case GUIState.InGame: return inGamePanel; case GUIState.EndGame: return endGamePanel; case GUIState.Store: return storePanel; case GUIState.Stats: return statsPanel; case GUIState.Pause: return pausePanel; case GUIState.Tutorial: return tutorialPanel; case GUIState.Missions: return missionsPanel; } return null; // how'd we get here? }
private void changeGUIState(bool activate, GUIState state) { GameObject activePanel = panelFromState(state); if (activePanel != null) { #if UNITY_3_5 activePanel.SetActiveRecursively(activate); #else activeRecursively(activePanel.transform, activate); #endif } }
public void showGUI(GUIState state) { // activate the new gui state, deactivate the old. changeGUIState(true, state); changeGUIState(false, guiState); switch (state) { case GUIState.EndGame: endGameScore.text = dataManager.getScore().ToString(); endGameCoins.text = dataManager.getLevelCoins().ToString(); endGameMultiplier.text = string.Format("{0}x", missionManager.getScoreMultiplier()); break; case GUIState.Store: refreshStoreGUI(); // go back to the correct menu that we came from if (guiState == GUIState.MainMenu) { storeBackButtonReceiver.clickType = ClickType.MainMenu; } else { // coming from GUIState.EndGame storeBackButtonReceiver.clickType = ClickType.EndGame; } break; //...... } }
public void refreshStoreGUI() { storeTotalCoins.text = dataManager.getTotalCoins().ToString(); int cost = dataManager.getPowerUpCost(PowerUpTypes.DoubleCoin); if (cost != -1) { storeCoinDoublerCost.text = string.Format("{0} Coins", cost); } else { #if UNITY_3_5 storeCoinDoublerGroup.gameObject.SetActiveRecursively(false); #else storeCoinDoublerGroup.SetActive(false); #endif } cost = dataManager.getPowerUpCost(PowerUpTypes.CoinMagnet); if (cost != -1) { storeCoinMagnetCost.text = string.Format("{0} Coins", cost); } else { #if UNITY_3_5 storeCoinMagnetGroup.SetActiveRecursively(false); #else storeCoinMagnetGroup.SetActive(false); #endif } cost = dataManager.getPowerUpCost(PowerUpTypes.Invincibility); if (cost != -1) { storeInvincibilityCost.text = string.Format("{0} Coins", cost); } else { #if UNITY_3_5 storeInvincibilityGroup.SetActiveRecursively(false); #else storeInvincibilityGroup.SetActive(false); #endif } }