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