用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] 举报,一经查实,本站将立刻删除。