(统一)更好地多次复制组件或使其成为公共静态对象?

时间:2018-06-20 04:19:16

标签: unity3d static singleton components public

我发现此代码使对象根据Y位置进行排序,但是我必须将包含代码的脚本复制到地图上基本上所有内容上。对于CPU和/或内存,将方法设为单例并将其放入每个人的Update中会更好吗?

这是排序功能:

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;
}

然后将其放在我需要的Update函数中。

这些选项在CPU或内存负载方面是否有区别?

2 个答案:

答案 0 :(得分:3)

另一个选择是制作扩展方法。这样,您只需通过传入的Transform设置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);

答案 1 :(得分:2)

对于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;
        }
    }
}

很明显,如果需要动态生成和销毁精灵,则需要将该组件变成单例,并实现用于从列表中添加和删除组件的函数,并明确地调用它们。