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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NGUI(Newton Game Dynamics Integration)和UGUI(Unity UI)是Unity引擎中两种不同的UI系统。它们的主要区别在于设计目的、灵活性和更新时间线上。 1. **NGUI**:最初由Tasharen Entertainment开发,专注于游戏内交互界面,尤其是在2D游戏中表现优秀。它提供了一个简单直观的拖拽式UI编辑器,支持丰富的事件处理和组件系统。NGUI在Unity 5之前是一个独立的包,但现在已经整合到Unity的标准库中,作为Legacy UI的一部分。 2. **UGUI**:是Unity从Unity 5开始引入的新一代UI系统,是为2D和3D游戏设计的现代UI解决方案。它采用数据驱动的属性系统,提供了更高级的组件和布局选项,以及响应式设计,支持自适应布局。UGUI更加灵活,可以无缝集成到项目中,并且更容易进行性能优化。 **主要区别:** - **技术栈**:NGUI使用的是脚本组件系统,而UGUI是基于数据驱动的,支持更现代化的编程模型。 - **组件和事件**:UGUI提供了更多的组件类型和内置事件系统,使得设计更复杂交互界面更方便。 - **性能**:随着技术的发展,UGUI通常被认为在性能上优于NGUI,尤其是在大型场景和复杂交互时。 - **学习曲线**:对于新手来说,UGUI可能学习起来更快,因为它有直观的可视化编辑工具。 **相关问题**: 1. NGUI适合哪种类型的项目? 2. UGUI的响应式设计是如何工作的? 3. 如何在Unity项目中切换NGUI和UGUI

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值