learn-unity

learn-unity 

Наша жизнь игра, и мы её программисты

2subscribers

20posts

goals1
0 of 10 paid subscribers
Если наберем 10 подписчиков, значит мы нужны, значит мы важны...

Работа с физикой

О чем ты узнаешь из видео:
✅ как создать движение игрового объекта используя физику     
                написание скрипта
                оптимизация скрипта
✅ Как делать отключение поворота
На прошлом уроке, мы сделали так, что игрок может сталкиваться с препятствием, но при столкновении он ведет себя странно: он двигается то в одну сторону, то в другую. Более того, если мы увеличим скорость в окне Inspector, подергиваний будет еще больше. Почему так?
Скрипт написан так, что мы работаем с позицией игрового объекта на прямую: мы говорим на какой позиции должен быть объект в конкретный момент времени. Когда объект, на котором висит данный скрипт, не имеет физику, такое решение норм. Но как только объект начинает иметь компонент Rigidbody2D такое решение не уместно, так как за позицию игрового объекта теперь отвечает компонент физики, и теперь именно он говорит нашей позиции где ему находиться.
И колебания в игровом режиме являются следствием конфликта скрипта и компонента физики. Ведь скрипт говорит одну позицию, а физика говорит что объекта на этой позиции быть не может и дает ему другую позицию. И так каждый раз.
Чтобы решить данную проблему, надо реализовать движения объекта через физику.
Написание скрипта
Итак, откроем вчерашний скрипт изменения позиции игрового объекта используя оси. Удалим строку изменения позиции.
Для того чтобы работать с компонентом, Rigidbody2D следует его получить у объекта.
Думаю все помнят, что компонент transform мы не получаем, а обращаемся напрямую, так как он есть абсолютно у каждого объекта.
Однако с компонентом Rigidbody2D такое обращение не получится, так как нет гарантии того что в игре будет присутствовать физика.
Для получения Rigidbody2D, следует вызвать метод GetComponent, дальше, в треугольных скобочках, нужно написать интересующий класс (в текущем контексте это класс Rigidbody2D) и, после треугольных скобок, нужно написать круглые скобочки. Готово.
В будущем, если нам понадобиться получить какой-либо компонент у любого объекта мы так же будем использовать данный метод, просто указывая другие компоненты.
Для обращения к методам и свойствам этого компонента следует, как и с tranfrom'om поставить точку и получить нужный член класса. Компонент физики имеет поле velocity (скорость). Именно это значение мы и будем менять. Обратимся к нему, а затем укажем знак равенства.
Свойство velocity является вектором 2. В качестве значения следует указать вектор движения. В текущем контексте, это и будут переменные moveX и moveY.
Внезапно: если мы сохраним скрипт (Ctr + Shift + S), то при запуске проекта и нажатии на нужные клавиши, объект будет стоять на месте! Дело в том, что скорость перемещения в скрипте домножается на переменную deltaTime в классе Time, чего делать в текущем контексте не стоит. Поэтому домножение на Time.deltaTime стоит убрать.
После сохранения скрипта и запуска проекта в игровом режиме, объект будет двигаться, а столкновения с объектами будут без колебаний.
Оптимизация скрипа
Оптимизация скрипта
Теперь, давайте, как настоящие программисты, "приберем" скрипт, так как получать один и тот же копонент каждый кадр, просто не разумно. Лучше получить этот компонент один раз и постоянно работать с уже полученной ссылкой.
Для этого, сделаем приватное поле типа Rigidbody2D (приватным оно должно быть для того чтобы его не было видно в инспекторе) называем его через нижнее подчеркивание. Это делать не обязательно, однако на текущий момент это самый популярный стиль обозначения приватных переменных.
Обращение к ГУРУ программистам: На этом этапе инкапсуляция не рассматривается именно поэтому скрытия поля в инспекторе и является главное причиной. Инкапсуляция будет рассмотрена в будущем, на живых примерах
После объявления этого поля его значение, по умолчанию, будет равно Null (то есть ничему). Чтобы поле было равно компоненту Rigidbody на объекте, следует его получить в методе Start. Для этого объявляем данный метод и в нем приравниваем поле к методу получения компонента (мы получим компонент Rigidbody2D).
И, как и планировалось, после этих манипуляций в игровом режиме ничего не поменяется, так как изменения не касаются самой логики проекта.
Отключение поворота
Настройки, которые позволяются заморозить перемещение или вращение объекта, находятся в опции Constrains. В Rigidbody2D мы может отключить движение только по двум осям - х и у, а поворот только по оси Z. Почему объект вращается именно по оси Z, вы узнаете позже. Оставайтесь с нами.
Если поставить галочку Freeze Rotation по оси Z, то при столкновении объекта с другим, двигаемый объект будет игнорировать вращение. Готово.
Домашние задание
Сделать игру "лабиринт", в которой игрок должен достичь красного квадрата. Пример готового задания, вы можете глянуть в видосе.
Если вдруг вы не знаете как сделать упражнение или у вас возникнет проблема - можно найти проект с готовым решением по ссылке в описании.
А на этом, урок подошел к концу, пожалуйста не забудьте оценить этот урок лайком и подписаться.
Subscription levels2

На еду и коммуналку

$0.65 per month
Просто для тех, кто не безразличен к благодарности за контент. Мы делаем мы стараемся,Ю и, если это кому-то нужно, то welcome.

Для любителей по-глубже

$1.29 per month
Тут будет эксклюзив для тех, кто хочет углубится в изучение UNITY. А вдруг есть им такие тут?))
Go up