Группа сортировки Unity 2D разбивается после 31-32 спрайтов. Исправлено с помощью пользовательского скрипта

#c# #unity3d #sprite

Вопрос:

Я столкнулся с проблемой, которая ограничивает мою работу над игрой.

У меня есть игровой объект, содержащий компонент группы сортировки, для которого установлено значение «Фоновый слой».

введите описание изображения здесь

И это прекрасно работает с моими игровыми объектами. Все они находятся в группе сортировки (по умолчанию). Я даже попытался установить их в фоновом режиме, но это не помогло.

В тот момент, когда я передаю 31 игровой объект (т. Е. визуализаторы), все начинает ломаться. Как и в случае, самый первый спрайт в иерархии перейдет на передний план, и если я продолжу добавлять больше спрайтов, это приведет к тому, что другие спрайты из верхней части списка окажутся впереди.

Я понятия не имею, почему он продолжает так ломаться.

Любая помощь будет признательна!

ИЗМЕНИТЬ: Проверьте ответ на исправление этой проблемы.

Пс. У меня есть визуализаторы сетки (spine2d), а также визуализаторы спрайтов под этим игровым объектом BG. И я попытался понять, была ли проблема с визуализатором сетки, но это было не так. Он по-прежнему работал даже с одними только визуализаторами спрайтов.

Комментарии:

1. Возможно ли, что просто могут существовать только 32 слои сортировки .. по крайней мере, это относится к общим слоям ..

2. @derHugo Даже при такой возможности мне не нужен предел. Я хочу иметь возможность размещать столько спрайтов, сколько захочу, и автоматически сортировать их в соответствии с иерархией. Решение, которое я нашел в своем ответе, работает. Спасибо.

Ответ №1:

Ладно! Итак, ребята, я попробовал с сортировочной группой слева и справа, но это все равно не сработало со мной.

Я попытался даже создать новую сцену, добавив игровой объект только с компонентом группы сортировки, а затем попытался заполнить его более чем 31 спрайтом (плюс-минус), но он все равно сломался (выводя изображения на первое место в иерархии и даже выводя случайные изображения.

И поэтому я просто решил создать свой собственный сценарий группы сортировки. Это работает точно так же, и даже лучше.

Это позволяет использовать обычное количество визуализаторов, которое превышает 1000.

Итак, вот как я это сделал:

Во-первых, мы создаем скрипт, который будет размещен на родительском игровом объекте, который обычно содержит компонент группы сортировки. Удалите компонент группы сортировки и добавьте новый сценарий. Давайте назовем это: RendererSorter. Просто в качестве примера.

Заполните это в нем:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[ExecuteInEditMode]
public class RendererSorter: MonoBehaviour
{   
    //This script is an alternative to the shabby unity sorting group system. It automatically orders sprites without any hassle. Allowing more than 1000 renderers.

    public RendererMarker[] RendererMarkers; //Used for the sorting of groups.
    public string sortingLayerName; //For the sorting of groups.

    private void Update() //This will be called each time we change something in the scene.
    {
        if (Application.isPlaying)
        {
            return;
        }
        RendererMarkers = GetComponentsInChildren<RendererMarker>();
        for (int i = 0; i < RendererMarkers.Length; i  )
        {
            RendererMarkers[i].SetSortingLayer(i, sortingLayerName);
        }
    }
}
 

Затем мы создадим еще один скрипт, который будет прикреплен к игровым объектам, содержащим средство визуализации (сетка или спрайт). Давайте назовем этот сценарий RendererMarker (точно так же, как на него ссылается первый сценарий. И добавьте в него вот это:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RendererMarker : MonoBehaviour
{
    // Marker used to give this gameobject's renderer the appropriate sorting group layer.

    MeshRenderer meshRenderer;  //It could be a mesh renderer.
    SpriteRenderer spriteRenderer; //Or it could be a sprite renderer.

    public void SetSortingLayer(int order, string sortingLayerName)
    {
        meshRenderer = GetComponent<MeshRenderer>();
        spriteRenderer = GetComponent<SpriteRenderer>();

        //Then we sort based on the type of renderer from the void paramater.

        if (meshRenderer != null)
        {
            meshRenderer.sortingLayerName = sortingLayerName;
            meshRenderer.sortingOrder = order;
        }
        else if(spriteRenderer != null)
        {
            spriteRenderer.sortingLayerName = sortingLayerName;
            spriteRenderer.sortingOrder = order;
        }
    }
}
 

И виола! Именно так. В тот момент, когда сценарии будут прикреплены к сцене, все будет автоматически обновляться в соответствии с иерархией в вашей игре. Вы можете увидеть, как все упорядочено в общедоступном массиве RendererMarker из основного скрипта.

Я надеюсь, что это кому-нибудь поможет!