GameObject.FindObjectOfType<>()vs GetComponent<>()

时间:2015-05-18 18:53:31

标签: c# unity3d gameobject

我一直在关注几个教程系列并且已经看到这两个系列以非常相似的方式使用,并且希望有人可以解释它们之间的区别,如果可能的话,还可以举例说明何时使用一个而不是另一个(假设它们实际上是相似的!)。

private LevelManager levelManager;

void Start () {
    levelManager = GameObject.FindObjectOfType<LevelManager>();
}

private LevelManager levelManager;

void Start () {
    levelManager = GetComponent<LevelManager>();
}

2 个答案:

答案 0 :(得分:11)

您不想使用

void Start () {
    levelManager = GameObject.FindObjectOfType<LevelManager>();
}
经常这样。特别是start

要回答你的问题,这两个功能实际上并不是很相似。一个是外部呼叫,另一个是内部呼叫 那么区别是什么?

  1. GameObject.FindObjectOfType更像是一个场景搜索,并不是获得答案的最佳方式。实际上,Unity公开表示它超级慢Unity3D API Reference - FindObjectOfType

  2. GetComponent<LevelManager>();是本地电话。意味着进行此调用的任何文件只会搜索它所附加的GameObject。因此,在检查器中,文件将仅搜索同一检查器窗口中的其他内容。如Mesh Renderer,Mesh Filter等等。或者说是对象的孩子。不过,我相信还有一个单独的呼吁 此外,如果您首先引用其他GameObject组件,则可以使用它来访问它们(如下所示)。

  3. 分辨率:

    我建议您在tag功能中进行awake搜索。

    private LevelManager levelManager;
    
    void Awake () {
        levelManager = GameObject.FindGameObjectWithTag ("manager").GetComponent<LevelManager>();
    }
    

    不要忘记通过添加标记来标记GameObject上的脚本LevelManager。 (单击GameObject,查看检查器顶部,然后单击Tag-&gt; Add Tag

    你可以这样做,或者做

    public LevelManager levelManager;
    

    将GameObject拖到检查器中的框中。

    任何一个选项都明显优于执行GameObject.FindObjectOfType

    希望这有帮助

答案 1 :(得分:5)

有两点不同:

1。)$(window).load()只有在附加到同一个GameObject时才会找到它。另一方面,GetComponent<T>搜索整个层次结构并返回匹配的第一个对象!

2。)GameObject.FindObjectOfType<T>只返回一个继承自GetComponent<T>的对象,而Component并不真正关心。