Jon*_*ert 10 c# unity-game-engine gameobject
我一直在关注几个教程系列,并且已经看到这两个系列以非常相似的方式使用,并且希望有人可以解释它们之间的区别,如果可能的话,还可以举例说明何时使用一个而不是另一个(假设它们实际上是相似的) !).
private LevelManager levelManager;
void Start () {
levelManager = GameObject.FindObjectOfType<LevelManager>();
}
Run Code Online (Sandbox Code Playgroud)
和
private LevelManager levelManager;
void Start () {
levelManager = GetComponent<LevelManager>();
}
Run Code Online (Sandbox Code Playgroud)
iSk*_*ore 15
你不想用
void Start () {
levelManager = GameObject.FindObjectOfType<LevelManager>();
}
Run Code Online (Sandbox Code Playgroud)
那经常.特别是start
但要回答你的问题,这两个函数实际上并不是很相似.一个是外部呼叫,另一个是内部呼叫.
那有什么区别?
这GameObject.FindObjectOfType更像是一个场景搜索,并不是获得答案的最佳方式.实际上,Unity公开表示其超级慢的Unity3D API参考 - FindObjectOfType
这GetComponent<LevelManager>();是一个本地电话.意味着进行此调用的任何文件只会搜索它所附加的GameObject.因此,在检查器中,文件将仅搜索同一检查器窗口中的其他内容.如Mesh Renderer,Mesh Filter等等.或者说是对象的孩子.不过,我相信还有一个单独的呼吁.
此外,如果您首先引用它们,您可以使用它来访问其他GameObject的组件(如下所示).
我建议tag在awake函数中进行搜索.
private LevelManager levelManager;
void Awake () {
levelManager = GameObject.FindGameObjectWithTag ("manager").GetComponent<LevelManager>();
}
Run Code Online (Sandbox Code Playgroud)
不要忘记LevelManager通过添加标记来标记带有脚本的GameObject .(单击GameObject,查看检查器的顶部,然后单击Tag-> Add Tag
你可以这样做,或者做到
public LevelManager levelManager;
Run Code Online (Sandbox Code Playgroud)
然后将GameObject拖到检查器中的框中.
任何一个选项都明显优于做一个选项GameObject.FindObjectOfType.
希望这可以帮助
有两点不同:
1.)GetComponent<T>仅在组件附加到同一GameObject时才查找组件.GameObject.FindObjectOfType<T>另一方面,搜索整个层次结构并返回匹配的第一个对象!
2.)GetComponent<T>只返回一个继承自的对象Component,而GameObject.FindObjectOfType<T>不是真正关心的对象.