98 lines
2.3 KiB
C#
98 lines
2.3 KiB
C#
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
using GameCore;
|
||
using System;
|
||
|
||
namespace GameLogic
|
||
{
|
||
/// <summary>
|
||
/// UI特效
|
||
/// </summary>
|
||
public class UIEffect : MonoBehaviour
|
||
{
|
||
/// <summary>
|
||
/// 目标画布
|
||
/// </summary>
|
||
[SerializeField]
|
||
protected Canvas canvas;
|
||
/// <summary>
|
||
/// 偏移值
|
||
/// </summary>
|
||
[SerializeField]
|
||
protected int offset;
|
||
/// <summary>
|
||
/// 渲染器有序列表(SortingOrder排序)
|
||
/// </summary>
|
||
List<Renderer> list = new List<Renderer>();
|
||
|
||
public Canvas Canvas
|
||
{
|
||
get
|
||
{
|
||
if (canvas == null)
|
||
canvas = this.transform.GetComponentInParent<Canvas>();
|
||
return canvas;
|
||
}
|
||
set
|
||
{
|
||
canvas = value;
|
||
}
|
||
}
|
||
|
||
|
||
private void Awake()
|
||
{
|
||
list.AddRange(GetComponentsInChildren<Renderer>());
|
||
list.Sort(RendererCompare.Instance);
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 设置特效的偏移值,保证特效内部偏移值正确
|
||
/// </summary>
|
||
/// <param name="offset"></param>
|
||
public void SetOffset(int offset)
|
||
{
|
||
this.offset = offset;
|
||
}
|
||
|
||
|
||
|
||
private void Update()
|
||
{
|
||
if (Canvas)
|
||
{
|
||
int count = 0;
|
||
int tmpOrder = int.MinValue;
|
||
for (int i = 0; i < list.Count; i++)
|
||
{
|
||
if (tmpOrder < list[i].sortingOrder)
|
||
{
|
||
tmpOrder = list[i].sortingOrder;
|
||
count++;
|
||
}
|
||
list[i].sortingOrder = Canvas.sortingOrder + offset + count;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 渲染器比较工具
|
||
/// </summary>
|
||
public class RendererCompare : Singleton<RendererCompare>, IComparer<Renderer>
|
||
{
|
||
public int Compare(Renderer x, Renderer y)
|
||
{
|
||
if (x.sortingOrder > y.sortingOrder)
|
||
return 1;
|
||
else if (x.sortingOrder == y.sortingOrder)
|
||
return 0;
|
||
else
|
||
return -1;
|
||
}
|
||
}
|
||
}
|
||
|