Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопросы и ответы к экзамену.docx
Скачиваний:
29
Добавлен:
21.06.2022
Размер:
16.83 Mб
Скачать

6. Размещение объектов на трехмерной сцене. Понятие GameObject. Масштабирование объектов.

Итак, начнем с создания объектов и размещения их в сцене. Первыми будут статические объекты — пол и стены. Затем выберем место для источников света и камеры. Последним создадим игрока — это будет объект, к которому вы добавите сценарии, перемещающие его по сцене. Рисунок 2.5 демонстрирует вид редактора после завершения работы.

В расположенном в верхней части экрана меню GameObject наведите указатель мыши на строчку 3D Object, чтобы открыть дополнительное меню. Выберите в нем вариант Cube, так как для нашей сцены требуется куб (позднее вы поработаете и с другими фигурами, такими как Sphere и Capsule). Отредактируйте положение и масштаб появившегося в сцене куба, а также его имя таким образом, чтобы получить пол; значения, которые следует присвоить параметрам этого объекта на панели Inspector, показаны на рис. 2.6 (для превращения куба в пол его нужно растянуть).

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

Все объекты сцены представляют собой экземпляры класса GameObject аналогично тому, как все компоненты сценариев наследуют от класса MonoBehaviour. Этот факт становится более наглядным, если пустому объекту присвоить имя GameObject. Впрочем, даже если этот объект будет называться Floor, Camera или Player, суть дела не изменится.

На самом деле GameObject представляет собой всего лишь контейнер для набора компонентов. Его основным назначением является обеспечение некоего объекта, к которому можно присоединять класс MonoBehaviour. Как все это будет выглядеть в сцене, зависит от добавленных к объекту GameObject компонентов. К примеру, куб получается добавлением компонента Cube, сфера — добавлением компонента Sphere и т. п.

7. Источники света и камеры. Типы осветителей. Коллайдер, типы коллайдеров и точка наблюдения игрока в проекте fps.

Как правило, трехмерные сцены освещаются направленным источником света, к которому добавляется набор точечных осветителей. Начать имеет смысл с направленного источника. Он может по умолчанию присутствовать в сцене, но если его нет, наведите указатель мыши на строку Light в меню GameObject и в открывшемся дополнительном меню выберите вариант Directional Light.

Существуют различные типы осветителей, разными способами проецирующие световые лучи. Три основных типа:

  • точечный источник,

  • прожектор

  • и направленный источник.

Все лучи точечного источника (point light) начинаются в одной точке и распространяются во всех направлениях. В реальном мире таким осветителем является лампочка. Яркость света увеличивается по мере приближения к источнику за счет концентрации лучей. Лучи прожектора (spot light) также исходят из одной точки, но распространяются в пределах ограниченного конуса. В текущем проекте мы с прожекторами работать не будем, но осветители данного типа повсеместно используются для подсвечивания отдельных частей уровня.

Лучи направленного источника света (directional light) распространяются равномерно и параллельно друг другу, одинаково освещая все элементы сцены. Это аналог солнца.

Испускаемый направленным осветителем свет не зависит от местоположения источника, значение имеет только его ориентация, поэтому его можно поместить в произвольную точку сцены.

На панели Inspector вы найдете параметр Intensity (рис. 2.8). Как следует из его названия, он управляет яркостью света. Если бы данный направленный осветитель был в сцене единственным, его яркость имело бы смысл увеличить, но, так как мы добавим несколько точечных источников света, его можно оставить тусклым.

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

Обратите внимание, что у точечных источников света на панели Inspector появляется дополнительный параметр Range. Он управляет дальностью распространения лучей. Если направленный источник света равномерно освещает всю сцену, то яркость точечного источника уменьшается по мере удаления от него. Поэтому для стоящего на полу источника этот параметр может быть равен 18, а для поднятого к верхней кромке стены его необходимо увеличить до 40, иначе он не сможет осветить всю комнату.

Чтобы игрок мог наблюдать за происходящим, требуется еще один тип объекта — камера. Впрочем, пустая сцена содержит основную камеру, которой мы можем воспользоваться. Если вам когда-нибудь потребуется создать дополнительные камеры (например, для разделения экрана в многопользовательских играх), выберите команду Camera в меню GameObject. Нашу же камеру мы расположим поверх игрока, чтобы наблюдать сцену его глазами.

