美文网首页
UI框架——奇怪的大冒险

UI框架——奇怪的大冒险

作者: 你这样我很吃惊 | 来源:发表于2017-09-29 21:20 被阅读0次

    框架思路:

    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界面很多 也可以统一的进行管理。

    相关文章

      网友评论

          本文标题:UI框架——奇怪的大冒险

          本文链接:https://www.haomeiwen.com/subject/hlhvextx.html