Unity3d (Unity)最好多次复制组件或将其作为公共静态文件?

Unity3d (Unity)最好多次复制组件或将其作为公共静态文件?,unity3d,static,singleton,components,public,Unity3d,Static,Singleton,Components,Public,我发现这段代码让对象根据Y位置自行排序,但我必须将带有代码的脚本复制到地图上的所有内容上。对于CPU和/或内存来说,将方法设置为单例并将其放入每个人的更新中会更好吗 以下是排序功能: public class SortOrder : MonoBehaviour { void Update () { GetComponent<SpriteRenderer>().sortingOrder = Mathf.RoundToInt(transform.position.y *

我发现这段代码让对象根据Y位置自行排序,但我必须将带有代码的脚本复制到地图上的所有内容上。对于CPU和/或内存来说,将方法设置为单例并将其放入每个人的更新中会更好吗

以下是排序功能:

public class SortOrder : MonoBehaviour {

void Update () {
    GetComponent<SpriteRenderer>().sortingOrder =
    Mathf.RoundToInt(transform.position.y * 100f) * -1;
    }
}
公共类排序器:单行为{
无效更新(){
GetComponent().sortingOrder=
数学圆整(变换位置y*100f)*-1;
}
}
但我可以这样做:

public static void SortOrder(){
    GetComponent<SpriteRenderer>().sortingOrder =
    Mathf.RoundToInt(transform.position.y * 100f) * -1;
}
publicstaticvoidsortorder(){
GetComponent().sortingOrder=
数学圆整(变换位置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;
    }
}

另一个选择是创建一个扩展方法。通过这种方式,您只需通过传入的变换设置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;
    }
}

对于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;
        }
    }
}
公共类精神分类:单一行为{
公共字符串排序标签;
List SPRITESENDINGSORTING=新列表();
无效开始(){
var gameObjects=GameObject.FindGameObjectsWithTag(sortingTag);
foreach(gameObjects中的var gameObject){
spriteseedingsorting.Add(gameObject.GetComponent());
}
}
无效更新(){
foreach(spritesNeedingSorting中的变量sprite){
sprite.sortingOrder=Mathf.RoundToInt(sprite.transform.position.y*100f)*-1f;
}
}
}

显然,如果您需要动态生成和销毁精灵,则需要将此组件设置为单例,并实现从列表中添加和删除组件的功能,并显式调用这些组件。

对于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;
        }
    }
}
公共类精神分类:单一行为{
公共字符串排序标签;
List SPRITESENDINGSORTING=新列表();
无效开始(){
var gameObjects=GameObject.FindGameObjectsWithTag(sortingTag);
foreach(gameObjects中的var gameObject){
spriteseedingsorting.Add(gameObject.GetComponent());
}
}
无效更新(){
foreach(spritesNeedingSorting中的变量sprite){
sprite.sortingOrder=Mathf.RoundToInt(sprite.transform.position.y*100f)*-1f;
}
}
}
显然,如果您需要动态地生成和销毁精灵,那么您需要将该组件变成一个单体,并实现从列表中添加和删除组件的功能,并显式地调用这些功能