我发现这段代码让对象根据 Y 位置对自己进行排序,但我不得不将带有代码的脚本复制到地图上基本上的所有内容上。对于 CPU 和/或内存,将该方法设为单例并将其放入每个人的更新中会更好吗?
这是排序功能:
public class SortOrder : MonoBehaviour {
void Update () {
GetComponent<SpriteRenderer>().sortingOrder =
Mathf.RoundToInt(transform.position.y * 100f) * -1;
}
}
但我可以这样说:
public static void SortOrder(){
GetComponent<SpriteRenderer>().sortingOrder =
Mathf.RoundToInt(transform.position.y * 100f) * -1;
}
只需将其放在我需要的更新功能中即可。
这些选项在 CPU 或内存负载方面有什么区别吗?
另一种选择是制作扩展方法。这样,您只需通过传入的转换来设置SpriteRenderer的排序顺序。
public static class SpriteRendererExtensions
{
/// <summary>
/// Set the SpriteRenderer sorting order by the Transform.
/// </summary>
/// <param name="sr">The SpriteRenderer being extended.</param>
/// <param name="transform">The Transform of the object to use for sorting.</param>
public static void SetSortingOrder ( this SpriteRenderer sr, Transform transform )
{
sr.sortingOrder = Mathf.RoundToInt ( transform.position.y * 100f ) * -1;
}
}
并像这样使用它:
GetComponent<SpriteRenderer> ( ).SetSortingOrder(this.transform);
或者,您甚至可以保存引用,并使用检查器:
public SpriteRenderer sr;
// ...
sr.SetSortingOrder(this.transform);
对于 CPU 性能,最好有一个更新循环,该循环一次执行相同的数据集的类似作业。您可以通过例如为所有需要根据变换位置自动排序的精灵创建一个标签来实现这一点。然后有一个"控制器"组件,该组件每帧循环访问这些SpriteRenderer组件:
public class SpriteSorting : MonoBehaviour {
public string sortingTag;
List<SpriteRenderer> spritesNeedingSorting = new List<SpriteRenderer> ();
void Start () {
var gameObjects = GameObject.FindGameObjectsWithTag (sortingTag);
foreach (var gameObject in gameObjects) {
spritesNeedingSorting.Add (gameObject.GetComponent<SpriteRenderer> ());
}
}
void Update () {
foreach (var sprite in spritesNeedingSorting) {
sprite.sortingOrder = Mathf.RoundToInt (sprite.transform.position.y * 100f) * -1f;
}
}
}
显然,如果您需要动态生成和销毁精灵,则需要将此组件制作成单例,并实现用于在列表中添加和删除组件的函数,并显式调用这些组件。