36.60M
Категория: ПрограммированиеПрограммирование

Добавление соперников с искусственным интеллектом

1.

Добавление соперников
с искусственным интеллектом
Скачать методичку

2.

Цель урока —
научиться добавлять соперников в гоночные игры.
Сегодня вы:
узнаете, как добавить соперников на любую гоночную трассу;
научитесь реализовывать механики секундомера и сбора
чекпоинтов.
Что такое искусственный интеллект?

3.

Rigidbody, коллайдеры и Physic Material!
Rigidbody — подключает
объект к физической
симуляции.
Вместе они отвечают за столкновения
между объектами и за работу триггеров
Коллайдеры — определяют
границы объекта.
Physic Material — определяет физические
свойства поверхности объекта.
Повторение. Создание препятствий. Физический движок

4.

Чекпоинты вы добавляли на уровень, когда
переносили трассу с карты
Убедитесь, что чекпоинты
расположены внутри
объекта Route в том
порядке, в котором их
должен проходить игрок и
его соперники.
Добавление противников

5.

Скачайте NPC с уже готовыми скриптами
Перейдите в задание «Ассеты для скачивания» текущего урока. Скачайте по
ссылке пакет ассетов, который включает NPC и связанные с ним файлы.
Разработчики, которые работают в одиночку, часто используют уже готовые ассеты,
которые затем настраивают под свой проект.
Добавление противников

6.

Добавьте на сцену префаб CarWaypointBased
Изучите составляющие объекта
CarWaypointBased. Как поменять
внешний вид объекта, чтобы он
походил на Prometheus?
Добавление противников

7.

Достаточно поменять каркас и материал
основного корпуса и колёс
Измените указанные объекты. За каркас отвечает
компонент Mesh Filter, а за материал — Mesh Renderer.
Материал одинаковый для всех объектов — PCC_Col_Mat.
Основной каркас — Body, каркас для каждого колеса свой
— FrontLeftWheel, RearLeftWheel и т. д.
Добавление противников

8.

Отключите ненужные детали, чтобы они
не портили вид автомобиля
Добавление противников

9.

Поправьте расположение колёс:
их визуальное отображение и коллайдеры
Если вместе с отображением не поправить коллайдеры, то при запуске игры
колёса будут неестественно торчать из-под автомобиля.
Коллайдеры колёс
Визуальное отображение колёс
Добавление противников
Координаты размещения
отображения и коллайдеров вы
можете скопировать из объекта
Prometheus.

10.

Если при запуске игры корпус автомобиля
неестественно нависает над колёсами,
поправьте высоту коллайдеров колёс
Добавление противников

11.

Чтобы вам не мешали иконки, отключите их
На GIF-анимации отключили
отображение иконок источника
звука, так как они перекрывают
линии коллайдера колёс.
Чтобы вернуть иконки обратно,
просто повторно нажмите на них.
Добавление противников

12.

Настройте отображение маршрута для NPC
Добавьте к объекту Route скрипт Waypoint Circuit — он соберёт информацию
о всех чекпоинтах и на основе этих данных нарисует маршрут.
1
2
3
С помощью стрелок
расположите чекпоинты
в нужном порядке
Добавление противников
Для добавления всех
чекпоинтов к маршруту
NPC нажмите на кнопку
Assign using all child objects

13.

Дайте NPC информацию о маршруте
Найдите у NPC компонент Waypoint Progress Tracker и передайте свойству
Circuit ссылку на объект Route.
На сцене появится жёлтая линия маршрута
NPC. Если вы всё верно сделали, то маршрут
NPC будет совпадать с маршрутом игрока
Добавление противников

14.

Запустите игру и проверьте работу NPC
Заметьте, что NPC не
двигается строго по
маршруту, а чуть
отклоняется от него.
Добавление противников

15.

Вы можете настроить то, как NPC ведёт
себя на поворотах
Во сколько раз уменьшается максимальная
скорость (Topspeed) при повороте*
Пороговое значение угла поворота, при
котором NPC снижает скорость
*Значение максимальной скорости при
повороте рассчитывается следующем
образом: Topspeed * CautiousSpeedFactor
Описание остальных свойств вы можете изучить,
зайдя в скрипт CarAIControl.
Добавление противников

16.

МОДУЛЬ 4. УРОК 4
Новая тема:
Механики секундомера
и сбора чекпоинтов

17.

Чтобы протестировать трассу на время,
нужно включить в игру секундомер
Секундомер будет останавливаться, когда игрок собрал все чекпоинты
и достиг финиша.
Какой будет алгоритм
работы у секундомера?
Почему?
Механики секундомера и сбора чекпоинтов

18.

Алгоритм работы секундомера будет следующим:
public bool hasFinished
float minutes
float seconds
Начало цикла
Update( )
Нет
Увеличить секунды
на Time.deltaTime
Механики секундомера и сбора чекпоинтов
Игрок
достиг
финиша?
Создайте скрипт
Stopwatch и напишите
первую часть кода,
опираясь на алгоритм.

19.

Секунд
больше
или равно
60?
Да
Увеличить минуты
на 1 и уменьшить
секунды на 60
Допишите вторую часть
программы, опираясь
на данный алгоритм.
int m = Mathf.RoundToInt(minutes)
int s = Mathf.RoundToInt(seconds)
Конец цикла
Update( )
Механики секундомера и сбора чекпоинтов
Получившийся скрипт
добавьте к объекту
Prometheus.

