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

138 lines
4.6 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;
/// <summary>
/// UI 界面上的特效管理类 绑定在特效的最外层物体上特效的Prefab上
/// </summary>
public class UIParticleSystem : UIBehaviour
{
private static Shader _replaceShader;
private int _LastAddOrder;
private bool _started;
private UiMaskListener _maskListener;
protected override void OnEnable()
{
base.OnEnable();
var renders = gameObject.GetComponentsInChildren<Renderer>();
for (var i = 0; i < renders.Length; i++)
{
var renderroder = renders[i].sortingOrder;
renders[i].sortingOrder = renderroder > 0 ? renderroder : 1;
var meshRender = renders[i].gameObject.GetComponent<MeshRendererOrder>();
if (meshRender != null)
meshRender.sortingOrder = renderroder > 0 ? renderroder : 1;
}
Init();
if (_started)
SetCullListening(true);
}
protected override void Start()
{
base.Start();
var mask = gameObject.GetComponentInParent<Mask>();
if (mask != null)
{
_maskListener = mask.gameObject.EnsureComponent<UiMaskListener>();
SetCullListening(true);
}
_started = true;
}
private void SetCullListening(bool isEnable)
{
if (_maskListener != null)
{
_maskListener.onMaskUndate -= Cull;
if (isEnable)
_maskListener.onMaskUndate += Cull;
}
}
public void Init()
{
var wndParent = gameObject.GetComponentsInParent<WindowSign>();
if (wndParent.Length <= 0)
return;
wndParent[0].SetWndDirty();
}
protected override void OnDisable()
{
base.OnDisable();
var wndParent = gameObject.GetComponentsInParent<WindowSign>();
if (wndParent.Length <= 0)
return;
wndParent[0].SetWndDirty();
SetCullListening(false);
}
public void SortParticle(int order)
{
if (order > 0)
order -= _LastAddOrder;
var renders = gameObject.GetComponentsInChildren<Renderer>();
for (var i = 0; i < renders.Length; i++)
{
var renderroder = renders[i].sortingOrder;
renderroder += order;
renders[i].sortingOrder = renderroder > 0 ? renderroder : 1;
var meshRender = renders[i].gameObject.GetComponent<MeshRendererOrder>();
if (meshRender != null)
meshRender.sortingOrder = renderroder > 0 ? renderroder : 1;
}
_LastAddOrder += order;
}
//检查一下是否是在UI的裁剪区域
private void Cull(UiMaskListener listener)
{
var renderers = gameObject.GetComponentsInChildren<Renderer>();
if (renderers.Length < 1)
return;
if (_maskListener != null)
{
var rect = _maskListener.rect;
for (var i = 0; i < renderers.Length; i++)
{
var renderItem = renderers[i];
for (var j = 0; j < renderItem.sharedMaterials.Length; j++)
{
if (renderItem.sharedMaterials[j] != null)
{
var shader = renderItem.sharedMaterials[j].shader;
if (shader != null)
{
var cull = false;
if (shader.name.Contains("AdditiveAlphaWrite"))
{
if (_replaceShader == null)
_replaceShader = Shader.Find("Zhanyou/Particles/AdditiveAlphaWriteMask");
if (_replaceShader != null)
{
renderItem.materials[j].shader = _replaceShader;
cull = true;
}
}
else if (shader.name.Contains("AlphaBlendAlphaWrite"))
{
cull = true;
}
if (cull)
{
var material = renderItem.materials[j];
material.SetFloat("_UseMask", 2);
material.SetVector("_ClipRect", rect);
}
}
}
}
}
}
}
}