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 数组中查看所有内容的顺序。
希望对大家有所帮助!
我遇到了一个限制我在游戏上工作的问题。
我有一个游戏对象,其中包含设置为“背景层”的排序组组件。
而且我的游戏对象运行良好。他们都在排序组(默认)。我什至尝试将它们设置为背景,但这没有帮助。
当我通过 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 数组中查看所有内容的顺序。
希望对大家有所帮助!