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

чтобы ответить на ваш вопрос, хотя эти две функции на самом деле не очень похожи. Один внешний вызов, другой внутренний.
Так в чем же разница?

  1. на GameObject.FindObjectOfType является более широким поиском сцены и не является оптимальным способом получения ответа. На самом деле, Unity публично сказал, что его супер медленный Справочник по API Unity3D - FindObjectOfType

  2. на GetComponent<LevelManager>(); - это местный звонок. Это означает, что любой файл, который делает этот вызов, будет искать только GameObject, к которому он прикреплен. Таким образом, в инспекторе файл будет искать только другие вещи в том же окне инспектора. Как рендерер сетки, фильтр сетки, ЕТК. Или это возражает против детей. Однако я считаю, что для этого есть отдельный призыв.
    Кроме того, вы можете использовать это для доступа к другим компонентам GameObject, если вы ссылаетесь на них сначала (показать ниже).

:

Я бы рекомендовал сделать tag поиска в разделе


есть два отличия:

1.) GetComponent<T> находит компонент, только если он подключен к тому же GameObject. GameObject.FindObjectOfType<T> С другой стороны, ищет всю иерархию и возвращает первый объект, который соответствует!

2.) GetComponent<T> возвращает только объект, который наследует от Component, а GameObject.FindObjectOfType<T> на самом деле не волнует.