using System; using System.Collections.Generic; using System.Linq; using UnityEditor; using UnityEngine; using UnityEngine.Rendering; namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts { /// /// Used to order sprite layers (character parts). /// public class LayerManager : MonoBehaviour { /// /// SortingGroup can be used when you have multiple characters on scene. /// public SortingGroup SortingGroup; /// /// The full list of character sprites. /// public List Sprites; public LayerManager CopyTo; public void SetSortingGroupOrder(int index) { SortingGroup.sortingOrder = index; } /// /// Get character sprites and order by Sorting Order. /// public void GetSpritesBySortingOrder() { Sprites = GetComponentsInChildren(true).OrderBy(i => i.sortingOrder).ToList(); } /// /// Set Sorting Order for character sprites. /// public void SetSpritesBySortingOrder() { for (var i = 0; i < Sprites.Count; i++) { Sprites[i].sortingOrder = 5 * i; } #if UNITY_EDITOR 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; } } }