20.

Задайте экрану разрешение HD и создайте UIэлемент TextMeshPro для секундомера
Настройте холст так,
чтобы секундомер
всегда располагался по
центру верхней части
экрана
и менял размер вместе
с разрешением экрана.
Для расположения секундомера
подойдёт компонент Vertical
Layout Group
Механики секундомера и сбора чекпоинтов

21.

Настройте размер и тип начертания шрифта
Механики секундомера и сбора чекпоинтов

22.

Дополните скрипт Stopwatch, чтобы он обновлял
значение секундомера на экране
1.
Подключите пространство имён TMPro.
2. Создайте переменную с именем stopwatch, которая будет хранить
ссылку на экземпляр класса TextMeshProUGUI.
3. В конце метода Update( ) присвойте свойству text экземпляра
stopwatch округлённое значение минут и секунд.
Подсказка: используйте для выполнения пункта 3 конкатенацию — «склеивание»
текста и переменных с помощью знака «плюс». Не забудьте поместить двоеточие,
отделяющее минуты от секунд, в двойные кавычки.
Механики секундомера и сбора чекпоинтов

23.

Создайте скрипт RoutePoint — он будет
отслеживать активные чекпоинты на трассе
Механика чекпоинтов следующая:
1.
Игроку обязательно нужно коснуться одного чекпоинта, чтобы на трассе
отобразился следующий.
2. Модель пройденного чекпоинта перестаёт отображаться — отображается
модель только следующего чекпоинта.
Что в таком случае должна проверить программа и в каком порядке?
Механики секундомера и сбора чекпоинтов

24.

С коллайдером
чекпоинта
сталкивался
Игрок?
Как в каждом
из случаев понять,
что условие
выполняется?
Да
Одно условие вкладывается в другое
Чекпоинт
отображается
(активен)
для Игрока?
isActiveForPlayer = false
model.SetActive(false)
Да
Следует ли
за этим
чекпоинтом
другой?
nextPoint.isActiveForPlayer = true
nextPoint.model.SetActive(true)
Механики секундомера и сбора чекпоинтов

25.

С коллайдером
чекпоинта
сталкивался
Игрок?
Сравнить тег объекта,
который столкнулся
с коллайдером чекпоинта,
с тегом Player.
Да
Сравнить значение переменной
isActiveForPlayer с true или просто написать
в круглых скобках isActiveForPlayer.
Чекпоинт
отображается
(активен)
для Игрока?
isActiveForPlayer = false
model.SetActive(false)
Да
Следует ли
за этим
чекпоинтом
другой?
Проверить, что значение
nextPoint не равно null.
nextPoint.isActiveForPlayer = true
nextPoint.model.SetActive(true)
Механики секундомера и сбора чекпоинтов

26.

Допишите программу, опираясь на схему
с прошлого слайда
public class RoutePoint : MonoBehaviour
{
public RoutePoint nextPoint;
public GameObject model;
public bool isActiveForPlayer;
private void OnTriggerEnter(Collider other)
{

}
}
Механики секундомера и сбора чекпоинтов

27.

Добавьте скрипт RoutePoint ко всем
чекпоинтам и финишу
Чтобы быстро добавить скрипт ко всем чекпоинтам, сначала добавьте скрипт
к одному чекпоинту, затем обновите его префаб.
В поле Model добавьте
объект CheckpointModel
первого чекпоинта и снова
обновите префаб.
В поле NextPoint дайте
ссылку на следующий
по порядку чекпоинт (для
финиша он отсутствует).
Механики секундомера и сбора чекпоинтов

28.

Перед тем, как протестировать скрипт
RoutePoint:
1.
Добавьте ко всем чекпоинтам и финишу коллайдер-триггер.
Коллайдер необходимо добавить к родительскому объекту.
2. Назначьте объекту Collider, который вложен в Body автомобиля
Prometheus, тег Player.
3. Отключите у всех чекпоинтов модель и поле Is Active For Player,
кроме первого чекпоинта.
Механики секундомера и сбора чекпоинтов

29.

Создайте скрипт Finish и перепишите
в него программу для финиша
public class Finish : MonoBehaviour
{
public Stopwatch time;
public RoutePoint finishPoint;
}
private void OnTriggerEnter(Collider other)
{
if (finishPoint.isActiveForPlayer)
{
if (other.tag == "Player")
{
time.hasFinished = true;
}
}
}
Механики секундомера и сбора чекпоинтов
Прочитайте программу.
Что она делает?

30.

Она фиксирует момент пересечения финиша
игроком и после этого останавливает секундомер
public class Finish : MonoBehaviour
{
public Stopwatch time;
public RoutePoint finishPoint;
}
private void OnTriggerEnter(Collider other)
{
if (finishPoint.isActiveForPlayer)
{
if (other.tag == "Player")
{
time.hasFinished = true;
}
}
}
Механики секундомера и сбора чекпоинтов
Программа обязательно проверяет,
что для игрока финиш активен.
Если он не активен, значит игрок
проехал не все чекпоинты!
Добавьте скрипт Finish
к одноимённому объекту.
English     Русский Правила