Unity3D 游戏开发构架篇 —— UI堆栈

Unity3D的内置UI系统UnityGUI本身并不是那么尽如人意,因此很多UI插件位人们所青睐,比较有名的比如NGUI。当然最近的4.6 Beta版本的新UI系统听说很好,但是为了追求稳定性目前还没有进行相关学习。
本人比较崇尚原生的东西,UnityGUI又不是很尽如人意,相比之下,GUITexture就显的很不错了。
说了这么多,回归主题。

一、应用场景

最近项目需要设计一个运营的界面,这也是目前大多数手游的通用界面。这里放一张原始图,如下。

        

这张图片包括了很多UI元素,按照功能可以简单分类如下:
一、UI 与 UI交互(商城产生,充值界面产生等等)
二 、UI 与 后台交互(比如金币显示,体力显示等等)
上述的分类并不是很严谨,但是这并不是本文的重点。这么多UI界面的产生与消失伴随着一个个按钮的相应。
你可能会说,这有什么难的,点击一个按钮,产生一个界面不就完了,顶多内部多一点逻辑实现罢了。
那么我就用下图来描述一下你的逻辑

       
实现了上述的功能之后,我们现在再来一个例子,我这里产生的商城之后,是半透明的界面,商城的按钮不需要消失,可以被看见。你可能又要说了,那有什么,改一下就好了。
问题就在于改一下这里,你一个按钮改一下没问题,那么十个按钮呢,一百个按钮呢?你每个按钮都去改一下,看一看内部的代码吗?
当然这不算什么大问题,但是根据我这几天的心得我觉得最高设计一种管理机制来实现UI的产生和销毁。


二、设计思想

其实这套管理机制本身也是很粗糙的,是我这几天想出来的,本质就是UI堆栈管理。
简单地说,UI的产生和销毁本身可以分为如下几个现象:
一、UI产生一个新UI,自己消失不见。
二、UI产生一个新UI(比如子UI)
三、UI自己消失,返回刚才的UI(Return 键)
四、UI自己消失
产生和消失并不复杂,但是伴随着自身的行为就显的比较复杂了。在数据结构中用堆栈可以形容这种行为。
自己的产生一个新UI,自己消失不见可以理解为自己的进栈。
自己消失,产生一个新UI理解为刚才进栈的UI出栈。如下图所示:

       

      有了上述的理解,那么我们就可以设计一个基础类来管理这些UI的产生和销毁,同样的,如果有一些逻辑判断的话我们可以通过继承这个基础类的产生销毁方法,而不用自己实现了。


三、核心代码

UI_Normal.cs 

public class UI_Normal : ButtonNormal
{

    
    public GameObject Ready_Create_UI;

    public bool PauseSelf_Sign = false;
    public bool Return_Sign = false;
    public bool Recover_Sign = false;

    void Awake()
    {
        base.Awake();
    }
    void OnMouseDown()
    {
        base.OnMouseDown();
    }
    void OnMouseUpAsButton()
    {

        //print("you enter is " + transform.name);
        base.OnMouseUpAsButton();

        //单纯销毁
        if (Return_Sign)
        {
            Destroy(transform.root.gameObject);
            //销毁伴随出栈(恢复原来的UI)
            if (Recover_Sign){
                Globals.PopWindow();
            }
        }
        else
        {
            //单纯产生
            Instantiate(Ready_Create_UI);
            //产生伴随进栈(被新UI覆盖)
            if (PauseSelf_Sign) {
                Globals.PushWindow(transform.root.gameObject);
            }
        }
    }
}
Globals .cs

    public class Globals
    {
        public static GamePlayer Me;

        public static Stack stackWin = new Stack();
        public static void PushWindow(GameObject go)
        {
            PushWindow(go, false);
        }
        public static void PushWindow(GameObject go, bool s_Active) {
            stackWin.Push(go);
            go.SetActive(s_Active);
        }
        public static void PopWindow() {
            if (stackWin.Count > 0) {
                GameObject go = (GameObject)stackWin.Pop();
                go.SetActive(true);
            }
        }
    }
UI_Normal是核心控制,我们可以通过三个标志位来实现不同UI的产生销毁行为。

四、延伸

还是很初步的管理机制,有空可以进行加深研究。比方说产生子UI,自己的一部分消失,一部分不消失等等。呵呵。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值