Files
JJBB/Assets/Project/Script/WindowSign.cs
2024-08-23 15:49:34 +08:00

211 lines
5.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}
}
}