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

3.5.1. Шаблон снаряда

Если раньше мы стреляли без применения реальных снарядов, то теперь они нам понадобятся. Стрельба приемом испускания лучей, по сути, мгновенна, и попадание регистрируется в момент щелчка кнопкой мыши, враги же будут бросать «огненные шары», летающие по воздуху. Разумеется, хотя они двигаются довольно быстро, у игрока будет возможность уклониться. Фиксировать попадания мы будем не методом испускания лучей, а методом распознавания столкновений (это уже знакомый вам метод, не дающий игроку проходить сквозь стены).

Код будет порождать огненные шары тем же способом, которым порождаются враги, — созданием экземпляров из шаблона. Как вы знаете из предыдущего раздела, первым шагом в подобных случаях является создание объекта, который послужит основой для шаблона. Так как нам требуется огненный шар, выберите в меню GameObject команду 3D Object и в дополнительном меню команду Sphere. Присвойте появившейся сфере имя Fireball. Теперь создайте новый сценарий с таким же именем и присоедините его к объекту. Чуть позже мы напишем для него код, а пока оставьте вариант, предлагаемый по умолчанию, так как первым делом мы завершим работу над снарядом. Чтобы он напоминал огненный шар, ему нужно присвоить ярко-оранжевый цвет. Такие свойства поверхностей, как цвет, контролируются при помощи материалов.

ОПРЕДЕЛЕНИЕ Материалом (material) называется пакет информации, определяющий свойства поверхности любого трехмерного объекта, к которому этот пакет присоединен. К свойствам поверх­ности относятся цвет, блеск и даже небольшая шероховатость.

Выберите в меню Assets команду Create и в дополнительном меню команду Material. Присвойте новому материалу имя Flame. Выберите его на вкладке Project, чтобы увидеть его свойства на панели Inspector. Как показано на рис. 3.10, щелкните на цветовой ячейке с именем Albedo (это технический термин, означающий основной цвет поверхности). В отдельном окне откроется палитра цветов; переместите расположенный справа ползунок и точку в основной области таким образом, чтобы выбрать оранже­вый цвет.

Еще мы увеличим яркость материала, чтобы придать ему большее сходство с пламе­нем. Отредактируйте параметр Emission (он тоже находится в списке атрибутов пане­ли Inspector). По умолчанию он равен 0, присвойте ему значение 0.3, чтобы сделать материал более ярким.

Теперь можно превратить наш огненный шар в шаблон, перетащив его со вкладки Hierarchy на вкладку Project, как мы делали, создавая шаблон врага. Теперь у нас есть основа для наших снарядов! Осталось написать код стрельбы.

3.5.2. Стрельба и столкновение с целью

Отредактируем шаблон врага, наделив его способностью кидать огненные шары. Чтобы код распознавал игрока, потребуется новый сценарий (аналогично тому, как сценарий ReactiveTarget требовался для распознавания мишеней), поэтому создадим сценарий с именем PlayerCharacter и присоединим его к игроку.

А теперь откроем сценарий WanderingAI и введем в него код следующего листинга.

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

Как и в листинге SceneController, в верхнюю часть сценария нужно добавить два поля GameObject: сериализованную переменную, с которой будет связываться шаблон, и закрытую переменную для слежения за созданным кодом экземпляром этого шаблона. После испускания луча идет проверка попадания в объект PlayerCharacter; это работает аналогично тому, как код стрельбы проверял наличие у пораженного объекта компонента ReactiveTarget. Код, создающий экземпляр огненного шара при от­сутствии таких шаров в сцене, работает как код создания экземпляров врага. Отлича­ются только размещение и ориентация объектов; на этот раз мы помещаем экземпляр, полученный из шаблона, перед врагом и нацеливаем в направлении его движения.

Как только новый код окажется на своем месте, на панели Inspector появится новое поле Fireball Prefab, точно так же, как в свое время для компонента SceneController появилось поле Enemy Prefab. Щелкните на шаблоне врага на вкладке Project, и на панели Inspector появятся компоненты этого объекта, как если бы вы выделили его в сцене.

Хотя упомянутое ранее неудобство интерфейса часто проявляется при редактировании шаблонов, именно интерфейс дает нам возможность легко редактировать компо­ненты объекта, чем мы сейчас и воспользуемся. Перетащите шаблон огненного шара со вкладки Project на поле Fireball Prefab панели Inspector, как показано на рис. 3.11.

Теперь, как только игрок окажется непосредственно перед врагом, в него полетит огненный шар… Попробуйте выполнить воспроизведение — перед врагом появится огненная сфера, но никуда не полетит, потому что мы пока не написали соответствующий сценарий. Давайте сделаем это сейчас. Код сценария Fireball приведен в следующем листинге.

Существенным новшеством в этом коде является метод OnTriggerEnter(). Он автоматически вызывается при столкновении объекта, например, со стеной или с игроком. Пока что наш код работает не совсем корректно; после его запуска огненный шар благодаря строке Translate() полетит вперед, но триггер не сработает, а вместо этого будет запрошен новый шар путем разрушения уже существующего. Требуется внести в компоненты огненного шара еще пару дополнений. Прежде всего, нужно превратить коллайдер в триггер. Для этого установите флажок Is Trigger в разделе Sphere Collider.

СОВЕТ После превращения в триггер компонент Collider продолжит реагировать на соприкосновение/перекрытие с другими объектами, но уже не будет препятствовать физическому пересечению с этими объектами.

Огненному шару также требуется компонент Rigidbody, относящийся к системе моделирования законов физики. Именно он позволит этой системе зарегистрировать триггеры столкновений для рассматриваемого объекта. Щелкните на кнопке Add Component на панели Inspector и по очереди выберите команды Physics и Rigidbody. После добавления указанного компонента сбросьте флажок Use Gravity, как показано на рис. 3.12, чтобы на огненный шар перестала действовать сила тяжести.

Воспроизведите сцену, и вы увидите, как огненные шары разрушаются после столкновения с каким-либо объектом. Так как код генерации этих шаров запускается сразу после исчезновения очередного экземпляра, обстрел игрока теперь становится непрерывным. Осталось добавить всего одну деталь: заставить игрока реагировать на попадание.