#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 из основного скрипта.
Я надеюсь, что это кому-нибудь поможет!