46.17M

3. Перемещение игрока и турели

1.

Повтор
На прошлом уроке мы
⮚ Создали скрипт, который
создаёт врагов
⮚ Создали скрипт, который
перемещает врагов
⮚ Создали скрипт, который
позволяет врагу стрелять

2.

Сегодня на уроке…
⮚ Мы немного поговорим об
оптимизации игры
⮚ Добавим бэкграунд
⮚ Добавим эффект
движения нашего игрока
⮚ Добавим турели

3.

Оптимизация
А начнём мы с вами с конца
предыдущего урока, а именно с
проблемы: наши враги бесконечно
появляются, постоянно создают
пули, и не исчезают из игры
Такое большое количество
объектов будет сильно нагружать
компьютер/смартфон игрока, из-за
чего больше пяти минут ему не
поиграть

4.

Оптимизация
Мы можем поступить двумя
методами:
⮚ Удалять пули и врагов через
какое-то время с помощью
таймера
Время жизни:
10 секунд
Время жизни:
5 секунд

5.

Оптимизация
Мы можем поступить двумя
методами:
Время жизни:
10 секунд
Время жизни:
5 секунд
⮚ Удалять пули и врагов через
какое-то время с помощью
таймера
⮚ Поставить за пределы камеры
объект, который их будет удалять
Как вы думаете, какой из них
меньше будет нагружать игру?
Удаляет
врагов и пули

6.

Оптимизация
Если мы будем создавать
отдельный таймер для каждого
врага и пули, мы будем нагружать
систему больше, нежели если
создадим всего лишь один объект,
который будет удалять все
самостоятельно
Конечно, от таймеров наша игра не
стала бы зависать, но всё же мы
выберем более лучший вариант
Время жизни:
10 секунд
Время жизни:
5 секунд
Удаляет
врагов и пули

7.

Оптимизация
Добавьте обычный
прямоугольник на сцену

8.

Оптимизация
Добавьте обычный
прямоугольник на сцену
Наша стенка должна удалять
все объекты, которые её
коснуться. Будь то
триггер/коллайдер и не
важно какой тег, мы должны
удалять все объекты

9.

Оптимизация
Для определения касания двух
объектов у нас есть две функции,
помните их?

10.

Оптимизация
Для того, чтобы наша стенка
удаляла все объекты, мы будем
использовать функцию
OnTriggerEnter2D
Но для начала давайте настроим
саму стенку

11.

Оптимизация
⮚ Стена должна быть триггером
⮚ Стена должна иметь Rigidbody2D
чтобы проверять касания
⮚ На стене должна быть убрана
гравитация, чтобы она не падала
⮚ На стене должны быть заблокированы
перемещения и вращения, чтобы
корабли не сбивали наш объект
Выполните все эти условия, для
продолжения

12.

Далее создаём
скрипт для стены
DestroyWall

13.

Просто удаляем
любые объекты
при касании

14.

Оптимизация
Добавьте нашей стене скрипт и
проверьте, всё ли работает
Распространённые ошибки:
⮚ Если пули и враги проходят сквозь
стенку, значит вы неправильно её
настроили, или не передали ей скрипт
DestroyWall
⮚ Если стенка в начале игры исчезает, то
возможно вы создали несколько
стенок, которые касаются друг друга и
удаляют себя

15.

Перемещение
Самое время создать скрипт для
перемещения игрока
Взгляните на картинку справа:
корабль игрока перемещается по
космосу.

16.

Перемещение
Самое время создать скрипт для
перемещения игрока
Взгляните на картинку справа:
корабль игрока перемещается по
космосу.
По крайней мере нам так
кажется, а на самом деле, игрок
стоит на месте в то время, как
картинка позади перемещается

17.

Перемещение
Порой, нам проще заставить двигаться
окружение игрока, вместо его самого
В некоторых гонках, платформерах на
перемещение и подобных аркадах
камера стоит на месте, в то время, как
окружение постоянно движется
Иногда это делается для удобства, а
иногда для оптимизации игры
Мы воспользуемся этой механикой, так
как нам удобнее с ней будет работать
далее

18.

Перемещение
Для начала давайте скачаем
фоновую картинку для нашей
игры
Мы советуем попробовать
скачать ассет, указанный
справа. В нём качественные
фоны, которые можно будет
растянуть без потери качества

19.

Перемещение
Если вы скачали картинку,
добавьте её на сцену,
установите отрицательный
Order In Layer, чтобы он был
позади всех элементов и
растяните, как показано правее
Фон на картинке называется
«бесшовным». Края такого
фона образуют бесшовную
картинку и его можно
бесконечно растягивать без
потери качества

