using System; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.Rendering; namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts { /// /// Used to order sprite layers (character parts). /// public class LayerManager : MonoBehaviour { /// /// Full list of sprites /// public List Sprites; /// /// SortingGroup can be used when you have multiple characters on scene. /// public SortingGroup SortingGroup; /// /// Step between two sprites (layers). /// public int SortingOrderStep = 5; public LayerManager CopyTo; /// /// Read ordered sprite list by Sorting Order. /// public void ReadSortingOrder() { Sprites = GetComponentsInChildren(true).OrderBy(i => i.sortingOrder).ToList(); } /// /// Set layers order by Sorting Order. /// public void SetSortingOrder() { for (var i = 0; i < Sprites.Count; i++) { Sprites[i].sortingOrder = SortingOrderStep * i; } #if UNITY_EDITOR UnityEditor.EditorUtility.SetDirty(this); #endif } public void CopyOrder() { if (CopyTo == null) throw new ArgumentNullException(nameof(CopyTo)); foreach (var sprite in CopyTo.Sprites) { sprite.sortingOrder = Sprites.Single(i => i.name == sprite.name && GetSpriteRendererPath(i) == GetSpriteRendererPath(sprite)).sortingOrder; } Debug.Log("Copied!"); } private static string GetSpriteRendererPath(SpriteRenderer spriteRenderer) { var path = spriteRenderer.name; var t = spriteRenderer.transform; while (t.parent != null && t.parent.GetComponent() == null) { path = t.parent.name + "/" + path; t = t.parent; } return path; } } }