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

  1. /// <summary>
  2. /// Renderer's sorting order, to be used with Unity's 2D system.
  3. /// </summary>
  4. public int sortingOrder
  5. {
  6. get { return (mRenderer != null) ? mRenderer.sortingOrder : 0; }
  7. set { if (mRenderer != null && mRenderer.sortingOrder != value) mRenderer.sortingOrder = value; }
  8. }
  9. // added by Clark
  10. public string sortingLayerName
  11. {
  12. get { return (mRenderer != null) ? mRenderer.sortingLayerName : "default"; }
  13. set
  14. {
  15. if(mRenderer != null && mRenderer.sortingLayerName != value)
  16. {
  17. mRenderer.sortingLayerName = value;
  18. if UNITY_EDITOR
  19. UnityEditor.EditorUtility.SetDirty(gameObject);
  20. endif
  21. }
  22. }
  23. }
  24. // added end by Clark

712行左右

[csharp] view
plain
 copy

  1. /// <summary>
  2. /// Create a new draw call, reusing an old one if possible.
  3. /// </summary>
  4. static UIDrawCall Create (string name, UIPanel pan, Material mat, Texture tex, Shader shader)
  5. {
  6. UIDrawCall dc = Create(name);
  7. dc.gameObject.layer = pan.cachedGameObject.layer;
  8. dc.baseMaterial = mat;
  9. dc.mainTexture = tex;
  10. dc.shader = shader;
  11. dc.renderQueue = pan.startingRenderQueue;
  12. dc.sortingOrder = pan.sortingOrder;
  13. // added by Clark
  14. dc.sortingLayerName = pan.sortingLayerName;
  15. // added end by Clark
  16. dc.manager = pan;
  17. return dc;
  18. }

文件UIPanel.cs 130行左右

[csharp] view
plain
 copy

  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

  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. // added by Clark
  20. public string sortingLayerName
  21. {
  22. get { return mSortingLayerName; }
  23. set
  24. {
  25. if(mSortingLayerName != value)
  26. {
  27. mSortingLayerName = value;
  28. if UNITY_EDITOR
  29. NGUITools.SetDirty(this);
  30. endif
  31. UpdateDrawCalls();
  32. }
  33. }
  34. }
  35. // added end by Clark

1432行左右,在函数UpdateDrawCalls里面

[csharp] view
plain
 copy

  1. for (int i = 0; i < drawCalls.Count; ++i)
  2. {
  3. UIDrawCall dc = drawCalls[i];
  4. Transform t = dc.cachedTransform;
  5. t.position = pos;
  6. t.rotation = rot;
  7. t.localScale = scale;
  8. dc.renderQueue = (renderQueue == RenderQueue.Explicit) ? startingRenderQueue : startingRenderQueue + i;
  9. dc.alwaysOnScreen = alwaysOnScreen &&
  10. (mClipping == UIDrawCall.Clipping.None || mClipping == UIDrawCall.Clipping.ConstrainButDontClip);
  11. dc.sortingOrder = mSortingOrder;
  12. // added by Clark
  13. dc.sortingLayerName = mSortingLayerName;
  14. // added end by Clark
  15. }

文件UIPanelInspector.cs 9行

[csharp] view
plain
 copy

  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

  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

  1. protected override void OnEnable ()
  2. {
  3. base.OnEnable();
  4. mPanel = target as UIPanel;
  5. // added by Clark
  6. sortingLayerNames = GetSortingLayerNames();
  7. // added end by Clark
  8. }

574行左右

[csharp] view
plain
 copy

  1. GUI.changed = false;
  2. int so = EditorGUILayout.IntField("Sort Order", mPanel.sortingOrder, GUILayout.Width(120f));
  3. if (GUI.changed) mPanel.sortingOrder = so;
  4. // added by Clark
  5. int sortingLayerIndex = GetSortingLayerIndex(mPanel.sortingLayerName);
  6. int newSortingLayerIndex = EditorGUILayout.Popup("Sorting Layer", sortingLayerIndex, sortingLayerNames);
  7. if(sortingLayerIndex != newSortingLayerIndex)
  8. {
  9. mPanel.sortingLayerName = sortingLayerNames[newSortingLayerIndex];
  10. }
  11. // added end by Clark

785行左右,在文件最后

[csharp] view
plain
 copy

  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(null, null);
  7. }
  8. int GetSortingLayerIndex(string layerName)
  9. {
  10. for(int i = 0; i < sortingLayerNames.Length; i++)
  11. {
  12. if(sortingLayerNames[i] == layerName)
  13. {
  14. return i;
  15. }
  16. }
  17. return 0;
  18. }
  19. // added end by Clark

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

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

