本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!