框架思路:
1.创建一个综合管理类(UIManager)来管理全部的界面操作 设置单例
2.创建一个基类UIBase(界面管理)来设置界面在显示与隐藏时候的状态
3.每一个界面单独的脚本都继承于 界面管理类(UIBase)
4.有一个脚本 用来控制开始时显示的界面
综合管理类(UIManager)
1.需要设置一个单例 使本脚本中的方法可以被其他脚本调用
2.创建 一个用来存放游戏界面预设体的字典 、一个存放所有界面脚本的字典、 一个存放界面的栈
预设体的字典 Dictionary<string , Gamobject> UIobjDict = new Dictionary<string , GameObject>();
脚本的字典 Dictionary <string , UIBaes>currentUIDict = new Dictionary<string , UIBase>();
界面显示的栈:Stack<UIBase>UIStack = new Stack<UIBase>();
3.创建一个方法给预设体的字典加载预设体。
并且在脚本开始运行时就进行全部加载,所以需要在Awake()中调用加载的方法
这里需要提及的是:被加载的东西必须存放在 Resources 文件夹中才能会获取到,方法:Resources.Load<类型>(路径);
public void AddUIperfabByName(string UIName)
{
if (UIobjDict.ContainsKey(UIName)){
return; //判断是否已经存在相同的预设体
}
GameObject UIobj = Resources.Load<GameObject>("Perfab"+"/"+UIName);//放在Perfab文件夹下所以我们需要去找到他
if(UIobj!=null){ UIobjDict.Add(UIName, UIobj); }
}
4.通过预设体来实例化这个物体,并获取到这个物体上的UIBase(继承UIBase的脚本)脚本
我们需要通过对这个脚本的操作来操控游戏对象
public UIBase InstantiteUIByName(string UIName) //我们需要有返回UIBase所以我们给方法的返回值为UIBase
{
if (currentUIDict.ContainsKey(UIName)){
return currentUIDict[UIName]; //我们需要先进行判断 如果存在则可以直接返回
}
//不存在 我们将预设体进行实例化 并获取脚本
GameObject objPerfab = UIobjDict[UIName];//取出预设体
GameObject obj = GameObject.Instantiate(objPerfab);//根据预设体进行实例化
UIBase uibase = obj.GetComponent();
currentUIDict.Add(UIName, uibase);//保存游戏对象身上的UIBase的脚本进currentUIDict字典
obj.name = UIName;
return uibase;
}
5.根据 栈(后进先出) 的规律,我们来写使界面入栈(显示) 出栈(隐藏) 的方法
此方法中需要和UIBase中的代码进行交互,所以可先看下方关于UIBase的代码
因为是 栈 的特性,所以我们会用到关于 栈 的方法 :
Stack.Peek()获得栈顶的物体 Stack.Pop()获得栈顶的物体并删除 Stack.Push()将物体压入栈顶
入栈:
将已经在栈中的界面隐藏起来 以显示新入栈的界面
public void PushUserInterface(string UIName)
{
if (UIStack.Count>0){ //判断当前栈中是否有界面
UIBase oldUI = UIStack.Peek();
oldUI.UserInterfacePause(); //如果当前栈中有界面就要将他隐藏掉 调用UIBase中的隐藏方法
}
// 然后将新的界面压入栈顶并将它显示
UIBase newUI = InstantiteUIByName(UIName); //获取新的界面
UIStack.Push(newUI); //压入栈顶
newUI.UserInterfaceEnter(); //调用UIBase中的界面进入显示方法
}
出栈:
将当前显示的栈顶的界面退出,并显示下一张将出现在栈顶的界面
public void PopUserInterface()
{
UIBase oldUI = UIStack.Pop(); //获得并删除当前栈顶的界面
oldUI.UserInterfaceExit(); 调用UIBase中的方法使其退出
if (UIStack.Count>0){ //判断当前栈中是否还有界面
UIBase newUI = UIStack.Peek();
newUI.UserInterfaceResume(); //如果有则获得它并调取UIBase中的方法让他重新显示
}
}
界面管理基类(UIBase)
通过UIBase来综合的管理界面的 显示、隐藏 方法,使界面可以得到统一的妥当的处理
将其方法在适当的地方调用就可以操控物体的显示与隐藏
我们需要注意: 将方法写成 虚方法(Virtual) 因为这是一个基类需要被继承(Override)
继承它的脚本中需要 写入当前是否显示物体(gameObject.SetActive(false / true);)
如果调用的Canvas摄像机设置为相机渲染 那我们需要在Enter()方法中写入:
GetComponent().worldCamera = Camera.main; //将渲染摄像机设置为当前的主摄像机
public virtual void UserInterfaceEnter(){} //当界面第一次进入的时候调用
public virtual void UserInterfacePause(){} //当界面隐藏的时候调用
public virtual void UserInterfaceResume(){} //当界面重新显示时调用
public virtual void UserInterfaceExit(){} //当界面退出是调用
游戏控制脚本:
只需要写入一个开始时调用的界面就可以
UIManager.Instance.PushUserInterface("StartCanvas"); //表示显示StartCanvas这个界面
总结:
使用这种UI框架 可以更容易的理清 开发思路,使我们在开发的时候更有调理
当代码量多的时候也不容易错乱,容易维护与修改
即使所需要的UI界面很多 也可以统一的进行管理。
网友评论