UI框架——奇怪的大冒险

框架思路:

1.创建一个综合管理类(UIManager)来管理全部的界面操作 设置单例

2.创建一个基类UIBase(界面管理)来设置界面在显示与隐藏时候的状态

3.每一个界面单独的脚本都继承于 界面管理类(UIBase)

4.有一个脚本 用来控制开始时显示的界面

综合管理类(UIManager)

1.需要设置一个单例 使本脚本中的方法可以被其他脚本调用

2.创建  一个用来存放游戏界面预设体的字典 、一个存放所有界面脚本的字典、 一个存放界面的栈

预设体的字典  Dictionary UIobjDict = new Dictionary();

脚本的字典  Dictionary currentUIDict = new Dictionary();

界面显示的栈:StackUIStack = new Stack();

3.创建一个方法给预设体的字典加载预设体。

    并且在脚本开始运行时就进行全部加载,所以需要在Awake()中调用加载的方法

    这里需要提及的是:被加载的东西必须存放在 Resources 文件夹中才能会获取到,方法:Resources.Load<类型>(路径);

public void AddUIperfabByName(string UIName)

{

if (UIobjDict.ContainsKey(UIName)){

return;  //判断是否已经存在相同的预设体

}

GameObject UIobj = Resources.Load("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框架——奇怪的大冒险)