首先是写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);
}
}