138 lines
4.6 KiB
C#
138 lines
4.6 KiB
C#
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);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} |