GameObject.FindObjectOfType ()vs GetComponent ()

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

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

 private LevelManager levelManager; void Start () { levelManager = GetComponent(); } 

你不想用

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

那经常。 特别是在start

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

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

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

解析度:

我建议在awakefunction中进行tag搜索。

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

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

你可以这样做,或者做到

 public LevelManager levelManager; 

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

这两个选项都明显优于执行GameObject.FindObjectOfType

希望这可以帮助

有两点不同:

1.) GetComponent仅在组件附加到同一GetComponent查找组件。 另一方面, GameObject.FindObjectOfType搜索整个层次结构并返回匹配的第一个对象!

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