NGUI的UIPanel的Depth改良:二级排序
发布日期:2021-06-30 19:40:29 浏览次数:2 分类:技术文章

本文共 2270 字,大约阅读时间需要 7 分钟。

用NGUI做界面的时候,当界面很多很多的时候,我们需要一套管理UI层的系统,所以界面预设实例化完之后,需要设置一下UIPanel的Depth,规则是什么呢?首先,可以先做一个归类,假设我们把所有的界面分成4个大层:BaseUI,EffectUI,WindowUI,TopUI。

假设我们使用Depth,可以定义好4个大层的Depth范围,比如:

BaseUI:0~10000

EffectUI:10001~20000

WindowUI:20001~30000

TopUI:30001~40000

假设我们示例化完一个界面预设,它是在BaseUI层的,那么我们可能设置它的Depth为8,然后又有一个BaseUI层的界面要显示,如果我们用累加的形式,那么它的Depth是9,这样不断下去,那么有可能BaseUI的界面的Depth会跨入到EffectUI层中。

如果有二级排序就可以解决了,比如在Depth的基础上,有一个LayerOfUI作为二级排序。

接下来,我们就来改造UIPanel,首先,UIPanel类中新增一个mLayerOfUI变量和一个layerOfUI属性

//UIPanel.cs[HideInInspector][SerializeField] int mLayerOfUI = 0;public int layerOfUI{    get { return mLayerOfUI; }    set     {        if(value != mLayerOfUI)        {            mLayerOfUI = value;#if UNITY_EDITOR            NGUITools.SetDirty(this);#endif            list.Sort(CompairFunc);        }    }}

然后再改一下UIPanel类的CompareFunc接口

//UIPanel.csstatic public int CompaireFunc(UIPanel a, UIPanel b){    if(a != b && a != null && b != null)    {        if(a.mLayerOfUI < b.mLayerOfUI) return -1;        if(a.mLayerOfUI > b.mLayerOfUI) return 1;                if(a.mDepth < b.mDepth) return -1;        if(a.mDepth > b.mDepth) return 1;        return (a.GetInstanceID() < b.GetInstanceID())? -1:1;    }    return 0;}

好了,接下来,为了方便在Inspector中设置,我们再改下UIPanelInspector

在ShouldDrawPropertises函数中添加LayerOfUI的编辑UI绘制

//UIPanelInspector.csprotector override bool ShouldDrawProperties(){    ...    GUILayout.BeginHorizontal();    {        EditorGUILayout.PrefixLabel("LayerOfUI");        var layerOfUI = mPanel.layerOfUI;        if(GUILayout.Button("Back",GUILayout.Width(60f)))            --layerOfUI;        layerOfUI = EditorGUILayout.IntField(layerOfUI, GUILayout.MinWidth(20f));        if(GUILayout.Button("Forward",GUILayout.Width(60f)))            ++layerOfUI;        if(mPanel.layerOfUI != layerOfUI)        {            NGUIEditorTools.RegisterUndo("UILayer",mPanel);            mPanel.layerOfUI = layerOfUI;                        if(UIPanelTool.instance != null)                UIPanelTool.instance.Repaint();                        if(UIDrawCallViewer.instance != null)                UIDrawCallViewer.instance.Repaint();        }    }    GUILayout.EndHorizontal();    ...}

效果如下

这样,我们就可以设计Depth了

BaseUI:0

EffectUI:10001

WindowUI:20001

TopUI:30001

他们的LayerOfUI可以从0一直往上加,而不会出现跨层的问题

转载地址:https://linxinfa.blog.csdn.net/article/details/86666688 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:NGUI配合shader,把精灵图片置灰
下一篇:Unity检测图集是否是正方形并且检测它的压缩格式是否是PVRTC

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月29日 17时42分29秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章