首先是写UI的父类,所以的UI界面都是这个父类的子类
using UnityEngine; using System.Collections; public class UIBase : MonoBehaviour { public virtual void DoOnEntering(){} public virtual void DoOnPausing(){} public virtual void DoOnResuming(){} public virtual void DoOnExiting(){}} 例如我们创建一个开始UI界面,下面是这个UI界面的代码:
using UnityEngine; using System.Collections; public class ui_start : UIBase { CanvasGroup canvasGroup;//CanvasGroup 的interactable 属性可以用来判断这个UI界面是否可以操作 void Start() { canvasGroup = gameObject.GetComponent<CanvasGroup>(); } public override void DoOnEntering () { GetComponent<Canvas> ().worldCamera = Camera.main;//给UI界面的Canvas的绑定摄像头 gameObject.SetActive(true); } public override void DoOnExiting () { gameObject.SetActive (false); } public override void DoOnPausing() { canvasGroup.interactable = false; } public override void DoOnResuming() { canvasGroup.interactable = true; }} 然后是最最重要的UIManager类
using UnityEngine; using System.Collections.Generic; using System.IO; public class UIManager : MonoBehaviour { private static UIManager _instance; public static UIManager Instance{get{return _instance; }} //创建全局脚本 private Dictionary<string,UIBase> currentUIDict = new Dictionary<string, UIBase>(); private Stack<UIBase> UIStack = new Stack<UIBase>(); private Dictionary<string,GameObject> UIObjectDict = new Dictionary<string, GameObject>(); public string ResourceDir = "UI"; void Awake(){ _instance = this; // instance初始化 print(Application.dataPath); //LoadAllUIObject (); AddUIObject("OptionUI"); AddUIObject("StartUI");//这里我们添加要创建的UI界面到UIObjectDict字典里面 } public void PushUIPanel(string UIName){ if (UIStack.Count > 0) { UIBase old_topUI = UIStack.Peek(); old_topUI.DoOnPausing(); } UIBase new_topUI = GetUIBase(UIName); if (new_topUI == null) { Debug.Log ("the new_topUI is null"); } new_topUI.DoOnEntering (); UIStack.Push (new_topUI); } public UIBase GetUIBase(string UIName){ foreach (var name in currentUIDict.Keys) { if (name == UIName) return currentUIDict [name]; } GameObject UIPrefab = UIObjectDict [UIName]; GameObject UIObject = Instantiate<GameObject> (UIPrefab); //实例化对象 实例化对象后,对象便出现在camera中 UIObject.name = UIName; UIBase uibase = UIObject.GetComponent<UIBase> (); currentUIDict.Add (UIName,uibase); return uibase; } public void PopUIPanel(){ if (UIStack.Count == 0) return; UIBase old_topUI = UIStack.Pop (); old_topUI.DoOnExiting (); if (UIStack.Count > 0) { UIBase new_topUI = UIStack.Peek (); new_topUI.DoOnResuming (); } } private void AddUIObject(string name) { string path=""; path = ResourceDir + "/" + name; GameObject UIObject = Resources.Load<GameObject>(path); if (UIObject) UIObjectDict.Add(name,UIObject); }}