Files
JJBB/Assets/Project/Script/WindowSign.cs

211 lines
5.4 KiB
C#
Raw Permalink Normal View History

2024-08-23 15:49:34 +08:00
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
public class WindowSign : MonoBehaviour
{
private List<UIParticleSystem> m_UIParticles = new List<UIParticleSystem>();
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<UIParticleSystem>(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<Canvas>(true);
for(int i=1;i<childs.Length;i++)
{
int renderroder = childs[i].sortingOrder;
if (order < 0 && renderroder + order < 0)
continue;
if (renderroder >= 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_UIParticles.Count;i++)
{
if(ObjectValit(m_UIParticles[i]))
{
m_UIParticles[i].SortParticle(order);
}
}
}
public void AddCanvasComponent(int orderIndex = 2)
{
int lastCanvasOrder = 0;
if (m_Canvas == null)
{
m_Canvas = gameObject.EnsureComponent<Canvas>();
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<GraphicRaycaster>();
SetLayer(UIManager.Instance().gameObject.layer);
SortUIParticle(orderIndex);
SortSelfCavas(orderIndex , lastCanvasOrder);
}
public void SetLayer(int layer)
{
gameObject.layer = layer;
Transform[] allChilds = GetComponentsInChildren<Transform>();
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<WindowSign> mStatic_WindowSigns = new List<WindowSign>();
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<mStatic_WindowSigns.Count;i++)
{
if(IsIn || mStatic_WindowSigns[i]._IsNeedAddCanvas)
{
mStatic_WindowSigns[i].AddCanvasComponent(i * 100); //每个窗口预留100个层级给特效
}
else
{
mStatic_WindowSigns[i].RemoveCanvas();
}
if(mStatic_WindowSigns[i].IsUIParticleIn)
{
IsIn = true;
}
}
}
}