为NGUI panel 添加 sorting layer

来源:互联网 发布:qq群推广淘宝店 编辑:程序博客网 时间:2024/05/21 11:23

接着上一篇文章的问题,看到了老外做的一个补丁,为ngui panel添加sorting layer,我也照着做了一个,这样ngui和unity2d就可以完全融合在一起了,层次关系可以任意设置。

ngui的版本为3.6.8,在其中添加代码:

文件:UIDrawCall.cs  109行左右

/// <summary>/// Renderer's sorting order, to be used with Unity's 2D system./// </summary>public int sortingOrder{get { return (mRenderer != null) ? mRenderer.sortingOrder : 0; }set { if (mRenderer != null && mRenderer.sortingOrder != value) mRenderer.sortingOrder = value; }}// added by Clarkpublic string sortingLayerName{get { return (mRenderer != null) ? mRenderer.sortingLayerName : "default"; }set{if(mRenderer != null && mRenderer.sortingLayerName != value){mRenderer.sortingLayerName = value;#if UNITY_EDITORUnityEditor.EditorUtility.SetDirty(gameObject);#endif}}}// added end by Clark

712行左右

/// <summary>/// Create a new draw call, reusing an old one if possible./// </summary>static UIDrawCall Create (string name, UIPanel pan, Material mat, Texture tex, Shader shader){UIDrawCall dc = Create(name);dc.gameObject.layer = pan.cachedGameObject.layer;dc.baseMaterial = mat;dc.mainTexture = tex;dc.shader = shader;dc.renderQueue = pan.startingRenderQueue;dc.sortingOrder = pan.sortingOrder;// added by Clarkdc.sortingLayerName = pan.sortingLayerName;// added end by Clarkdc.manager = pan;return dc;}

文件UIPanel.cs 130行左右

// Clipping rectangle[HideInInspector][SerializeField] UIDrawCall.Clipping mClipping = UIDrawCall.Clipping.None;[HideInInspector][SerializeField] Vector4 mClipRange = new Vector4(0f, 0f, 300f, 200f);[HideInInspector][SerializeField] Vector2 mClipSoftness = new Vector2(4f, 4f);[HideInInspector][SerializeField] int mDepth = 0;[HideInInspector][SerializeField] int mSortingOrder = 0;// added by Clark[HideInInspector][SerializeField] string mSortingLayerName;// added end by Clark
252行左右

public int sortingOrder{get{return mSortingOrder;}set{if (mSortingOrder != value){mSortingOrder = value;#if UNITY_EDITORNGUITools.SetDirty(this);#endifUpdateDrawCalls();}}}// added by Clarkpublic string sortingLayerName{get { return mSortingLayerName; }set{if(mSortingLayerName != value){mSortingLayerName = value;#if UNITY_EDITORNGUITools.SetDirty(this);#endifUpdateDrawCalls();}}}// added end by Clark

1432行左右,在函数UpdateDrawCalls里面

for (int i = 0; i < drawCalls.Count; ++i){UIDrawCall dc = drawCalls[i];Transform t = dc.cachedTransform;t.position = pos;t.rotation = rot;t.localScale = scale;dc.renderQueue = (renderQueue == RenderQueue.Explicit) ? startingRenderQueue : startingRenderQueue + i;dc.alwaysOnScreen = alwaysOnScreen &&(mClipping == UIDrawCall.Clipping.None || mClipping == UIDrawCall.Clipping.ConstrainButDontClip);dc.sortingOrder = mSortingOrder;// added by Clarkdc.sortingLayerName = mSortingLayerName;// added end by Clark}

文件UIPanelInspector.cs 9行

using UnityEngine;using UnityEditor;using System.Collections.Generic;// added by Clarkusing System;using System.Reflection;using UnityEditorInternal;// added end by Clark

39行左右

UIWidget.Pivot mDragPivot = UIWidget.Pivot.Center;GUIStyle mStyle0 = null;GUIStyle mStyle1 = null;// added by Clarkstring[] sortingLayerNames;// added end by Clark
49行左右

protected override void OnEnable (){base.OnEnable();mPanel = target as UIPanel;// added by ClarksortingLayerNames = GetSortingLayerNames();// added end by Clark}
574行左右

GUI.changed = false;int so = EditorGUILayout.IntField("Sort Order", mPanel.sortingOrder, GUILayout.Width(120f));if (GUI.changed) mPanel.sortingOrder = so;// added by Clarkint sortingLayerIndex = GetSortingLayerIndex(mPanel.sortingLayerName);int newSortingLayerIndex = EditorGUILayout.Popup("Sorting Layer", sortingLayerIndex, sortingLayerNames);if(sortingLayerIndex != newSortingLayerIndex){mPanel.sortingLayerName = sortingLayerNames[newSortingLayerIndex];}// added end by Clark
785行左右,在文件最后

// added by Clarkstring[] GetSortingLayerNames() {Type t = typeof(InternalEditorUtility);PropertyInfo prop = t.GetProperty("sortingLayerNames", BindingFlags.Static | BindingFlags.NonPublic);return (string[])prop.GetValue(null, null);}int GetSortingLayerIndex(string layerName){for(int i = 0; i < sortingLayerNames.Length; i++){if(sortingLayerNames[i] == layerName){return i;}}return 0;}// added end by Clark}

这样,在UIPanel里面就多一个选项sorting layer:




完整的修改好的文件我放到我的资源里面了。




0 0
原创粉丝点击