|  |  |  | 
|---|
|  |  |  | using System.Collections.Generic; | 
|---|
|  |  |  | using UnityEngine; | 
|---|
|  |  |  | using System; | 
|---|
|  |  |  | using Spine.Unity; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public class RendererAdjuster : MonoBehaviour | 
|---|
|  |  |  | { | 
|---|
|  |  |  | public int renderQueue = 3000; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public Canvas canvas; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public int sortingOrderOffset = 1; | 
|---|
|  |  |  | public int sortingOrder = 0; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public string customSortingLayer = "UI"; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public List<Renderer> renderers = new List<Renderer>(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public void Awake() | 
|---|
|  |  |  | // private List<SkeletonAnimation> skeletonAnimations = new List<SkeletonAnimation>(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | protected Canvas canvas; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public int canvasOffset = 1; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public Action<string, int> onSortingChanged; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | protected void Awake() | 
|---|
|  |  |  | { | 
|---|
|  |  |  | UpdateComps(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public void SetSortingOrder(int sortingOrder) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | this.sortingOrder = sortingOrder; | 
|---|
|  |  |  | UpdateLayer(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | protected void UpdateComps() | 
|---|
|  |  |  | 
|---|
|  |  |  | renderers.Clear(); | 
|---|
|  |  |  | renderers.AddRange(gameObject.GetComponentsInChildren<Renderer>(true)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | canvas = GetComponentInParent<Canvas>(); | 
|---|
|  |  |  | // skeletonAnimations.Clear(); | 
|---|
|  |  |  | // skeletonAnimations.AddRange(gameObject.GetComponentsInChildren<SkeletonAnimation>(true)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | canvas = GetComponentInChildren<Canvas>(true); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public void SetParentCanvas(Canvas _canvas) | 
|---|
|  |  |  | [ContextMenu("UpdateLayer")] | 
|---|
|  |  |  | private void UpdateLayer() | 
|---|
|  |  |  | { | 
|---|
|  |  |  | canvas = _canvas; | 
|---|
|  |  |  | this.DelayFrame(UpdateSortingOrder); | 
|---|
|  |  |  | UpdateComps(); | 
|---|
|  |  |  | UpdateSortingOrder(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public void UpdateSortingOrder() | 
|---|
|  |  |  | { | 
|---|
|  |  |  | int canvasSortingOrder = 0; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 获取父级Canvas的排序顺序 | 
|---|
|  |  |  | if (canvas != null) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | canvasSortingOrder = canvas.sortingOrder; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | else | 
|---|
|  |  |  | { | 
|---|
|  |  |  | // 如果没有找到父级Canvas,则使用默认值 | 
|---|
|  |  |  | canvasSortingOrder = 0; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 将特效的排序顺序设置为Canvas排序顺序加上偏移量 | 
|---|
|  |  |  | ApplySortingSettings(canvasSortingOrder + sortingOrderOffset, customSortingLayer); | 
|---|
|  |  |  | ApplySortingSettings(sortingOrder, customSortingLayer); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private void ApplySortingSettings(int sortingOrder, string sortingLayer) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | 
|---|
|  |  |  | if (renderer != null) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | renderer.sortingOrder = sortingOrder; | 
|---|
|  |  |  | renderer.material.renderQueue = renderQueue; // 设置渲染队列 | 
|---|
|  |  |  | // renderer.material.renderQueue = overlayRQ; | 
|---|
|  |  |  | if (!string.IsNullOrEmpty(sortingLayer)) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | renderer.sortingLayerName = sortingLayer; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (null != canvas) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | canvas.sortingOrder = sortingOrder + canvasOffset; | 
|---|
|  |  |  | if (!string.IsNullOrEmpty(sortingLayer)) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | canvas.sortingLayerName = sortingLayer; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // foreach (var skeletonAnim in skeletonAnimations) | 
|---|
|  |  |  | // { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | onSortingChanged?.Invoke(sortingLayer, sortingOrder); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|