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
但要回答你的问题,这两个函数实际上并不是很相似。 一个是外部呼叫,另一个是内部呼叫。
那有什么区别?
-
GameObject.FindObjectOfType
更像是一个场景搜索,并不是获得答案的最佳方式。 实际上,Unity公开表示其超级慢的Unity3D API参考 – FindObjectOfType -
GetComponent
是本地电话。 意味着任何文件进行此调用只会搜索它所附加的GameObject。 因此,在检查器中,该文件将仅搜索同一检查器窗口中的其他内容。 例如Mesh Renderer,Mesh Filter等等。或者那些对象的孩子。 不过,我相信还有一个单独的呼吁。();
此外,如果您首先引用它们,您可以使用它来访问其他GameObject的组件(如下所示)。
解析度:
我建议在awake
function中进行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
并不真正关心。
- 如何在Entity Framework中使用’In’SQL关键字?
- new()约束对类定义有什么作用?
- 一组双打的Akima插值
- 对F#度量单位的反思
- 使用未分配的局部变量’multidimension’
- CompositeCollection + CollectionContainer:将CollectionContainer.Collection绑定到ViewModel的属性,该属性用作DataTemplates DataType
- 为什么某些字符文字导致Java中的语法错误?
- 如何在C#中使用“where”关键字,具有通用接口和inheritance
- 在WPF应用程序中展开BitmapImage中的canvas/透明背景