20.

Создайте скрипт и назовите
его GameSession
Этот скрипт будет отвечать
за перемещение фона, а
также за всё, что касается
игрового процесса

21.

Скрипт GameSession будет очень
похож на движение пули, однако
мы также добавим переменную
isMoving, при выключении
которой наш фон остановится
В последующих уроках мы воспользуемся
возможностью останавливать фон, но пока
просто добавим такую возможность на
будущее

22.

Перемещение
Передайте скрипт вашей
фоновой картинке и
проверьте, перемещается ли
он

23.

Самостоятельная работа
Передайте скрипт вашей
фоновой картинке и проверьте,
перемещается ли он
Самостоятельно добавьте на
этот фон сторонние объекты
(например стены, или
метеориты) тем самым
разнообразив и усложнив ваш
игровой уровень
Не забудьте создать скрипт, для
уничтожения игрока, если тот
врежется в стену!

24.

Турели
Стены, которые мы создали
отлично подходят для
размещения турелей
Турели в нашем случае будут
статичны, находится на стенах и
стрелять в нашего игрока
Как вы думаете, сможем ли мы с
текущими скриптами реализовать
такого противника?

25.

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

26.

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

27.

Для начала давайте
создадим турель, а
также добавим ей
Collider и Rigidbody2D
Не забудьте убрать
гравитацию врагу, а если
стены будут его выталкивать,
то заморозьте его позицию по
всем осям
(Freeze position и rotation)

28.

Далее, добавьте
прямоугольник,
который будет нашей
зоной,
отслеживающей
игрока
Сделайте эту зону триггером, а
также поставьте
полупрозрачный цвет, чтобы
нам было удобно с ней
работать (Как закончим с
уровнем, нужно будет сделать
полностью прозрачным)
Этот ползунок отвечает
за прозрачность

29.

Турели
Принцип турели будет следующий:
На нашем триггере-зоне будет
скрипт TriggerZone, который будет
отслеживать, рядом ли игрок
На турели будет скрипт Tower
который будет постоянно проверять
работу TriggerZone и активировать
стрельбу только тогда, когда игрок
рядом
Создайте оба скрипта

30.

По умолчанию false –
игрока рядом нет
При входе в триггер
При выходе из триггера
Скрипт TriggerZone
предельно прост
У нас есть
переменная
isPlayerNear, которая
true становится при
входе игрока в
триггер, и меняется
на false когда игрок
из неё выходит
Для правильной работы не
забываем проверять объекты
на тег, иначе турель будет
срабатывать при касании с
другими объектами

31.

Скрипт Tower похож на
EnemyShoot, но логика
стрельбы отличается

32.

Вместо бесконечной стрельбы (как у вражеских
кораблей) мы стреляем только тогда, когда
выполнены 2 условия: турель готова стрелять и
игрок рядом (узнаём из скрипта TriggerZone)
Во время выстрела мы сразу же ставим орудие
(переменной isReadyShoot) на перезарядку,
создаём пулю, ждём время перезарядки и вновь
передаём, что орудие перезарядилось

33.

Следуйте инструкции
Вложите зону в турель (для
удобства), а затем их вместе в
бэкграунд (чтобы они
перемещались с фоном)
В триггер-зону (триггер, который
должен определять игрока)
добавьте скрипт TriggerZone
Настраивать его не нужно
В турель добавьте скрипт Tower
Перетащите в его настройки
префаб пули, а также триггер-зону
в соответствующие поля (зону
перетащите прямо из окна
иерархии (Hierarchy))

34.

Турель
Запустите игру и проверьте,
правильно ли функционирует турель
> Стреляет ли противник, когда мы
заходим в зону атаки?
> Перестаёт ли он стрелять, когда мы
её покидаем?
> Можно ли уничтожить турель?
Если ответы на все эти вопросы «да»,
то вы отлично справились на
сегодня!

35.

Турель
К сожалению, сделать так, чтобы
турель стреляла прямо в игрока
будет проблематично
Команда, которая будет
поворачивать пули в игрока очень
сложная, ведь там присутствуют
термины и формулы из курса
геометрии за 11 класс и старше
Мы советуем набраться терпения и
оставить всё как есть

36.

Дополнительное задание
С технической частью мы с
вами разобрались
Самое время поработать над
визуалом и над уровнем в
целом
Украсьте свою игру, добавьте
спрайты стен, создайте
метеориты, которые будут
мешать игроку и конечно же
проработайте полностью ваш
уровень, чтобы он не
проходился за 10 секунд!
Можете добавить пост-обработку, если
не забыли как это делается
English     Русский Правила