6.11M

Unity M1 L6

1.

Повтор

2.

Повтор
На прошлом уроке мы с вами
создали первое препятствие,
уничтожающее нашего игрока
при касании
Нежелательно

3.

Повтор
Вы помните, как называется
функция, которая проверяет
коллизию (касание) между
двумя объектами?
При коллизии
Удаляем объект
Нежелательно

4.

Повтор
Вы помните, как называется
функция, которая проверяет
коллизию (касание) между
двумя объектами?
Ответ: функция называется
OnCollisionEnter2D
Удаляем объект
Нежелательно

5.

Повтор
Какая функция удаляет
объекты со сцены в Unity?
Удаляем объект
Нежелательно

6.

Повтор
Какая функция удаляет
объекты со сцены в Unity?
Ответ: Функция Destroy()
удалит объект, который мы
укажем в скобках
Нежелательно

7.

Повтор
Для чего нам нужны теги?
Нежелательно

8.

Повтор
Объект
Для чего нам нужны теги?
Ответ: Для того, чтобы Unity
мог отличить один объект от
другого
Тег:
Игрок
Объект
Тег: Монетка
Объект
Тег: Враг

9.

Сегодня мы…
Усовершенствуем наше
препятствие, превратив его
в полноценного врага!
Напишем простенький
Искусственный Интеллект
для врага, чтобы он
патрулировал
определённую местность
С каких
пор оно
движется?

10.

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

11.

Создаём
переменную для
сохранения
скорости
Пишем код в функции
Update, чтобы он
выполнялся постоянно
Перемещаем объект
влево
transform.Translate()
телепортирует нашего
игрока по
направлению,
указанному в скобках

12.

Однако, с такой записью
наш враг просто будет
бесконечно идти влево,

13.

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

14.

Патруль
Для реализации патруля нам
нужно:
1) Враг

15.

Патруль
Левая граница
Для реализации патруля нам
нужно:
1) Враг
2) Левая и правая границы,
за которые враг не
сможет зайти
Правая
граница

16.

Идти влево
Патруль
Для реализации патруля нам
нужно:
1) Враг
2) Левая и правая границы,
за которые враг не
сможет зайти
3) Переменная, которая
будет определять, куда
должен двигаться враг
Идти вправо

17.

Идти влево
Патруль
Для реализации патруля нам
нужно:
Представьте, что наша
1) Враг
переменная как рычаг,
2) Левая и правая границы,
будет
определять, в какую
за которые враг не
сторону
двигаться врагу
сможет зайти
3) Переменная, которая
будет определять, куда
должен двигаться враг
Идти вправо

18.

Идти влево
Патруль
Для реализации патруля нам
нужно:
Представьте, что наша
1) Враг
переменная как рычаг,
2) Левая и правая границы,
будет
определять, в какую
за которые враг не
сторону
двигаться врагу
сможет зайти
3) Переменная, которая
будет определять, куда
должен двигаться враг
Идти вправо

19.

True
Идти влево
False
Идти вправо
Патруль
ДляПредставьте,
реализации патруля
нам
что наша
нужно:
переменная как рычаг,
1)будет
Враг определять, в какую
2) Левая и правая границы,
сторону двигаться врагу
за которые враг не
сможет зайти
3) Переменная,
которая
Наш рычаг
будет
будет определять, куда
переменной bool
должен двигаться враг
Bool – это тип данных
(переменных) которая может
быть True, или False

20.

True
Идти влево
False
Идти вправо
Патруль
ДляПредставьте,
реализации патруля
нам
что наша
нужно:
переменная как рычаг,
1)будет
Враг определять, в какую
2) Левая и правая границы,
сторону двигаться врагу
за которые враг не
сможет зайти
3) Переменная,
которая
Наш рычаг
будет
будет определять, куда
переменной bool
должен двигаться враг
Bool – это тип данных
(переменных) которая может
быть True, или False

21.

True
Патруль
Для реализации патруля нам
нужно:
1) Враг
2) Левая и правая границы,
за которые враг не
сможет зайти
3) Переменная, которая
будет определять, куда
должен двигаться враг
4) Алгоритм, меняющий
движение по условию
False

22.

True
Патруль
Для реализации патруля нам
нужно:
1) Враг
2) Левая и правая границы,
за которые враг не
сможет зайти
3) Переменная, которая
будет определять, куда
должен двигаться враг
4) Алгоритм, меняющий
движение по условию
False
C последним давайте
разберёмся чуть
позже, а пока начнём
с реализации врага и
границ

23.

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

24.

Далее, мы создадим с
вами границы,
которые враг не
сможет покинуть

25.

Далее, мы создадим с
вами границы,
которые враг не
сможет покинуть
В качестве границ
мы будем
использовать пустые
игровые объекты
EmptyObject

26.

Переименуйте созданные
границы, чтобы не
запутаться с ними в будущем
Для переименования либо
А) Выделите объект, а затем
ещё раз щёлкните по нему
ЛКМ, или
Б) Щёлкните ПКМ по
объекту, и выберите пункт
Rename - переименовать

27.

Переименуйте созданные
границы, чтобы не
запутаться с ними в будущем
А лучше, старайтесь
переименовывать все
объекты, с которыми
работаете!
Так намного
понятнее, неправда
ли?
Для переименования либо
А) Выделите объект, а затем
ещё раз щёлкните по нему
ЛКМ, или
Б) Щёлкните ПКМ по
объекту, и выберите пункт
Rename - переименовать

28.

Но есть одна сложность
с работой с пустыми
объектами – их не видно
на сцене

29.

Но выход есть!
Обратите внимание на
эту кнопку

30.

Но выход есть!
Обратите внимание на
эту кнопку

31.

