Другие языки программирования и технологии

Объясните, как работает GetComponent и FindObjectOfType в юнити C#

Не могу понять как они работают и зачем они нужны, я только начал учить юнити
FindObjectOfType - это тебе не нужно. Для начала лучше бы изучил компоненты, которые предоставляет юнити и переменные. Структура юнити заключается в компонентах. То есть допустим компонент - это Boxcollider например или Rigidbody. Это примеры компонентов. GetComponent - это способ получения компонента. Допустим когда нужно сделать прыжок для игрока - необходимо провести манипуляции с физикой. За физику отвечает компонент Rigidbody. То есть после объявления класса - объявляем все переменные и компоненты (можно даже оставлять ссылки на класс), public Rigidbody rb; где Rigidbody - компонент, rb - краткое название для удобства. Теперь компонент объявляет, но он не существует, для этого был придуман GetComponent. в первичной инициализации, то есть в функции void Start получаешь наш компонент для работы с ним. Я как человек с 4ех летним опытом - советую в качестве первичной инициализации использовать void Awake. Первичная инициализация - это выполнение условий функции при запуске сцены, выполняется один раз в первом кадре. Пишем в одной из функций получение нашего компонента: rb = GetComponent<Риджитбади (только на английском пиши, просто на мейле ошибка с этим>(); таким образом мы получили наш компонент отвечающий за физику, GetComponent - это получение компонента того объекта, на котором находится скрипт. Для получения других компонентов - нужно использовать GameObject.Find("название объекта").GetComponent<компонент>() или можно получить компонент по тегу. Таким образом продолжаем создавать прыжок, мы получили наш компонент Rigidbody, теперь воспользуемся один из его параметров. В покадровой проверки void Update, но я вам советую использовать для таких целей FixedUpdate - потому что он в основном предназначен для реализации физики. В данной функции пишем логику нашего прыжка:

if (Input.GetKeyDown(KeyCode.space))
{
rb.AddForce(переменная силы прыжка, флот значение прыжка);
}

Если нажат пробел, то игрок прыгает! Вот настолько это просто. Очень просто. Компонентом считается любой скрипт, то есть вы можете написать скрипт и использовать его переменные в другом скрипте с помощью модификаторов доступа. Причём это не статья, а мой профессионализм.
СЗ
Сергей Здоровых
370
Лучший ответ
Galymzhan Kaldarbekov спасибо большое)
GetComponent - просто обращение к компоненту в объекте. Можно указать GetComponent<А>(), чтобы указать, что нам нужен именно компонент типа А.
В C# объект выглядит так:
-объект
--Свойство1
--Свойство2
...
--Свойство3

А в Unity объект выглядит так:
-Объект
--Компонент1
---Свойство1
---Свойство2
...
---Свойство3
--Компонент2
---Свойство1
---Свойство2
...

И в Unity изменение переменной объекта выглядит так:
Объект. GetComponent<Компонент>().Свойство = значение;

Скрипт Monobehaviour - это тоже компонент. Если надо изменить свойство в том же объекте со скриптом, можно упростить:
gameObject.GetComponent<Компонент>().Свойство = значение;
или даже:
GetComponent<Компонент>().Свойство = значение;

Если надо часто обращаться к какому-то компоненту, лучше его кешировать:
public a;
void Start()
{
a = GetComponent<Компонент>();
}
и тогда можно обращаться на прямую:
a.свойство = значение;

С компонентами всё просто.

FindObjectOfType и всё, что связано с Find использовать не нужно. Это, конечно, простая и полезная функция, но когда у тебя будет 10000 объектов на сцене, то всё, что связано с Find, даёт тормоза, потому что просматривает каждый объект и каждый компонент. Эти функции использовать только в особых на то случаях.
Galymzhan Kaldarbekov спасибо большое