using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; using System.Collections; using System.Collections.Generic; public class WindowSign : MonoBehaviour { private List m_UIParticles = new List(); private int m_uiType = 0; private Canvas m_Canvas = null; private GraphicRaycaster m_Raycaster = null; private bool m_Dirty = false; public bool _IsNeedAddCanvas = false; public int UIType = 0; private void Awake() { if(m_uiType == 0 && _IsNeedAddCanvas) m_uiType = UIType; } //Window的层级计算公式 public int SortingOrder { get { int siblingIndex = transform.GetSiblingIndex(); return m_uiType * 10000 + siblingIndex; } } private bool ObjectValit(Component component) { return component != null && component.gameObject != null && component.gameObject.activeInHierarchy; } public bool UIParticlesEnable() { for(int i=0;i< m_UIParticles.Count;i++) { if (ObjectValit(m_UIParticles[i])) return true; } return false; } //窗口中是否有特效 public bool IsUIParticleIn { get { return UIParticlesEnable() || _IsNeedAddCanvas; } } public void Init(int UIType) { m_uiType = UIType; SetWndDirty(); } void OnEnable() { if (m_uiType >= 0) SetWndDirty(); } void Update() { if(m_Dirty) { FreshWnd(); m_Dirty = false; } } //重新检查窗口下的特效,并进行Canvas排序 private void FreshWnd() { if (mStatic_WindowSigns.Contains(this) == false) { mStatic_WindowSigns.Add(this); } m_UIParticles.Clear(); UIParticleSystem[] childs = gameObject.GetComponentsInChildren(true); m_UIParticles.AddRange(childs); if (m_uiType >= 0) Static_ReSortWindow(); } //设置Window需要重新刷新 public void SetWndDirty() { m_Dirty = true; } void OnDisable() { mStatic_WindowSigns.Remove(this); if (m_uiType >= 0) Static_ReSortWindow(); } public void SortSelfCavas(int order,int LastRoder) { Canvas[] childs = gameObject.GetComponentsInChildren(true); for(int i=1;i= LastRoder) renderroder = order + (renderroder - LastRoder); else renderroder += order; childs[i].sortingOrder = renderroder > 0 ? renderroder : 0; } } public void SortUIParticle(int order) { for(int i=0;i(); m_Canvas.sortingOrder = 0; } if (m_Canvas != null) { m_Canvas.overrideSorting = true; lastCanvasOrder = m_Canvas.sortingOrder; m_Canvas.sortingOrder = orderIndex; } if (m_Raycaster == null) m_Raycaster = gameObject.EnsureComponent(); SetLayer(UIManager.Instance().gameObject.layer); SortUIParticle(orderIndex); SortSelfCavas(orderIndex , lastCanvasOrder); } public void SetLayer(int layer) { gameObject.layer = layer; Transform[] allChilds = GetComponentsInChildren(); for (int i = 0; i < allChilds.Length; i++) { allChilds[i].gameObject.layer = layer; } } public void RemoveCanvas() { if (m_Raycaster != null) { m_Raycaster.enabled = false; Object.DestroyImmediate(m_Raycaster); m_Raycaster = null; } if (m_Canvas != null) { SortUIParticle(-1 * m_Canvas.sortingOrder); SortSelfCavas(-1 * m_Canvas.sortingOrder,0); m_Canvas.enabled = false; Object.DestroyImmediate(m_Canvas); m_Canvas = null; } } //静态数据 private static List mStatic_WindowSigns = new List(); public static void Static_ReSortWindow() { mStatic_WindowSigns.Sort((wnd1, wnd2) => { if (wnd1.SortingOrder < wnd2.SortingOrder) return -1; else if (wnd1.SortingOrder > wnd2.SortingOrder) return 1; return 0; }); bool IsIn = false; for(int i=0;i