Как можно сделать все спрайты у объекта с компонентом SpriteRenderer прозрачными одновременно?

Как можно одновременно сделать группу спрайтов SpriteRenderer прозрачной?
  • 28 мая 2024 г. 3:21
Ответы на вопрос 2
1. Для сделания всех спрайтов у объекта с компонентом SpriteRenderer одновременно прозрачными, можно использовать следующий код в скрипте:

```csharp
using UnityEngine;

public class TransparentSprites : MonoBehaviour
{
    private void Start()
    {
        SpriteRenderer[] spriteRenderers = GetComponentsInChildren<SpriteRenderer>();
        foreach (SpriteRenderer spriteRenderer in spriteRenderers)
        {
            Color color = spriteRenderer.color;
            color.a = 0f; // устанавливаем нулевую прозрачность
            spriteRenderer.color = color;
        }
    }
}
```

2. Чтобы одновременно сделать группу спрайтов SpriteRenderer прозрачной, можно поместить их в одну общую пустую игровую объект и использовать аналогичный скрипт:

```csharp
using UnityEngine;

public class TransparentGroup : MonoBehaviour
{
    private void Start()
    {
        SpriteRenderer[] spriteRenderers = GetComponentsInChildren<SpriteRenderer>();
        foreach (SpriteRenderer spriteRenderer in spriteRenderers)
        {
            Color color = spriteRenderer.color;
            color.a = 0f; // устанавливаем нулевую прозрачность
            spriteRenderer.color = color;
        }
    }
}
```

Поместите этот скрипт на пустой игровой объект, содержащий группу спрайтов SpriteRenderer, и все спрайты в этой группе будут сделаны прозрачными.
Вот исходники моего решения (два класса, один - хелпер) 
UnityHelper.Current.OrderMinValue=-32767

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public static class UnityExtensions
{
    public static void SetColorAlpha(this Image image, float value)
    {
        image.color = new Color(image.color.r, image.color.g, image.color.b, value);
    }

    public static void SetColorAlpha(this SpriteRenderer spriteRenderer, float value)
    {
        spriteRenderer.color = new Color(spriteRenderer.color.r, spriteRenderer.color.g, spriteRenderer.color.b, value);
    }

    public static IEnumerable<Transform> GetAllChildrenRecurcive(this Transform transform)
    {
        foreach (Transform child in transform)
        {
            yield return child;
            foreach (var innerChild in child.GetAllChildrenRecurcive())
            {
                yield return innerChild;
            }
        }
    }

    public static IEnumerable<T> GetComponents<T>(this IEnumerable<Transform> transforms)
    {
        return transforms.Select(t => t.GetComponent<T>()).Where(c => c != null);
    }
}

public class MaskOpacityBehaviour : MonoBehaviour
{
    private List<ChildSpriteMask> ChildSpriteMasks { get; set; }

    private void Start()
    {
        ChildSpriteMasks = new();
        var children = transform.GetAllChildrenRecurcive().GetComponents<SpriteRenderer>().ToList();
        foreach (var child in children)
        {
            child.maskInteraction = SpriteMaskInteraction.VisibleOutsideMask;

            var maskGo = new GameObject(child.name + "mask");
            maskGo.transform.parent = transform;
            var spriteMask = maskGo.AddComponent<SpriteMask>();
            spriteMask.isCustomRangeActive = true;

            UpdateSpriteMask(child, spriteMask);

            ChildSpriteMasks.Add(new ChildSpriteMask(child, spriteMask));
        }
    }

    private void Update()
    {
        foreach (var cm in ChildSpriteMasks)
        {
            UpdateSpriteMask(cm.Child, cm.SpriteMask);
        }
    }

    private static void UpdateSpriteMask(SpriteRenderer child, SpriteMask spriteMask)
    {
        spriteMask.sprite = child.sprite;
        spriteMask.frontSortingLayerID = child.sortingLayerID;
        spriteMask.frontSortingOrder = child.sortingOrder - 1;
        spriteMask.backSortingLayerID = child.sortingLayerID;
        spriteMask.backSortingOrder = UnityHelper.Current.OrderMinValue;
        spriteMask.transform.position = child.transform.position;
        spriteMask.transform.rotation = child.transform.rotation;
        spriteMask.transform.localScale = child.transform.localScale;
    }

    private class ChildSpriteMask
    {
        public ChildSpriteMask(SpriteRenderer child, SpriteMask spriteMask)
        {
            Child = child;
            SpriteMask = spriteMask;
        }

        public SpriteRenderer Child { get; }
        public SpriteMask SpriteMask { get; }
    }
}
Похожие вопросы