本文是根据学习SiKi学院上的UI框架总结得来的,仅仅是作为学习过程的记录,便于以后回顾。首先看下UI框架总体的设计思路:
一.UIPanelType:枚举类型,为了存储UI界面有哪几种类型。
二.UIPanelType.json:json文件,为了保存UI界面的Prefab存储路径。
三.UIManager:
(1)解析json并存储在Dictionary中,用于实例化UI界面;
(2)保存所有实例化的面板,避免重复加载UI界面;
(3)用Stack保存所有显示的页面,避免跨界面操作;
四.界面都有四种状态:显示,暂停,恢复,关闭。因此可以设计为对应四种状态函数,分别为:OnEnter(),OnPause(),OnResume(),OnExit(),四种状态函数关系如上。且将它们写在BasePanel中,每个UI界面再分别继承与BasePanel类,这样便于维护。
(1)OnEnter():UI界面被显示的时候调用,因此可以在此处插入声音、动画等;
(2)OnPause():UI界面跳转到新界面时被被调用;
(3)OnResume():UI界面从新界面跳转回来被调用;
(4)OnExit():当前UI界面被关闭时调用;
五.进行UI框架设计时,遇到的问题:
(1)JsonUtility无法解析数组类型
解决方案:JsonUtility仅仅只支持对象解析,而不支持数组与List解析。如果要解析List或数组,需要将该json文件List或数组属性转换成对象对象。
(2)扩展方法的使用
扩展方法无法访问被扩展类的私有数据,增加的被扩展类的安全性。
特点:
1.静态类
2.静态方法
3.第一个参数为扩展类型,需要将其用this修饰,表示被扩展类型
eg:
public static class MyExtensions
{
public static int WordCount(this String str)
{
return str.Split(new char[] { ' ', '.', '?' },
StringSplitOptions.RemoveEmptyEntries).Length;
}
}
string s = "Hello Extension Methods";
int i = s.WordCount();
(3)GetComponent方法:获取组件会优先子类对象,而不是父类对象
Class ATest{
}
Class BTest:ATest{
}
Class C: MonoBehaviour {
private ATest aTest;
void Start () {
aTest = this.GetComponent<ATest>();
Debug.Log(aTest.GetType());//输出为BTest
}
}
(4)CanvasGroup组件的使用
alpha属性:UI是否可以显示
blocksRaycasts属性:控制UI上的按钮事件是否可以触发
六.源码链接
链接: https://pan.baidu.com/s/1slCxTBR 密码: bft9