LayerManager.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using UnityEditor;
  5. using UnityEngine;
  6. using UnityEngine.Rendering;
  7. namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
  8. {
  9. /// <summary>
  10. /// Used to order sprite layers (character parts).
  11. /// </summary>
  12. public class LayerManager : MonoBehaviour
  13. {
  14. /// <summary>
  15. /// SortingGroup can be used when you have multiple characters on scene.
  16. /// </summary>
  17. public SortingGroup SortingGroup;
  18. /// <summary>
  19. /// The full list of character sprites.
  20. /// </summary>
  21. public List<SpriteRenderer> Sprites;
  22. public LayerManager CopyTo;
  23. public void SetSortingGroupOrder(int index)
  24. {
  25. SortingGroup.sortingOrder = index;
  26. }
  27. /// <summary>
  28. /// Get character sprites and order by Sorting Order.
  29. /// </summary>
  30. public void GetSpritesBySortingOrder()
  31. {
  32. Sprites = GetComponentsInChildren<SpriteRenderer>(true).OrderBy(i => i.sortingOrder).ToList();
  33. }
  34. /// <summary>
  35. /// Set Sorting Order for character sprites.
  36. /// </summary>
  37. public void SetSpritesBySortingOrder()
  38. {
  39. for (var i = 0; i < Sprites.Count; i++)
  40. {
  41. Sprites[i].sortingOrder = 5 * i;
  42. }
  43. #if UNITY_EDITOR
  44. EditorUtility.SetDirty(this);
  45. #endif
  46. }
  47. public void CopyOrder()
  48. {
  49. if (CopyTo == null) throw new ArgumentNullException(nameof(CopyTo));
  50. foreach (var sprite in CopyTo.Sprites)
  51. {
  52. sprite.sortingOrder = Sprites.Single(i => i.name == sprite.name && GetSpriteRendererPath(i) == GetSpriteRendererPath(sprite)).sortingOrder;
  53. }
  54. Debug.Log("Copied!");
  55. }
  56. private static string GetSpriteRendererPath(SpriteRenderer spriteRenderer)
  57. {
  58. var path = spriteRenderer.name;
  59. var t = spriteRenderer.transform;
  60. while (t.parent != null && t.parent.GetComponent<Character4D>() == null)
  61. {
  62. path = t.parent.name + "/" + path;
  63. t = t.parent;
  64. }
  65. return path;
  66. }
  67. }
  68. }