实现一个可扩展的简单 UI 框架,由 UI 管理器统一管理。
UI 管理器 - UIManager
统一管理所有 UI 界面,包括 UI 的显示与关闭。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
|
internal class UIManager : Singleton<UIManager> { private class UIElement { public string Resource;
public bool Cache;
public GameObject Instance; }
private Dictionary<Type, UIElement> UIResources = new Dictionary<Type, UIElement>();
public UIManager() { UIResources.Add(typeof(UIElement), new UIElement() { Resource = "UI/UITest", Cache = true }); }
~UIManager() { }
public T Show<T>() { Type type = typeof(T);
if (UIResources.ContainsKey(type)) { UIElement info = UIResources[type]; if (info.Instance != null) { info.Instance.SetActive(true); } else { UnityEngine.Object prefab = Resources.Load(info.Resource); if (prefab == null) { return default(T); } info.Instance = (GameObject)GameObject.Instantiate(prefab); } return info.Instance.GetComponent<T>(); } return default(T); }
public void Close(Type type) { if (UIResources.ContainsKey(type)) { UIElement info = UIResources[type]; if (info.Cache) { info.Instance.SetActive(false); } else { GameObject.Destroy(info.Instance); info.Instance = null; } } } }
|
抽象父类 - UIWindow
所有 UI 的父类,每个 UI 窗口都得继承自 UIWindow,包含几个常用方法(当点击关闭按钮,当点击确定按钮),子类可以不用重写。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
public abstract class UIWindow : MonoBehaviour { public delegate void CloseHandler(UIWindow sender, WindowResult result); public event CloseHandler OnClose;
public virtual System.Type Type { get { return this.GetType(); } }
public enum WindowResult { None = 0, Yes, No, }
public void Close(WindowResult result = WindowResult.None) { UIManager.Instance.Close(this.Type); if (this.OnClose != null) this.OnClose(this, result); this.OnClose = null; }
public virtual void OnCloseClick() { this.Close(); }
public virtual void OnYesClick() { this.Close(WindowResult.Yes); } }
|
UI 元素 - 继承自 UIWindow
这里可以重写父类方法,或者实现自定义功能,此脚本需绑定在一个 UI 预制体上。
1 2 3 4 5 6 7 8 9 10 11 12
| public class UIElement : UIWindow { private void Start() { }
private void Update() { } }
|
显示 UI 元素
使用以下代码:
UIManager.Instance.Show<UIElement>();
|
因为 Show<T>() 有返回值 T,可以这样写:
UIElement element = UIManager.Instance.Show<UIElement>();
|
这样就能拿到 UIElement 做一些有趣的事了。例如:
1 2 3 4 5 6 7 8 9 10 11
| UIElement element = UIManager.Instance.Show<UIElement>();
element.SetTitle();
element.OnClose += element_OnClose;
private void element_OnClose(UIWindow sender, UIWindow.WindowResult result) { }
|