mmorpg/Assets/HeroEditor4D/Common/Scripts/CharacterScripts/LayerManager.cs
2024-01-30 19:56:12 +05:30

80 lines
2.3 KiB
C#
Executable File

using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Rendering;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
/// <summary>
/// Used to order sprite layers (character parts).
/// </summary>
public class LayerManager : MonoBehaviour
{
/// <summary>
/// Full list of sprites
/// </summary>
public List<SpriteRenderer> Sprites;
/// <summary>
/// SortingGroup can be used when you have multiple characters on scene.
/// </summary>
public SortingGroup SortingGroup;
/// <summary>
/// Step between two sprites (layers).
/// </summary>
public int SortingOrderStep = 5;
public LayerManager CopyTo;
/// <summary>
/// Read ordered sprite list by Sorting Order.
/// </summary>
public void ReadSortingOrder()
{
Sprites = GetComponentsInChildren<SpriteRenderer>(true).OrderBy(i => i.sortingOrder).ToList();
}
/// <summary>
/// Set layers order by Sorting Order.
/// </summary>
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<Character4D>() == null)
{
path = t.parent.name + "/" + path;
t = t.parent;
}
return path;
}
}
}