Unity3D自学笔记——UGUI前台架构
来源:互联网 发布:淘宝买家信誉怎么算的 编辑:程序博客网 时间:2024/05/01 22:15
UISingleton
UI组件单例模式
public class UISingleton<T> : MonoBehaviour where T : UISingleton<T>{ private static T instance = null; public static T Instance { get { if (instance == null) { instance = FindObjectOfType(typeof(T)) as T; if (instance == null) { instance = new GameObject("_" + typeof(T).Name).AddComponent<T>(); DontDestroyOnLoad(instance); } if (instance == null) Debug.LogError("Failed to create instance of " + typeof(T).FullName + "."); } return instance; } } void OnApplicationQuit() { if (instance != null) instance = null; } public static T CreateInstance() { if (Instance != null) Instance.OnCreate(); return Instance; } protected virtual void OnCreate() { }}
UIInfo
置于UGUI顶级节点,即Cavans的组件,其作用是初始化UIManager和PotonManger及调用UIManagr初始化UIScene的显示
public class UIInfo : UISingleton<UIInfo> { private UIManager uiManager; private PhotonManager photonManager; void Awake() { InitUIManager(); InitPhotonManger(); } void InitUIManager() { Object obj = FindObjectOfType(typeof(UIManager)); if (obj != null) uiManager = obj as UIManager; if (uiManager == null) { GameObject manger = new GameObject("UIManager"); uiManager = manger.AddComponent<UIManager>(); } uiManager.InitializeUIs(); //初始化UIManager uiManager.SetTitleVisible(true);//显示开始游戏一级界面 } void InitPhotonManger() { Object obj = FindObjectOfType(typeof(PhotonManager)); if (obj != null) photonManager = obj as PhotonManager; if (photonManager == null) { GameObject manger = new GameObject("PhotonManager"); photonManager = manger.AddComponent<PhotonManager>(); } }}
UIManager
UIScene管理类,首先将所有UIScene加入缓存,再动态的负责加载,显示或隐藏UIScene
public class UIManager : UISingleton<UIManager>{ private Dictionary<string, UIScene> mUIScene = new Dictionary<string, UIScene>(); public void InitializeUIs() { mUIScene.Clear(); Object[] uis = FindObjectsOfType(typeof(UIScene)); if (uis != null) { foreach (Object obj in uis) { UIScene ui = obj as UIScene; ui.SetVisible(false); mUIScene.Add(ui.gameObject.name, ui); } } } public UIScene SetVisible(string name, bool visible) { if (visible && !IsVisible(name)) { return OpenScene(name); } else if (!visible && IsVisible(name)) { return CloseScene(name); } return mUIScene[name]; ; } public bool IsVisible(string name) { UIScene ui = GetUI(name); if (ui != null) return ui.IsVisible(); return false; } private UIScene GetUI(string name) { UIScene ui; return mUIScene.TryGetValue(name, out ui) ? ui : null; } public T GetUI<T>(string name) where T : UIScene { return GetUI(name) as T; } private bool isLoaded(string name) { if (mUIScene.ContainsKey(name)) { return true; } return false; } private UIScene OpenScene(string name) { if (isLoaded(name)) { mUIScene[name].SetVisible(true); } return mUIScene[name]; } private UIScene CloseScene(string name) { if (isLoaded(name)) { mUIScene[name].SetVisible(false); } return mUIScene[name]; } //显示一级界面 public UIScene SetTitleVisible(bool visible) { return SetVisible(UIName.UILogin, visible); }}
UIScene
管理UIScene下的所有UISceneWidget, 同样先缓存,在动态管理
public class UIScene : MonoBehaviour{ protected string mUIName = ""; private Dictionary<string, UISceneWidget> mUIWidgets = new Dictionary<string, UISceneWidget>(); public ESceneType type = ESceneType.Nomal; protected virtual void Start() { this.FindChildWidgets(gameObject.transform); } protected virtual void Update() { } public virtual bool IsVisible() { return gameObject.activeSelf; } public virtual void SetVisible(bool visible) { gameObject.SetActive(visible); } protected UISceneWidget GetWidget(string name) { // If allready find out, return if (mUIWidgets.ContainsKey(name)) return mUIWidgets[name]; // Find out widget with name and add to dictionary Transform t = gameObject.transform.FindChild(name); if (t == null) return null; UISceneWidget widget = t.gameObject.GetComponent<UISceneWidget>(); if (widget != null) { mUIWidgets.Add(widget.gameObject.name, widget); } return t.gameObject.GetComponent<UISceneWidget>(); } protected T GetWidget<T>(string name) where T : Component { // Find out widget with name and add to dictionary GameObject go = GameObject.Find(name); if (go == null) return null; T widget = go.GetComponent<T>(); return widget; } private void FindChildWidgets(Transform t) { UISceneWidget widget = t.gameObject.GetComponent<UISceneWidget>(); if (widget != null) { string name = t.gameObject.name; if (!mUIWidgets.ContainsKey(name)) { mUIWidgets.Add(name, widget); } } for (int i = 0; i < t.childCount; ++i) { Transform child = t.GetChild(i); FindChildWidgets(child); } }}
UISceneWidget
界面控件类,用户捕获触发事件
public class UISceneWidget : EventTrigger{ public event Action<PointerEventData> BeginDrag; public event Action<BaseEventData> Cancel; public event Action<BaseEventData> Deselect; public event Action<PointerEventData> Drag; public event Action<PointerEventData> Drop; public event Action<PointerEventData> EndDrag; public event Action<PointerEventData> InitializePotentialDrag; public event Action<AxisEventData> Move; public event Action<PointerEventData> PointerClick; public event Action<PointerEventData> PointerDown; public event Action<PointerEventData> PointerEnter; public event Action<PointerEventData> PointerExit; public event Action<PointerEventData> PointerUp; public event Action<PointerEventData> Scroll; public event Action<BaseEventData> Select; public event Action<BaseEventData> Submit; public event Action<BaseEventData> UpdateSelected; /// <summary> /// 获取指定UGUI游戏物体的事件监听器 /// </summary> /// <param name="go"></param> /// <returns></returns> public static UISceneWidget Get(GameObject go) { UISceneWidget widget = go.GetComponent<UISceneWidget>(); if (!widget) widget = go.AddComponent<UISceneWidget>(); return widget; } public override void OnBeginDrag(PointerEventData eventData) { if (BeginDrag != null) BeginDrag(eventData); } public override void OnCancel(BaseEventData eventData) { if (Cancel != null) Cancel(eventData); } public override void OnDeselect(BaseEventData eventData) { if (Deselect != null) Deselect(eventData); } public override void OnDrag(PointerEventData eventData) { if (Drag != null) Drag(eventData); } public override void OnDrop(PointerEventData eventData) { if (Drop != null) Drop(eventData); } public override void OnEndDrag(PointerEventData eventData) { if (EndDrag != null) EndDrag(eventData); } public override void OnInitializePotentialDrag(PointerEventData eventData) { if (InitializePotentialDrag != null) InitializePotentialDrag(eventData); } public override void OnMove(AxisEventData eventData) { if (Move != null) Move(eventData); } public override void OnPointerClick(PointerEventData eventData) { if (PointerClick != null) PointerClick(eventData); } public override void OnPointerDown(PointerEventData eventData) { if (PointerDown != null) PointerDown(eventData); } public override void OnPointerEnter(PointerEventData eventData) { if (PointerEnter != null) PointerEnter(eventData); } public override void OnPointerExit(PointerEventData eventData) { if (PointerExit != null) PointerExit(eventData); } public override void OnPointerUp(PointerEventData eventData) { if (PointerUp != null) PointerUp(eventData); } public override void OnScroll(PointerEventData eventData) { if (Scroll != null) Scroll(eventData); } public override void OnSelect(BaseEventData eventData) { if (Select != null) Select(eventData); } public override void OnSubmit(BaseEventData eventData) { if (Submit != null) Submit(eventData); } public override void OnUpdateSelected(BaseEventData eventData) { if (UpdateSelected != null) UpdateSelected(eventData); }}
0 0
- Unity3D自学笔记——UGUI前台架构
- Unity3D自学笔记——UGUI系统介绍
- Unity3D自学笔记——UGUI背包系统(一)ItemData
- Unity3D自学笔记——UGUI背包系统(二)UI设计实现及数据绑定
- Unity3D自学笔记——UGUI背包系统(三)物品弹出提示框
- Unity3D自学笔记——UGUI背包系统(四)角色物品数据建立
- Unity3D自学笔记——UGUI背包系统(五)沿用Attribute设计实现物品等级
- Unity3D自学笔记——UGUI背包系统(六)角色换装及属性动态改变
- Unity3D自学笔记——UGUI背包系统(七)物品的装备与卸下
- Unity3D自学笔记——UGUI背包系统(八)物品的分类与整理
- Unity3D自学笔记——UGUI 利用遮罩显示3D人物(物体)
- Unity3D自学笔记——UGUI背包系统(九)装备对HP影响的逻辑及使用药品
- Unity3D自学笔记——Photon服务器的后台架构实现(一)
- Unity3D自学笔记——Photon服务器的后台架构实现(二)
- Unity3D自学笔记——Photon服务器的后台架构实现(三)
- Unity3D自学笔记——Photon服务器的后台架构实现(四)
- Unity3D自学笔记——Photon服务器的后台架构实现(五)
- Unity3D自学笔记——架构应用(一)用户登录
- HDU 1078 FatMouse and Cheese 递推
- Linux内核调试技术——kprobe使用与实现
- 数据结构示例之由尾部插入新元素的链表
- Josephus问题的一种解法(链表实现)
- LaTex初试
- Unity3D自学笔记——UGUI前台架构
- hdu1757 A Simple Math Problem(矩阵快速幂题解)
- 在Ubuntu下开发React-Native之填坑记(二)
- JAVA基础:程序的流程控制知识点
- Matlab绘图-很详细,很全面
- 第九周项目2- 对称矩阵压缩存储的实现与应用(2)
- 根据前序中序或后序中序确定并创建二叉树
- NOIP2006【2^k进制数】
- Android开发者的混淆使用手册