我一直在关注几个教程系列并且已经看到这两个系列以非常相似的方式使用,并且希望有人可以解释它们之间的区别,如果可能的话,还可以举例说明何时使用一个而不是另一个(假设它们实际上是相似的!)。
private LevelManager levelManager;
void Start () {
levelManager = GameObject.FindObjectOfType<LevelManager>();
}
和
private LevelManager levelManager;
void Start () {
levelManager = GetComponent<LevelManager>();
}
答案 0 :(得分:11)
您不想使用
void Start () {
levelManager = GameObject.FindObjectOfType<LevelManager>();
}
经常这样。特别是start
要回答你的问题,这两个功能实际上并不是很相似。一个是外部呼叫,另一个是内部呼叫 那么区别是什么?
GameObject.FindObjectOfType
更像是一个场景搜索,并不是获得答案的最佳方式。实际上,Unity公开表示它超级慢Unity3D API Reference - FindObjectOfType
GetComponent<LevelManager>();
是本地电话。意味着进行此调用的任何文件只会搜索它所附加的GameObject。因此,在检查器中,文件将仅搜索同一检查器窗口中的其他内容。如Mesh Renderer,Mesh Filter等等。或者说是对象的孩子。不过,我相信还有一个单独的呼吁
此外,如果您首先引用其他GameObject组件,则可以使用它来访问它们(如下所示)。
我建议您在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
并不真正关心。