管理NGUI中的窗口depth(含DEMO)

本文基于NGUI3.7.2。

1、前言

        用NGUI做UI都知道,UI组件是通过depth来决定其显示顺序的。depth大的Panel会显示在屏幕离玩家更近的位置。同个panel中,不同组件也是通过depth来决定其显示顺序的。

        这样确实很方便,我只要设置Panel的depth,就能让他显示在其它Panel的上面。但是遇到一些需要动态窗口的Panel。这个Panel可能不是固定的。

        比如你先打开一个玩家面板,再打开一个背包面板。但是有可能你是先打开背包面板,再打开玩家面板。因此你无法在制作背包、玩家这两个面板的时候知道他们的之间Panel的顺序。

2、大致做法

        其实实现方法很简单,只要依次执行2个步骤:

        1、在制作每个独立窗口的时候,让每个窗口最底层的Panel的depth为0.这个窗口中其它层根据显示顺序依次增加depth即可。(只要你单独运行这个窗口里面显示正常,即可认为第一步已经完成)

        2、使用本文提供的脚本来创建窗口(当然你也可以自己编写类似的代码)。

3、先睹为快

        先看一下DEMO的结构。

        1

        NGUI :即我们这个例子依赖的NGUI。为2.7.3版本。

        Resources:是我们测试用的一些窗口。

        Scene:里面有个测试场景。

        Script:我们这个测试的代码。

        我们运行下Demo看看效果。

        1

        2

        3

        点击中间的按钮会依次打开窗口。

        我们可以看到Resources中 每个窗口预设的Panel的depth都是1.但是打开后自动进行了计算。比如W2比W1慢打开,因此depth自动进行了偏移。如下:

        1

        2

        OK。那我们看怎么实现的。

4、怎么调用来创建窗口

        我们先来看看我们的测试场景中的按钮上面的代码TestOpenWindow.cs。这个仅仅为测试代码,大家项目中不会用到这个类。这里大致说说。

        这个代码主要是每次点击中间的按钮就加载Resources中的窗口或新创建窗口(前5个为加载,后面打开的都是临时创建的窗口[即不存在预设中的])。

        下面是测试代码,上面说了,这个测试代码仅为了演示如何使用,因此大家可以不详细看。

        这里只要知道:WindowManager中有:

        public static GameObject OpenWindow(GameObject parent, string windowName)

        public static T CreateEmptyWindow<T>(GameObject parent, string windowName) where T : Component

        这两个方法是用来打开窗口和创建新窗口的即可。当然里面还有其它方法。比如:

        public static T OpenWindowAndGetComponent<T>(GameObject parent, string windowName) where T : Component

        是用于打开的时候顺便获取该窗口根节点上面的组件。

        我们接下来重点看WindowManager中的代码。因为其实管理Panel深度的就这个类。

5、核心代码WindowManager

        没错,这时候才是核心代码。前面主要是演示效果和调用。如果你不想知道原理,也可以跳过这一步。反正你只要把WindowManager.cs这个类拖到你的项目里面。然后像步骤4那样调用就可以了。也就1行代码。

        我们看下OpenWindow方法中前半段代码。

        这里面其实主要就是到Resources的Windows目录中去加载窗口预设。然后实例化完添加到Dictionary里面缓存起来而已。如果下次调用发现缓存有这个对象,那么就直接返回获取这个对象。

        接下来看看SetWindowDepth方法。

        这个方法就是获取当前场景中最大的depth,然后把新增的窗口里面所有的Panel的depth都加上这个值。那这样新窗口自然会在最上面。

        OK。这样大家就知道以后怎么让窗口根据打开顺序显示到最上面了吧。
如果对上面代码还有不熟悉的,可以回复交流。

        下载地址:http://pan.baidu.com/s/1sjvDoqp

发表评论

电子邮件地址不会被公开。 必填项已用*标注