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