В этом проекте игрока будет представлять обычный примитив. В меню GameObject выберите вариант Capsule. Появится цилиндрическая фигура со скругленными концами — это и есть наш игрок. Теперь наш игрок может произвольным образом перемещаться вдоль осей X и Z при условии, что он остается внутри комнаты и не касается стен. Присвойте объекту имя Player. На панели Inspector вы увидите, что этому объекту назначен капсульный коллайдер. Это очевидный вариант для объекта Capsule, точно так же, как объект Cube по умолчанию обладает коллайдером Box. Но так как наша капсула будет представлять игрока, ее компоненты должны слегка отличаться от компонентов большинства объектов.

Капсульный коллайдер мы удалим. Коллайдер выглядит как окружающая объект зеленая сетка, поэтому после удаления компонента вы обнаружите, что она исчезла. Вместо капсульного коллайдера мы назначим объекту контроллер персонажа. В нижней части панели Inspector вы найдете кнопку Add Component. Щелчок на ней открывает меню с перечнем типов доступных компонентов. В разделе Physics и находится нужная нам строка Character Controller. Как несложно догадаться, именно этот компонент позволит объекту вести себя как персонаж.

Для завершения настройки игрока осталось сделать всего один шаг — присоединить к нему камеру.

8. Схема программирования движения. Скрипт, реализующий движение объекта вперед, влево-вправо и вверх-вниз по курсору мыши. Реакция на нажатие клавиш. Независимая от скорости работы компьютера скорость перемещений. Локальные и глобальные координаты

9. Компонент CharacterController для распознавания столкновений. Пример кода сценария. Применение силы тяжести.

10. Стрельба с использованием raycasting. В чем состоит суть метода? Команда ScreenPointToRay. Сценарий, реализующий суть этого метода.

11. Добавление визуальных индикаторов для прицеливания и попаданий. Понятие сопрограмм.

12. Понятие активной цели. Распознавание активной цели и ее уведомление о попадании. Уничтожение цели. Сценарий, реализующий суть этих методов.

13. Базовый искусственный интеллект для перемещения по сцене: Диаграмма работы, «поиск» препятствий методом бросания лучей, слежение за состоянием персонажа. Сценарий, реализующий суть этого метода.

3.3.1. Диаграмма работы базового искусственного интеллекта

Существует множество подходов к реализации искусственного интеллекта (это одна из основных областей исследований ученых, работающих в области теории вычислительных машин и систем), но для наших целей подойдет достаточно простой вариант. По мере накопления опыта и усложнения создаваемых вами игр вы, скорее всего, за­хотите познакомиться с другими способами реализации AI. Но пока мы ограничимся процессом, показанным на рис. 3.5.

Рис. 3.5. Базовый искусственный интеллект: циклический процесс движения вперед с обходом препятствий

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

Сам код будет иметь знакомый вам вид, так как движение врагов вызывают те же команды, что и движение игрока. Кроме того, в коде вы снова увидите метод бросания луча, но уже в другом контексте.

В листинге появилась пара новых переменных. Одна — для скорости движения врага, а вторая — для расстояния, на котором враг начинает реагировать на препятствие. Затем мы добавили внутрь метода Update() метод Translate(), обеспечив непрерывное движение вперед (в том числе воспользовавшись переменной deltaTime для движе­ния, не зависящего от частоты кадров). Кроме того, в метод Update() помещен код бросания луча, во многом напоминающий написанный нами ранее сценарий поражения целей. В данном случае прием бросания луча применяется для осмотра сцены, а не для стрельбы. Луч создается на базе положения врага и направления его движения, а не на базе камеры.

Как уже упоминалось, для расчета траектории луча применяется метод Physics.SphereCast(), в качестве параметра принимающий радиус окружности, в пределах которой будут распознаваться пересечения. Во всех же прочих отношениях он аналогичен методу Physics.Raycast(). Сходство наблюдается в способе получения информации о столкновении луча, способе проверки пересечений и применении свойства distance, гарантирующего, что враг среагирует только тогда, когда приблизится к препятствию.

Как только враг окажется перед стеной, код поменяет направление его движения наполовину случайным образом. Я использую словосочетание «наполовину случайным», так как значения ограничены минимумом и максимумом, имеющими смысл в данной ситуации. Мы прибегаем к методу Random.Range(), которым Unity позволяет получить случайное значение в указанном диапазоне. В нашем случае ограни­чения немного превышают величины поворота влево и вправо, что дает персонажу возможность развернуться на достаточный угол, чтобы избежать препятствия.