Unity 2D Sorting Group 在 31-32 个精灵后中断。使用自定义脚本修复

Unity 2D Sorting Group breaking after 31-32 sprites. Fixed with custom script

我遇到了一个限制我在游戏上工作的问题。

我有一个游戏对象,其中包含设置为“背景层”的排序组组件。

而且我的游戏对象运行良好。他们都在排序组(默认)。我什至尝试将它们设置为背景,但这没有帮助。

当我通过 31 个游戏对象(即渲染器)时,一切都开始崩溃了。例如,层次结构中的第一个 sprite 会跳到最前面,如果我继续添加更多的 sprite,它会将列表顶部的其他 sprite 带到最前面。

我不知道为什么总是这样。

如有任何帮助,我们将不胜感激!

编辑:检查答案以解决此问题。

Ps。我在那个 BG 游戏对象下有网格渲染器 (spine2d) 和精灵渲染器。我试图查看问题是否出在网格渲染器上,但事实并非如此。仅使用 Sprite 渲染器它仍然收支平衡。

好的!所以,伙计们,我尝试了左右排序组,但它仍然对我不起作用。

我什至尝试制作一个新场景,添加一个只有一个排序组组件的游戏对象,然后尝试用超过 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;
        }
    }
}

还有中提琴!就这样。脚本附加到场景后,所有内容都会根据游戏中的层次结构自动更新。您可以在主脚本的 public RendererMarker 数组中查看所有内容的顺序。

希望对大家有所帮助!