微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NGUI的UIPanel的Depth改良:二级排序

用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.cs

static 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.cs

protector 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一直往上加,而不会出现跨层的问题

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