GameObject.FindObjectOfType () vs GetComponent()
Я следил за несколькими сериями учебников и видел, что эти два используются очень похожими способами, и надеялся, что кто-то может объяснить, как они отличаются и, если возможно, примеры того, когда вы будете использовать один вместо другого (предполагая, что они на самом деле похожи!).
private LevelManager levelManager;
void Start () {
levelManager = GameObject.FindObjectOfType<LevelManager>();
}
и
private LevelManager levelManager;
void Start () {
levelManager = GetComponent<LevelManager>();
}
2 ответов
вы не хотите использовать
void Start () {
levelManager = GameObject.FindObjectOfType<LevelManager>();
}
что часто. В частности, о start
чтобы ответить на ваш вопрос, хотя эти две функции на самом деле не очень похожи. Один внешний вызов, другой внутренний.
Так в чем же разница?
на
GameObject.FindObjectOfType
является более широким поиском сцены и не является оптимальным способом получения ответа. На самом деле, Unity публично сказал, что его супер медленный Справочник по API Unity3D - FindObjectOfTypeна
GetComponent<LevelManager>();
- это местный звонок. Это означает, что любой файл, который делает этот вызов, будет искать только GameObject, к которому он прикреплен. Таким образом, в инспекторе файл будет искать только другие вещи в том же окне инспектора. Как рендерер сетки, фильтр сетки, ЕТК. Или это возражает против детей. Однако я считаю, что для этого есть отдельный призыв.
Кроме того, вы можете использовать это для доступа к другим компонентам GameObject, если вы ссылаетесь на них сначала (показать ниже).
Я бы рекомендовал сделать tag
поиска в разделе
есть два отличия:
1.) GetComponent<T>
находит компонент, только если он подключен к тому же GameObject. GameObject.FindObjectOfType<T>
С другой стороны, ищет всю иерархию и возвращает первый объект, который соответствует!
2.) GetComponent<T>
возвращает только объект, который наследует от Component
, а GameObject.FindObjectOfType<T>
на самом деле не волнует.