需求
- UI窗口(Canvas)的统一管理(记录、提供窗口显示隐藏的功能)。
- UI事件管理
UI结构
根对象(空物体) : UIManager类
——窗口 : UIXXXWindow :UIWindow类
————交互元素: UIEventListener类
核心类结构
- UI窗口类(UIWindow)
-----所有UI窗口的基类(父类、继承类)
-----用层次化的方式管理具体窗口类
-----定义所有窗口的共有行为(显隐、获取事件监听器) - UI管理类(UIManager)
-----管理(记录、禁用、查找)所有的窗口 - UI事件监听器(UIEventListener)
-----提供当前UI所有事件(具有事件参数类)
使用方式
- 定义UIXXXWindow类,继承自UIWindow基类,负责处理该窗口逻辑。
- 通过窗口基类UIWindow的GetUIEventListener方法来获取需要交互的UI元素事件监听器。
- 通过事件监听器UIEventListener类来提供各种事件,实现交互行为
- 通过UIManager来访问各个窗口成员
—///;方式:UIManager.Instance.GetWindow<窗口类型>().成员;
类图架构
代码
UIManager
在这里插入代码片
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Common;
using System;
namespace VR.UGUI.Framewrok
{
//namespace 域名.项目名称.模块
/// <summary>
/// UI管理器:管理所有Window窗口
/// 功能:
/// 1.管理所有窗口
/// 2.记录所有窗口
/// 3.隐藏所有窗口
/// 2.提供查找窗口的方法
/// </summary>
/// 继承单例类
public class UIManager:MonoSingleton<UIManager>
{
//字典<Key是窗口的名称,Value是窗口对象的引用>
private Dictionary<string,UIWindow> uiWindowDic;
//重写基类的初始化
public override void Init()
{
base.Init();
//将所有窗口对象都记录到UIWindow类型的数组中
uiWindowDic= new Dictionary<string,UIWindow>();
UIWindow[] uiWindowArr = FindObjectsOfType<UIWindow>();
for (int i = 0; i < uiWindowArr.Length; i++)
{
//隐藏窗口
uiWindowArr[i].SetVisible(false);
//记录窗口
AddWindow(uiWindowArr[i]);
}
}
/// <summary>
/// 添加新窗口,动态创建窗口
/// </summary>
/// <param name="window">窗口对象</param>
public void AddWindow(UIWindow window)
{
uiWindowDic.Add(window.GetType().Name, window);
}
/// <summary>
/// 根据窗口的类型查找窗口
/// </summary>
/// <typeparam name="T">需要查找的窗口类型</typeparam>
/// <returns>指定窗口的对象</returns>
public T GetWindow<T>() where T: class
{
//类名
string key = typeof(T).Name;
//没有此窗口类型对象返回空
if (!uiWindowDic.ContainsKey(key))
{
return null;
}
return uiWindowDic[key] as T;
}
}
}
UIWindow
在这里插入代码片
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Common;
using System;
namespace VR.UGUI.Framewrok
{
//namespace 域名.项目名称.模块
/// <summary>
/// UI管理器:管理所有Window窗口
/// 功能:
/// 1.管理所有窗口
/// 2.记录所有窗口
/// 3.隐藏所有窗口
/// 2.提供查找窗口的方法
/// </summary>
/// 继承单例类
public class UIManager:MonoSingleton<UIManager>
{
//字典<Key是窗口的名称,Value是窗口对象的引用>
private Dictionary<string,UIWindow> uiWindowDic;
//重写基类的初始化
public override void Init()
{
base.Init();
//将所有窗口对象都记录到UIWindow类型的数组中
uiWindowDic= new Dictionary<string,UIWindow>();
UIWindow[] uiWindowArr = FindObjectsOfType<UIWindow>();
for (int i = 0; i < uiWindowArr.Length; i++)
{
//隐藏窗口
uiWindowArr[i].SetVisible(false);
//记录窗口
AddWindow(uiWindowArr[i]);
}
}
/// <summary>
/// 添加新窗口,动态创建窗口
/// </summary>
/// <param name="window">窗口对象</param>
public void AddWindow(UIWindow window)
{
uiWindowDic.Add(window.GetType().Name, window);
}
/// <summary>
/// 根据窗口的类型查找窗口
/// </summary>
/// <typeparam name="T">需要查找的窗口类型</typeparam>
/// <returns>指定窗口的对象</returns>
public T GetWindow<T>() where T: class
{
//类名
string key = typeof(T).Name;
//没有此窗口类型对象返回空
if (!uiWindowDic.ContainsKey(key))
{
return null;
}
return uiWindowDic[key] as T;
}
}
}
UIEventListener
在这里插入代码片
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Common;
using System;
namespace VR.UGUI.Framewrok
{
//namespace 域名.项目名称.模块
/// <summary>
/// UI管理器:管理所有Window窗口
/// 功能:
/// 1.管理所有窗口
/// 2.记录所有窗口
/// 3.隐藏所有窗口
/// 2.提供查找窗口的方法
/// </summary>
/// 继承单例类
public class UIManager:MonoSingleton<UIManager>
{
//字典<Key是窗口的名称,Value是窗口对象的引用>
private Dictionary<string,UIWindow> uiWindowDic;
//重写基类的初始化
public override void Init()
{
base.Init();
//将所有窗口对象都记录到UIWindow类型的数组中
uiWindowDic= new Dictionary<string,UIWindow>();
UIWindow[] uiWindowArr = FindObjectsOfType<UIWindow>();
for (int i = 0; i < uiWindowArr.Length; i++)
{
//隐藏窗口
uiWindowArr[i].SetVisible(false);
//记录窗口
AddWindow(uiWindowArr[i]);
}
}
/// <summary>
/// 添加新窗口,动态创建窗口
/// </summary>
/// <param name="window">窗口对象</param>
public void AddWindow(UIWindow window)
{
uiWindowDic.Add(window.GetType().Name, window);
}
/// <summary>
/// 根据窗口的类型查找窗口
/// </summary>
/// <typeparam name="T">需要查找的窗口类型</typeparam>
/// <returns>指定窗口的对象</returns>
public T GetWindow<T>() where T: class
{
//类名
string key = typeof(T).Name;
//没有此窗口类型对象返回空
if (!uiWindowDic.ContainsKey(key))
{
return null;
}
return uiWindowDic[key] as T;
}
}
}
TransformHelper类
在这里插入代码片
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Common
{
//namespace 域名.项目名称.模块
/// <summary>
/// 变换组件助手类
/// </summary>
public static class TransformHelper
{
/// <summary>
/// 未知层级,查找后代指定名称的变换组件
/// </summary>
/// <param name="currentTf">当前变换组件</param>
/// <param name="childName">后代物体的名称</param>
/// <returns></returns>
/// this 前缀修饰:将静态方法转为扩展方法
public static Transform FindChildByName( this Transform currentTf,string childName)
{
//递归:方法内部有调用自己的过程
//1.通过子物体名称在子物体中查找变换组件
Transform childTF = currentTf.Find(childName);
if (childTF!=null)
{
return childTF;
}
for (int i = 0; i < currentTf.childCount; i++)
{
//2.将任务交给子物体,子物体又查找子物体的子物体
childTF = FindChildByName(currentTf.GetChild(i), childName);
if (childTF!=null)
{
return childTF;
}
}
return null;
}
}
}