• 混用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:




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

  • 相关阅读:
    OO第三次阶段性总结
    OO第二次阶段性总结
    OO第一次阶段性总结
    【软工】提问回顾与个人总结
    【软工】结对编程作业
    【软工】第一次阅读作业
    【软工】第0次个人作业
    oo作业总结(四)
    OO作业总结(三)
    oo作业总结(二)
  • 原文地址:https://www.cnblogs.com/nafio/p/9137348.html
Copyright © 2020-2023  润新知