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