Она поможет нам
выбрать иконку для
объекта.
В игре он также
останется невидимым,
но в редакторе мы
сможем увидеть его

32.

Выберите иконки для
ваших границ и сразу
расставьте их на сцене
(вам поможет
инструмент Move)

33.

Сделали?
Теперь приступим к
сложной части
Создайте скрипт для
врага, под названием
Enemy

34.

Мы будем работать с
функцией Update(),
постоянно проверяя
различные условия

35.

Мы будем работать с
функцией Update(),
постоянно проверяя
различные условия
А вот функцию Start()
вы можете убрать.
Только не
промахнитесь!

36.

Начнём мы с создания
переменных
Не забывайте, что мы
создаём переменные в
теле класса

37.

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

38.

Далее создаём
переменную, в которой
будем хранить
направление движения
врага (наш рычаг)
Назовём переменную goLeft,
для простоты. Если goLeft будет
истиной, то наш враг должен
будет двигаться влево. В
противном случае, вправо.

39.

Сама проверка будет
осуществляться в
функции Update()
Если goLeft истина, то
мы двигаемся влево

40.

Сама проверка будет
осуществляться в
функции Update()
Помните как
реализовать
движение влево?

41.

Мы будем
работать с
С помощью
функцией
Update(),
transform.Translate()
постоянно
проверяя
двигаем врага
влево,
различные
условия
если goLeft
равна
истине
А вот функцию Start()
вы можете убрать.
Только не
промахнитесь!

42.

Ниже приписываем
такую же запись, только
с условием
«если goLeft равна лжи»
Сможете найти
ошибку в нашей
записи?

43.

Если goLeft равно false,
то мы должны двигаться
вправо, а не в лево

44.

Патруль
Теперь, если передать этот
скрипт нашему врагу и в ручную
переключать переменную
goLeft, враг будет перемещаться
согласно нашей настройке.

45.

Патруль
Теперь, если передать этот
скрипт нашему врагу и в ручную
переключать переменную goLeft
враг будет перемещаться
согласно нашей настройке.
Однако, наш враг должен
патрулировать территорию
автоматически.

46.

Патруль
В этом нам помогут наши
границы Left и Right

47.

Патруль
В этом нам помогут наши
границы Left и Right
Если мы получим их
месторасположение по оси
х, и так же х нашего врага, то
мы сможем создать простой
ИИ для патруля
Х=6
Х = 15
Х = 11

48.

Патруль
Логика проста:
Х=6
Х = 15
1) Если х врага меньше, чем
х левой границы, то мы
направим врага вправо
Х=5
Право
руля!

49.

Патруль
Логика проста:
1) Если х врага меньше, чем
х левой границы, то мы
направим врага вправо
2) Если х врага больше, чем
х правой границы, то мы
направим его влево
Х=6
Х = 15
Х = 16
А теперь
влево!

50.

Мы остановились на
этом моменте,
перепроверьте свои
записи

51.

Мы остановились на
этом моменте,
перепроверьте свои
записи

52.

Создаём переменную, в
которой будем хранить
компонент transform
левой границы

53.

Затем, переменную, в
которой будем хранить
компонент transform
правой границы

54.

Далее, для удобства,
давайте прокрутим наш
код чуть ниже, чтобы
чётко видеть функцию
Update()
Начало
Конец

55.

В конце функции
Update() дописываем
следующую проверку:
Если наша позиция по Х
(позиция врага) меньше,
чем позиция по Х левой
границы

56.

В конце функции
Update() дописываем
следующую проверку:
Если наша позиция по Х
(позиция врага) меньше,
чем позиция по Х левой
границы
Как вы думаете, что мы должны
добавить внутрь условия?

57.

Если наша позиция по Х
(позиция врага) меньше,
чем позиция по Х левой
границы,
То мы меняем
направление вправо

58.

Теперь попробуйте
самостоятельно сделать
проверку, перешёл ли
наш враг правую
границу
Будьте внимательны, не
запутайтесь в скобках { }

59.

Вот так должна
выглядеть проверка для
правой границы
Обратите внимание, что
если мы пересекли правую
границу, то значение
переменной goLeft нужно
переключить в True, чтобы
двинуться влево

60.

Всё что нам остаётся, это
дать значение нашим
новым переменным и
запустить

61.

Если вы всё сделали
правильно, то ваш противник
должен без проблем
патрулировать заданную
территорию
А если нет, то обратитесь к
наставнику

62.

Теперь, когда у нас есть
полноценный враг, по
хорошему нам нужно
сохранить его в префаб

63.

Теперь, когда у нас есть
полноценный враг, по
хорошему нам нужно
сохранить его в префаб
Однако сделать это
проблематично, так как у нас
целых 3 объекта:
1) Враг
2) Левая граница
3) Правая граница
И по отдельности их
добавлять в разные
префабы нет смысла

64.

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

65.

Разместите экран сцены
так, чтобы враг был ровно в
центре окна сцены

66.

Создайте пустой объект

67.

Переименуйте пустой
объект в «EnemyObject» и
переместите все элементы
нашего врага в этот объект

68.

Теперь этот объект
EnemyObject можно
сохранить в качестве
префаба, и использовать
множество раз и на других
сценах

69.

Дополнительное задание
Сможете ли вы обладая
текущими знаниями
самостоятельно сделать врага,
который будет перемещаться
вертикально (вверх-вниз)?
Попробуйте, это не так сложно!
Интересно, а на
нём можно
прокатиться, как
на лифте?

70.

Дополнительное задание
1) Добавьте в игру монетки
1) Cоздайте отдельный скрипт
для игрока (можете назвать
его Inventory), чтобы при
касании монеток, монетки
удалялись (будто игрок
подбирает их)
English     Русский Правила