Другие языки программирования и технологии
Объясните, как работает 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(переменная силы прыжка, флот значение прыжка);
}
Если нажат пробел, то игрок прыгает! Вот настолько это просто. Очень просто. Компонентом считается любой скрипт, то есть вы можете написать скрипт и использовать его переменные в другом скрипте с помощью модификаторов доступа. Причём это не статья, а мой профессионализм.
if (Input.GetKeyDown(KeyCode.space))
{
rb.AddForce(переменная силы прыжка, флот значение прыжка);
}
Если нажат пробел, то игрок прыгает! Вот настолько это просто. Очень просто. Компонентом считается любой скрипт, то есть вы можете написать скрипт и использовать его переменные в другом скрипте с помощью модификаторов доступа. Причём это не статья, а мой профессионализм.
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, даёт тормоза, потому что просматривает каждый объект и каждый компонент. Эти функции использовать только в особых на то случаях.
В 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
спасибо большое
Похожие вопросы
- объясните как работает функция pow в библиотеке glibc
- Объясните как работает программа в паскаль!!!
- Объясните толком как и для чего команда " if "C++
- Прошу объяснить как работает рекурсия в конкретном примере:
- Объясните как работают программы. 2 задачи. Язык с++.
- Делаю нейронную сеть на C++. Как в C++ работать с микрофоном?
- Объясните тему Циклы, а пальцах? C++
- Unity 3D.Как сделать двери в юнити так, что когда подходишь к ним, они автоматически открывались?
- Не загружается юнити эдитор что делать?
- Помогите новичку, объясните разницу между C, C++ И C#. и Посоветуйте книгу/видеоуроки или т. п для обучения основ