混用ngui和ugui渲染顺序问题的更多相关文章

  1. Unity NGUI和UGUI与模型、特效的层级关系

    目录 1.介绍两大UI插件NGUI和UGUI 2.unity渲染顺序控制方式 3.NGUI的控制 4.UGUI的控制 5.模型深度的控制 6.粒子特效深度控制 7.NGUI与模型和粒子特效穿插层级管理 ...

  2. KING_Unity学习之UGUI_Canvas渲染顺序以及层次关系总结

    http://blog.csdn.net/kingsea168/article/details/50252733 之前一直用NGUI开发界面,但看到现在的unity的新版本的UGUI也不错,这几天专门 ...

  3. Unity3D NGUI,uGUI总结

    跪求官方UI系统(2014年11月底已出,用原生的比用NGUI放心) uGUI注意点 1.要防止多个canvas叠加点击穿透,canvas里面的graphics raycaster调整到恰当选项 2. ...

  4. [UGUI]渲染层级关系

    参考链接: http://blog.csdn.net/meegomeego/article/details/42060389 Unity中的渲染顺序自上而下大致可以分为三层: 1.Camera层.可以 ...

  5. SKNode的渲染顺序

    [SKNode的渲染顺序] SKNode的zPosition属性,指定相对于其父视图的z轴坐标. The default value is 0.0. The positive z axis is pr ...

  6. 【Unity笔记】UGUI物体的渲染顺序

    ①不同Camera的Depth.(大在前,小在后)②同Camera的SortingLayer.(下在前,上在后)③同SortingLayer下的Order in Layer.(大在前,小在后)④同Or ...

  7. SVG渲染顺序及z轴显示问题(zIndex)

    SVG是严格按照定义元素的顺序来渲染的,这个与HTML靠z-index值来控制分层不一样. 在SVG中,写在前面的元素先被渲染,写在后面的元素后被渲染.后渲染的元素会覆盖前面的元素,虽然有时候受透明度 ...

  8. 关于Unity中的NGUI和UGUI

    一.用Unity开发2D游戏,有三套关系 1.GUI:Unity本身自带的GUI 2.NGUI:以前在Unity中广泛来做2D的,是第三方的包,需要安装 3.UGUI:Unity5.X后(其实是Uni ...

  9. NGUI和UGUI动画不能设置alpha值的问题

    动画播放alpha参数改变但无实际画面效果,原因是要挂一个脚本,设置实时更新数据. NGUI void Update() { widget.SetDirty(); } UGUI void Update ...

随机推荐

  1. apktool + eclipse 动态调试APK

    用了会AndBug,尽管挺强大的可是作为习惯了OD.EDB作为动态调试工具的人,自然有些不习惯,于是乎寻求新的动态调试解决方式.但大多数都是NetBeans + apktool.想着还得多下一个IDE ...

  2. 【BZOJ2625】[Neerc2009]Inspection 最小流

    [BZOJ2625][Neerc2009]Inspection Description You are in charge of a team that inspects a new ski reso ...

  3. 操作系统 资源管理 zookeeper yarn 进程管理 分布式 yarn诞生背景

    zookeeper 信息保管员 YARN 简介 https://www.ibm.com/developerworks/cn/data/library/bd-yarn-intro/index.html

  4. [P2769] 猴子上树

    题目描述 在猴村有一条笔直的山路,这条山路很窄,宽度忽略不计.有 n只猴子正站在山路上静静地观望今天来参加比赛的各位同学.用一个正整数Xi表示第i只猴子所站位置,任意两只猴子的所站位置互不相同.在这条 ...

  5. emoji字符不能插入MySQL数据库,提示“'\xF0\x9F\x98\x84' for column 'XXXX' at row 1”

    从网络中取下的数据解析后不能插入数据库,提示某个字段有问题,问题提示如下: SQLException: Incorrect string value: '\xF0\x9F\x98\x84' for c ...

  6. smod包含具体的增强(具体实施对象) / CMOD 包含一组smod编写的增强

    从标题来看,CMOD 是树木,smod 是树枝. 1.1 SMOD包含具体的增强,而CMOD是包含一组SMOD编写的增强. 1.2 User exits (Function module exits) ...

  7. Java+Jsoup实现网页内容抓取

    不知不觉毕业快一年了,工作逐渐趋于平淡,从一个对编程了解得很少甚至完全一窍不通的小小菜,终于成为了一枚小菜,总而言之,算是入了IT这一行.这大半年马马虎虎做了三个项目,有安卓项目,有Java Web项 ...

  8. dokcer3

    安装好的文件位置: /usr/sbin/nginx:主程序 /etc/nginx:存放配置文件 /usr/share/nginx:存放静态文件 /var/log/nginx:存放日志 其实从上面的根目 ...

  9. SYN FLOOD学习理解

    SYN FLOOD是一种比较常见的DoS攻击手段,它的特点就是防不胜防.SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源.SYN攻击除了能影响主机外 ...

  10. finalize方法

    什么是垃圾回收机制 不定时去堆内存中清理不可达对象.不可达的对象并不会马上就会直接回收, 垃圾收集器在一个Java程序中的执行是自动的,不能强制执行,即使程序员能明确地判断出有一块内存已经无用了,是应 ...