UI框架——奇怪的大冒险

框架思路:

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335

推荐阅读更多精彩内容