混用ngui和ugui渲染顺序问题

http://blog.csdn.net/xtxy/article/details/38332801

为NGUI panel 添加 sorting layer

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

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

文件:UIDrawCall.cs  109行左右

[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /// <summary>  
  2. /// Renderer's sorting order, to be used with Unity's 2D system.  
  3. /// </summary>  
  4.   
  5. public int sortingOrder  
  6. {  
  7.     get { return (mRenderer != null) ? mRenderer.sortingOrder : 0; }  
  8.     set { if (mRenderer != null && mRenderer.sortingOrder != value) mRenderer.sortingOrder = value; }  
  9. }  
  10.   
  11. // added by Clark  
  12. public string sortingLayerName  
  13. {  
  14.     get { return (mRenderer != null) ? mRenderer.sortingLayerName : "default"; }  
  15.     set  
  16.     {  
  17.         if(mRenderer != null && mRenderer.sortingLayerName != value)  
  18.         {  
  19.             mRenderer.sortingLayerName = value;  
  20. if UNITY_EDITOR  
  21.             UnityEditor.EditorUtility.SetDirty(gameObject);  
  22. endif  
  23.         }  
  24.     }  
  25. }  
  26. // added end by Clark  

712行左右

[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /// <summary>  
  2. /// Create a new draw call, reusing an old one if possible.  
  3. /// </summary>  
  4.   
  5. static UIDrawCall Create (string name, UIPanel pan, Material mat, Texture tex, Shader shader)  
  6. {  
  7.     UIDrawCall dc = Create(name);  
  8.     dc.gameObject.layer = pan.cachedGameObject.layer;  
  9.     dc.baseMaterial = mat;  
  10.     dc.mainTexture = tex;  
  11.     dc.shader = shader;  
  12.     dc.renderQueue = pan.startingRenderQueue;  
  13.     dc.sortingOrder = pan.sortingOrder;  
  14.     // added by Clark  
  15.     dc.sortingLayerName = pan.sortingLayerName;  
  16.     // added end by Clark  
  17.     dc.manager = pan;  
  18.     return dc;  
  19. }  

文件UIPanel.cs 130行左右

[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. // Clipping rectangle  
  2. [HideInInspector][SerializeField] UIDrawCall.Clipping mClipping = UIDrawCall.Clipping.None;  
  3. [HideInInspector][SerializeField] Vector4 mClipRange = new Vector4(0f, 0f, 300f, 200f);  
  4. [HideInInspector][SerializeField] Vector2 mClipSoftness = new Vector2(4f, 4f);  
  5. [HideInInspector][SerializeField] int mDepth = 0;  
  6. [HideInInspector][SerializeField] int mSortingOrder = 0;  
  7. // added by Clark  
  8. [HideInInspector][SerializeField] string mSortingLayerName;  
  9. // added end by Clark  
252行左右

[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public int sortingOrder  
  2. {  
  3.     get  
  4.     {  
  5.         return mSortingOrder;  
  6.     }  
  7.     set  
  8.     {  
  9.         if (mSortingOrder != value)  
  10.         {  
  11.             mSortingOrder = value;  
  12. if UNITY_EDITOR  
  13.             NGUITools.SetDirty(this);  
  14. endif  
  15.             UpdateDrawCalls();  
  16.         }  
  17.     }  
  18. }  
  19.   
  20. // added by Clark  
  21. public string sortingLayerName  
  22. {  
  23.     get { return mSortingLayerName; }  
  24.     set  
  25.     {  
  26.         if(mSortingLayerName != value)  
  27.         {  
  28.             mSortingLayerName = value;  
  29. if UNITY_EDITOR  
  30.             NGUITools.SetDirty(this);  
  31. endif  
  32.             UpdateDrawCalls();  
  33.         }  
  34.     }  
  35. }  
  36. // added end by Clark  

1432行左右,在函数UpdateDrawCalls里面

[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. for (int i = 0; i < drawCalls.Count; ++i)  
  2. {  
  3.     UIDrawCall dc = drawCalls[i];  
  4.   
  5.     Transform t = dc.cachedTransform;  
  6.     t.position = pos;  
  7.     t.rotation = rot;  
  8.     t.localScale = scale;  
  9.   
  10.     dc.renderQueue = (renderQueue == RenderQueue.Explicit) ? startingRenderQueue : startingRenderQueue + i;  
  11.     dc.alwaysOnScreen = alwaysOnScreen &&  
  12.         (mClipping == UIDrawCall.Clipping.None || mClipping == UIDrawCall.Clipping.ConstrainButDontClip);  
  13.     dc.sortingOrder = mSortingOrder;  
  14.     // added by Clark  
  15.     dc.sortingLayerName = mSortingLayerName;  
  16.     // added end by Clark  
  17. }  

文件UIPanelInspector.cs 9行

[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. using UnityEngine;  
  2. using UnityEditor;  
  3. using System.Collections.Generic;  
  4. // added by Clark  
  5. using System;  
  6. using System.Reflection;  
  7. using UnityEditorInternal;  
  8. // added end by Clark  

39行左右

[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. UIWidget.Pivot mDragPivot = UIWidget.Pivot.Center;  
  2. GUIStyle mStyle0 = null;  
  3. GUIStyle mStyle1 = null;  
  4. // added by Clark  
  5. string[] sortingLayerNames;  
  6. // added end by Clark  
49行左右

[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. protected override void OnEnable ()  
  2. {  
  3.     base.OnEnable();  
  4.     mPanel = target as UIPanel;  
  5.   
  6.     // added by Clark  
  7.     sortingLayerNames = GetSortingLayerNames();  
  8.     // added end by Clark  
  9. }  
574行左右

[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. GUI.changed = false;  
  2. int so = EditorGUILayout.IntField("Sort Order", mPanel.sortingOrder, GUILayout.Width(120f));  
  3. if (GUI.changed) mPanel.sortingOrder = so;  
  4.   
  5. // added by Clark  
  6. int sortingLayerIndex = GetSortingLayerIndex(mPanel.sortingLayerName);  
  7. int newSortingLayerIndex = EditorGUILayout.Popup("Sorting Layer", sortingLayerIndex, sortingLayerNames);  
  8. if(sortingLayerIndex != newSortingLayerIndex)  
  9. {  
  10.     mPanel.sortingLayerName = sortingLayerNames[newSortingLayerIndex];  
  11. }  
  12. // added end by Clark  
785行左右,在文件最后

[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. // added by Clark  
  2. string[] GetSortingLayerNames()   
  3. {  
  4.     Type t = typeof(InternalEditorUtility);  
  5.     PropertyInfo prop = t.GetProperty("sortingLayerNames", BindingFlags.Static | BindingFlags.NonPublic);  
  6.     return (string[])prop.GetValue(nullnull);  
  7. }  
  8.   
  9. int GetSortingLayerIndex(string layerName)  
  10. {  
  11.     for(int i = 0; i < sortingLayerNames.Length; i++)  
  12.     {  
  13.         if(sortingLayerNames[i] == layerName)  
  14.         {  
  15.             return i;  
  16.         }  
  17.     }  
  18.   
  19.     return 0;  
  20. }  
  21. // added end by Clark  

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




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

原文地址:https://www.cnblogs.com/nafio/p/9137348.html