UI特效层级管理

在UI界面使用一些特效例如宝箱打开的特效,但是2D特效直接在使用上就可以实现层级管理,但有些效果2D达不到的。
之前项目中管理特效的方法是,把这个特效RenderQueue值改为3500,也不太懂为什么,问别的同事说是UIPanel管理有,在Debug状态下看到
红框里是3000的值。这个方法实现了效果,缺点是有多个panel的时候数值需要改到5000,当然但出现多个界面同时存在的时候问题就更大了。数值不知道填什么。
写了 UiFxSort.cs
   
   
  1. using System;
  2. using UnityEngine;
  3. using System.Collections;
  4. public class UiFxSort : MonoBehaviour
  5. {
  6. internal UIPanel UiPanel;
  7. public UIWidget UiWidgetInfrontOfMe;
  8. public bool AddQueue = true;
  9. private Renderer[] _renderers;
  10. private void Awake()
  11. {
  12. _renderers = this.GetComponentsInChildren<Renderer>(true);
  13. }
  14. public void InitPanel(UIPanel p)
  15. {
  16. UiPanel = p;
  17. }
  18. private void Start()
  19. {
  20. UiPanel = NGUITools.FindInParents<UIPanel>(gameObject);
  21. UiPanel.AddUiSort(this);
  22. }
  23. public void UpdateSortUi()
  24. {
  25. if (UiWidgetInfrontOfMe != null && UiWidgetInfrontOfMe.drawCall != null)
  26. {
  27. int rq = UiWidgetInfrontOfMe.drawCall.renderQueue + 1;
  28. if (!AddQueue) rq -= 2;
  29. for (int i = 0; i < _renderers.Length; i++)
  30. {
  31. Renderer _renderer = _renderers[i];
  32. if(_renderer==null) return;
  33. if(_renderer.materials ==null) return;
  34. if(_renderer.materials.Length==0) return;
  35. foreach (Material mat in _renderer.materials)
  36. {
  37. if (mat.renderQueue != rq)
  38. {
  39. mat.renderQueue = rq;
  40. }
  41. }
  42. }
  43. }
  44. }
  45. private void OnDestory()
  46. {
  47. if (UiPanel != null) UiPanel.RemoveUiSort(this);
  48. }
  49. }
同时修改了NGUI的UIPanel的LateUpdate方法,添加个新方法
    
    
  1. void LateUpdate ()
  2. {
  3. #if UNITY_EDITOR
  4. if (mUpdateFrame != Time.frameCount || !Application.isPlaying)
  5. #else
  6. if (mUpdateFrame != Time.frameCount)
  7. #endif
  8. {
  9. mUpdateFrame = Time.frameCount;
  10. // Update each panel in order
  11. for (int i = 0, imax = list.Count; i < imax; ++i)
  12. list[i].UpdateSelf();
  13. int rq = 3000;
  14. // Update all draw calls, making them draw in the right order
  15. for (int i = 0, imax = list.Count; i < imax; ++i)
  16. {
  17. UIPanel p = list[i];
  18. if (p.renderQueue == RenderQueue.Automatic)
  19. {
  20. p.startingRenderQueue = rq;
  21. p.UpdateDrawCalls();
  22. //rq += p.drawCalls.Count;
  23. //用于粒子混排
  24. rq += p.drawCalls.Count*2;
  25. }
  26. else if (p.renderQueue == RenderQueue.StartAt)
  27. {
  28. p.UpdateDrawCalls();
  29. if (p.drawCalls.Count != 0)
  30. {
  31. //rq = Mathf.Max(rq, p.startingRenderQueue + p.drawCalls.Count);
  32. //用于粒子混排
  33. rq = Mathf.Max(rq, p.startingRenderQueue + p.drawCalls.Count*2);
  34. }
  35. }
  36. else // Explicit
  37. {
  38. p.UpdateDrawCalls();
  39. if (p.drawCalls.Count != 0)
  40. {
  41. //rq = Mathf.Max(rq, p.startingRenderQueue + 1);
  42. //用于粒子混排
  43. rq = Mathf.Max(rq, p.startingRenderQueue + 2);
  44. }
  45. }
  46. p.UpdateUiSort();
  47. }
  48. }
  49. }
  50. //用于粒子混排
  51. List<UiFxSort> container = new List<UiFxSort>();
  52. public void AddUiSort(UiFxSort uiSort)
  53. {
  54. if (container.Contains(uiSort))
  55. {
  56. return;
  57. }
  58. container.Add(uiSort);
  59. }
  60. public void RemoveUiSort(UiFxSort uisSort)
  61. {
  62. container.Remove(uisSort);
  63. }
  64. public void UpdateUiSort()
  65. {
  66. for (int i = 0; i < container.Count; i++)
  67. {
  68. container[i].UpdateSortUi();
  69. }
  70. }
在特效上挂上这个脚本,指点下在界面widget 之前就能解决问题了。
注:局限性这个方法不能解决UIScrollView上特效穿投,特别在超出显示区域的问题。
预告下期内容如何在UI3D特效动态加载。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值