C# Unity 2D排序组在31-32个精灵后中断。修复了自定义脚本

C# Unity 2D排序组在31-32个精灵后中断。修复了自定义脚本,c#,unity3d,sprite,C#,Unity3d,Sprite,我正面临一个限制我在游戏中工作的问题 我有一个游戏对象,其中包含一个排序组组件,设置为“背景层” 而且它可以很好地处理我的游戏对象。它们都在排序组上(默认)。我甚至试着将它们设置为背景,但那没有帮助 当我经过31个游戏对象(即渲染器)时,一切都开始崩溃。如中所示,层次结构中的第一个精灵将跳到前面,如果我继续添加更多精灵,它会将列表顶部的其他精灵带到前面 我不知道为什么它总是这样破裂 任何帮助都将不胜感激 编辑:检查答案以修复此问题 另外,我有网格渲染器(spine2d)以及BG游戏对象下的精灵

我正面临一个限制我在游戏中工作的问题

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

而且它可以很好地处理我的游戏对象。它们都在排序组上(默认)。我甚至试着将它们设置为背景,但那没有帮助

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

我不知道为什么它总是这样破裂

任何帮助都将不胜感激

编辑:检查答案以修复此问题


另外,我有网格渲染器(spine2d)以及BG游戏对象下的精灵渲染器。我试着看看问题是否出在网格渲染器上,但事实并非如此。单靠精灵渲染器还是收支平衡。

好吧!所以,伙计们,我尝试了左右分类组,但它仍然不适合我

我甚至尝试制作一个新场景,添加一个只包含排序组组件的游戏对象,然后尝试用31个以上的精灵(给予或接受)填充它,但它仍然失败(将层次结构中较高的图像带到前面,甚至带来随机图像)

所以我决定制作我自己的分类组脚本。它的工作原理和它一样,甚至更好

它允许渲染器的通常数量超过1000

我是这样做的:

首先,我们制作一个脚本,它将被放置在通常具有排序组组件的父游戏对象上。删除排序组组件,然后添加一个新脚本。我们将其命名为:RenderResorter。作为一个示例

把这个填进去:

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);
        }
    }
}
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;
        }
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
[执行编辑模式]
公共类渲染器分类器:MonoBehavior
{   
//这个脚本是破旧的unity排序组系统的替代品。它可以自动排序精灵而无需任何麻烦。允许1000多个渲染器。
public rendermarker[]rendermarkers;//用于组的排序。
公共字符串sortingLayerName;//用于组的排序。
private void Update()//每次更改场景中的某些内容时都会调用此函数。
{
if(Application.isPlaying)
{
返回;
}
RendererMarkers=GetComponentsInChildren();
对于(int i=0;i
然后,我们制作另一个脚本,该脚本将附加到包含渲染器(网格或精灵)的游戏对象。让我们将此脚本称为RenderMarker(就像第一个脚本中引用的那样)。并将其添加到其中:

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);
        }
    }
}
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;
        }
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类渲染器标记器:MonoBehavior
{
//用于为该游戏对象的渲染器提供适当排序组层的标记。
MeshRenderer MeshRenderer;//它可以是网格渲染器。
spritender spritender;//也可以是精灵渲染器。
公共void设置排序层(整数顺序,字符串排序层名称)
{
meshRenderer=GetComponent();
spriteender=GetComponent();
//然后,我们根据void参数中渲染器的类型进行排序。
如果(网格渲染器!=null)
{
meshRenderer.sortingLayerName=sortingLayerName;
meshRenderer.sortingOrder=订单;
}
else if(spritterenderer!=null)
{
SpriteRender.sortingLayerName=sortingLayerName;
spriteender.sortingOrder=订单;
}
}
}
还有viola!就像那样。脚本连接到场景的那一刻,所有内容都将根据游戏中的层次结构自动更新。您可以从主脚本中查看公共渲染器标记数组中的所有内容的顺序


我希望这对任何人都有帮助!

有没有可能只存在排序层。
32
至少考虑到一般层。@derHugo即使有这种可能性,我也不希望受到限制。我希望能够放置任意数量的精灵,并让它们根据层次自动排序。解决方案我已经在我的答案是工作。谢谢。