статья
ОСТРОВА В ОКЕАНЕ Основы создания уровней для Far Cry, часть 2
   Редактор: CryEngine Sandbox
    Где взять: Устанавливается вместе с игрой
    Возможности: 100% игровых
    Сложность освоения: Средняя
    Документация: На диске с игрой

    В предыдущей статье мы с вами разобрали создание самой основы уровня — ландшафта и игрового окружения. Несомненно, за истекший месяц вы успели создать карту невероятной красоты, и теперь вам не терпится сделать на ее основе шедевральный уровень с лихо закрученным сюжетом, хитроумными противниками и... ну в общем, еще с чем-нибудь таким, что игроки, забредшие на уровень, будут попеременно оказываться то в крепкой хватке Кондратия, то в цепких когтях Миокарда, а то и вовсе будут попадать под тяжелый удар Холодного Пота. Чтобы сделать эту сказку былью, нужно доработать игровое окружение: оживить его, прописать сюжетные скрипты, научить уму-разуму врагов. Как это делается — читайте в сегодняшней статье.

    Подробнее об объектах
    В прошлый раз, создавая игровое окружение, мы ограничились лишь простой расстановкой различных типов объектов на карте, не очень вдаваясь в свойства этих типов. Поэтому сейчас мы изучим их подробнее. Первые два типа, скрывающиеся под кнопками Brush (статическая геометрия) и Entity (объекты, с которыми может взаимодействовать игрок), вам уже известны по прошлой статье. Познакомимся с остальными.
    AI — раздел, содержащий служебные объекты, управляющие искусственным интеллектом персонажей — их поведением и перемещением.
    Area — с помощью объектов данного типа вы можете создавать особые зоны уровня: задымленные пространства или зоны, активирующие какие-либо скрипты.
    Simple Entity — упрощенный вариант Entity. Объекты данного типа не могут быть использованы игроком, но могут обладать базовыми физическими свойствами. В частности, этот тип объектов несложно использовать для создания предметов, использующих физику твердого тела.
    Archetype Entity —здесь находятся игровые объекты, копирующие заранее заданный прототип и все его свойства. Поначалу этот список пустует — заполнить его нужными объектами вам придется самостоятельно. Это делается в окне базы данных редактора Data Base View. Включите его, выбрав пункт меню
Window\Show Data Base View.
    Окно базы данных содержит пять закладок.
    Entity Library — библиотека игровых объектов. Через нее можно добавить на карту любой игровой объект (оружие, технику, противника и т.д.), кроме служебных.
    Prefabs Library — библиотека, куда помещаются предварительно подготовленные группы объектов (например, дом с уже расставленными “обитателями” и интерьером), чтобы затем размещать их в других районах уровня или использовать при создании новой карты.
    Materials — библиотека материалов (схем текстурирования и освещения геометрии уровня). Материалы используются главным образом при создании закрытых помещений.
    Particles — библиотека систем частиц. Практически не используется, так как все системы частиц являются игровыми спецэффектами и не требуют отдельного добавления на карту.
    Music — библиотека игровой музыки. Соответственно, служит для создания музыкального сопровождения на вашем уровне.
    Сверху также находятся два меню: Library (для действий над библиотеками объектов) и Library Item (для действий над самими объектами).
    Рассмотрим работу с закладками на примере Entity Library (изображена на рис. 1). Остальные закладки устроены по схожему принципу, поэтому, разобравшись с первой закладкой, вы освоите и остальные, когда они понадобятся. Все объекты на закладках разбиты по классам на отдельные библиотеки. Объекты каждой библиотеки отображаются в левой части закладки (обозначено цифрой 1) в виде структурированного списка. Но поначалу там ничего нет. Чтобы открыть новую библиотеку, выберите пункт меню Library\Load Library. Все открытые библиотеки помещаются в список библиотек на панели инструментов (в верхней части закладки); чтобы активировать однажды открытую библиотеку, достаточно лишь выбрать ее из этого списка.
    Когда вы выделите какой-либо конкретный объект библиотеки, справа активируются еще три окна, они обозначены следующими номерами.
    2. Список скриптов и методов объекта (не представляет для нас интереса).
    3. Окно предварительного просмотра объектов. Также вместо него можно включить окно описания объекта с помощью кнопки Show Item Description на панели инструментов. Чтобы после этого вернуть окно просмотра на место, нажмите кнопку Play.
    4. Список параметров выделенного объекта. В редакторе существует огромное число различных типов объектов, каждый из которых имеет собственный набор параметров. Поэтому далее в статье мы будем рассматривать только те параметры, которые нам понадобятся.
    Разумеется, вы можете не только использовать уже готовые библиотеки, но и изменять их, и создавать новые. Чтобы создать новую библиотеку, просто выберите пункт меню Library\New Library и укажите имя новой библиотеки. Новые объекты добавляются в библиотеку через меню Library Item\New. В появившемся окне выберите из списка желаемый прототип и нажмите OK. В следующем окне поле Group укажите название группы, в которую следует поместить объект. Если группа не существует, она будет создана. Если же вы хотите добавить объект в уже существующую группу, то перед добавлением просто выделите эту группу, чтобы ее имя уже было указано в соответствующем поле. Ниже, в поле Name, укажите имя объекта. Создав новые библиотеки или отредактировав старые, сохраните изменения через меню Library\Save Modified.
    Все открытые на закладке Entity Library библиотеки будут добавлены в список объектов, скрытый под кнопкой Archetype Entity на закладке Objects в основном окне редактора, поэтому вам необязательно постоянно держать открытым окно базы данных.
    Запомните: все объекты (и, конечно, заданные им параметры), добавляемые из Archetype Entity, в точности повторяют первоначальный прототип в библиотеке объектов. Изменить параметры этих объектов можно только из окна базы данных, причем при изменении параметров прототипа изменятся и соответствующие параметры его копий на карте. Поэтому в основном объекты из Archetype Entity используются как типовые — типовой “толкабельный” ящик или бочка (не задавать же уникальные физические параметры каждой бочке), типовой монстр (наделять индивидуальными чертами AI каждого мутанта также не стоит), двери на уровнях (уже работающие и не требующие создания отдельных скриптов) и так далее.

    Доработка экстерьера
    Поработаем с объектами окружения, не ограничиваясь банальной расстановкой их на карте. Для начала добавим игровому миру интерактивности и физического реализма. Попробуем соединить между собой два разных предмета, например лодку и плот, как в одном из эпизодов игры.
    Плот в данном случае — это твердое тело. Заготовкой для него служит объект типа Simple Entity — wood_raft (располагается в папке Buildings\Boat). Добавьте его на карту и расположите так, чтобы он был слегка погружен в воду позади лодки. Чтобы оценить физические качества нового плота, отыщите кнопку AI/Physics, расположенную под окном 3D-обзора. Нажмите. Ничего не произошло? Значит, нужно сначала задать объекту параметры его физической модели. Когда объект выделен, его свойства располагаются на закладке Objects в свитках, расположенных сразу под кнопками добавления объектов.
    В свитке SimpleEntity вы можете узнать и изменить имя объекта, выбрать цвет условного обозначения данного объекта в окнах 2D-обзора, а также выбрать слой, к которому будет принадлежать выбранный объект. Ниже расположен свиток SimpleEntity Params — здесь настраиваются параметры отображения объекта в игре. Нас они пока не интересуют.
    Еще ниже расположен свиток SimpleEntity Properties — здесь, в разделе Physics, и находятся нужные нам свойства.
    Mass — масса объекта.
    Resting — если параметр включен (True), то объект будет находиться в состоянии покоя, пока его не толкнут. Если выключен — просчет физической модели объекта начнется сразу после начала игры.
    RigidBody — будучи включенным, указывает, что объект является твердым телом. Иначе объект будет просто статической моделью. Обязательно включите этот параметр.
    RigidBodyActive — включает/выключает просчет физической модели для данного твердого тела. Также должен быть включенным.
    water_density — плотность воды для данного объекта. Влияет на то, насколько хорошо объект держится на воде — как пробка (при высоких значениях), как топор (при очень низких), как топор из пробки (при средних).
    water_resistance — сопротивление водной среды. Чем больше значение параметра, тем более “вязкой” вода будет для данного объекта.
    Затем добавьте лодку (из объектов Entity, папка Vehicles, объект Boat). Все параметры можно оставить как есть.
    Теперь привяжем плот к лодке. Для этого нам понадобится объект ChainSwing (тип Entity, папка Others). Это простая цепь, обладающая соответствующими физическими свойствами. Все, что нам нужно — подогнать длину цепи и присоединить ее к лодке и к плоту. В этом нам помогут параметры из свитка Entity Properties.
    Model — модель объекта. В случае с цепью вы можете, щелкнув по маленькой кнопочке справа в строке параметра, выбрать модели chain_swing.cgf (стандартная модель средней длины), chain_swing_short.cgf (короткая цепь) или chain_swing_longer.cgf (длинная цепь). Есть также модели кабелей, проводов, веревок, цепей с крюками — полный ассортимент. Выберите модель подходящего типа и длины.
    AttachTo — параметр указывает, к какому объекту должен быть присоединен нижний конец цепи. Просто скопируйте сюда имя объекта, изображающего плот.
    AttachToUp — этот параметр указывает, к чему надо присоединить верхний конец цепи. Если строка пуста, то конец “пристегивается” к той точке, в которой вы его разместили (даже в пустоте). Впишите сюда имя лодки.
    Необходимо понимать, что цепь будет присоединена к указанным объектам именно в тех точках, в которых находятся ее концы. Даже если цепь визуально будет висеть в пустоте, она все равно присоединится к объектам. Поэтому внимательно подходите к размещению всех связывающих объектов и отключайте во время их размещения просчет физики (кнопка AI/Physics). Если вы хотите, чтобы плот был привязан к лодке двумя цепями (или больше), надо всего лишь скопировать первую цепь клавишами Ctrl+C и указать ей желаемое положение. Все необходимые параметры будут уже настроены.
    Если вы все сделали правильно, то при включении просчета физики плот и лодка начнут весело качаться на волнах, а соединяющая их цепь провиснет между ними. Чтобы проверить эту связку в игре, расположите камеру обзора прямо над лодкой и нажмите клавиши Ctrl+G — так вы сможете поиграть прямо в редакторе.
    Подобным образом создаются абсолютно любые “цепные” связки — подвесные мосты, балки, висящие на крючьях мертвяки и все, на что только хватит вашей фантазии.
    Поработаем немного с Archetype Entity. Раз уж мы занялись интерактивностью уровня, то было бы неплохо добавить на него объектов, симулирующих физику тканей. Это сетки, занавески, флаги, паутина. Располагаются данные объекты в библиотеке Physicalized_Objects, в папке Cloth. Свойства тканей поддаются настройке в окне базы данных. Ниже приведены наиболее интересные параметры.
    CollideWithPhysical — включить или выключить просчет столкновений с физическими объектами.
    CollideWithPlayers —просчет столкновений с игроками.
    CollideWithStatics —просчет столкновений со статическими моделями.
    CollideWithTerrain —просчет столкновений с земной поверхностью.
    Accuracy — точность расчета колебаний ткани.
    air_resistance — сопротивление воздуха, влияющее на скорость затухания колебаний.
    В разделе Gravity вы также можете настроить ускорение свободного падения по всем координатным осям (в метрах в секунду).
    Конечно, можно создать объект с физикой тканей и через стандартные Entity, с помощью объекта TestCloth в папке Others, установив желаемую ткань в параметре Model. Но это не очень-то удобный и быстрый путь.
    В тех же Archetype Entity есть очень полезная библиотека — Doors_and_switches. Здесь собраны двери и всевозможные переключатели. Переключатели пока нас не интересуют, а вот двери очень пригодятся. Могу поспорить, что ваш уровень уже изрядно застроен инфраструктурой. Но все дверные проемы пусты и ничем не прикрыты. В таком случае просто добавьте на карту подходящую дверь из папки Doors. Никаких свойств настраивать не нужно — двери уже работают.
    Также интересна библиотека Destroyable_Objects — здесь находятся разрушаемые объекты. Если вам не терпится что-нибудь взорвать или разломать, смело добавляйте объекты этой библиотеки на карту.
    Создание миссии
    Чтобы сделать уровень для одиночной игры, необходимо предусмотреть еще несколько моментов. Во-первых, нужно грамотно расставить на карте врагов, которые будут не просто стоять на месте и начинать действовать лишь завидев игрока, а изображать бурную активность. Потом положить игроку в инвентарь хоть какую-то экипировку, чтобы он начинал играть не с пустыми руками. Также нужно создать хотя бы элементарные игровые скрипты, управляющие целями миссии и событиями во время игры. Но обо всем по порядку.

    AI
    Добавление на карту персонажей, управляемых искусственным интеллектом, не отличается особой сложностью. Все эти персонажи добавляются из Archetype Entity. Обычные солдаты находятся в библиотеке Mercenaries_Library, мутанты — в Mutants_Library, вооруженные штатские — Civilians_Library. Причем солдаты распределены по ролям. Есть командиры (те, что в папке Merc_Leader), есть разведчики (Merc_Scout) и так далее. Если вы создаете целую группу солдат, их эффективность зависит в первую очередь от состава группы: без того же командира они будут просто вооруженной толпой. Для объединения персонажей в группы существует параметр groupid, доступный на закладке Objects при выделении персонажа. Причем, если при создании персонажей вы ставите их на карте близко друг к другу, то, скорее всего, они объединятся в группу автоматически.
    Для мелкого контроля действий персонажей можно использовать параметр Behaviour. В нем задается шаблон поведения — патрулировать, стоять на месте, практиковаться в стрельбе и ряд других. Но, как правило, для работы данного параметра требуются вспомогательные объекты — AIAnchor (находится под кнопкой AI на закладке Objects) и TagPoint (под одноименной кнопкой на той же закладке Objects). Например, чтобы заставить персонажа совершать обход территории, создайте несколько AIAnchor, расположив их в желаемых точках обхода, и выберите действие INVESTIGATE_HERE. У персонажа в параметре Behaviour выберите действие Job_Investigate. Затем откройте пункт меню Game\Generate AI Triangulation. После этого несчастный персонаж будет навеки обречен слоняться по отведенной ему территории, пока в его поле зрения не попадет противник.
    C помощью AIAnchor можно также задавать всевозможные фоновые действия — курение, разговоры и тому подобные. Для этого не требуется изменять параметры персонажей, достаточно лишь расположить рядом с ними сам AIAnchor с соответствующим параметром (для курения это AIANCHOR_SMOKE, для разговоров — AIANCHOR_RAMDOМ_TALK).
    На некоторых уровнях может возникнуть необходимость ограничивать зону перемещения персонажей — чтобы, например, они не падали с возвышенностей, не тонули в воде или просто не покидали отведенную им территорию. Для этого используется объект ForbiddenArea (из раздела AI). Никаких особых настроек не требуется — просто расположите точки при создании объекта так, чтобы они очерчивали запретную зону (не забудьте при этом включить кнопку Follow Terrain на панели инструментов). Затем задайте этой зоне некоторую высоту в параметре Height — если запретная зона распространяется на территорию с различными высотами, то она будет перекрывать лишь те участки, которые соответствуют ее высоте. После этого границы зоны станут как бы невидимыми стенами для персонажей — если они изначально находились вне зоны, то они не смогут войти в нее. Если же персонаж был расположен внутри зоны, то он не сможет выйти из нее.

    Инвентарь
    Чтобы заполнить рюкзак игрока снаряжением, откройте пункт меню Mission\Properties и нажмите кнопку Player-Equipment-Pack внизу. Во вновь открывшемся окне нажмите кнопку Add в верхней его части и введите имя создаваемого набора снаряжения. Его имя высветится в списке слева от кнопки. Теперь обратите свой взор на поля в нижней части окна. В поле Available Equipment находится доступное для добавления снаряжение. В поле Used Equipment — снаряжение, добавленное в текущий набор. Переносить снаряжение из одного списка в другой можно кнопками “<<“ и “>>“. Оружие — это предметы с приставкой WPN в названии. Предметы с приставкой Item — это снаряжение. Поле Ammunition служит для регулирования количества патронов и метательных снарядов (гранаты, камни и т.д.). “Положив” в рюкзак необходимое снаряжение, закройте окно, нажав OK. Набор снаряжения будет присвоен игроку. Но пока не закрывайте окно Mission Properties, оно понадобится нам при создании скриптов.

    Скрипты и события

    Все события в Far Cry управляются скриптовым языком Lua. Язык сам по себе весьма прост и гибок, но поначалу его довольно сложно осваивать. Чтобы создать новый скрипт, щелкните по кнопке Create, введите имя и сохраните его. При этом может возникнуть проблема: путь к скрипту будет указан неправильно. Если так и случилось, щелкните по кнопке Browse и заново откройте свой скрипт. Открыть скрипт для редактирования можно кнопкой Edit (все редактирование происходит в стандартном “Блокноте”). Изменив и сохранив скрипт, вы должны перезагрузить его кнопкой Reload, чтобы изменения вступили в силу.
    Скрипты работают не сами по себе, они тесно взаимодействуют с объектами — как с игровыми (персонажи, предметы), так и со служебными (скриптовые зоны, например).
    При создании нового скрипта (как правило, он основан на игровом событии) нужно вписать шаблон функции. Он имеет следующий вид:
    function Mission:Event_MyEvent()
    [скриптовые команды]
    end
    Вы вольны вписать новую функцию в любом месте скрипта, но только не внутри других функций. Можно поместить ее в самом конце текста. MyEvent — это имя события, активирующего данную функцию. Сначала вы пишете это имя в скрипте, и лишь потом в редакторе появляется метка, соответствующая функции. Слова function и end выполняют роль скобок, внутри которых располагаются команды, исполняемые этой функцией. Самые важные команды, которые можно поместить внутри этих скобок, таковы.
    Hud:AddMessage(“текст”, секунды) — выводит на экран текстовое сообщение, вписанное в поле “текст” (обязательно в кавычках) на указанное количество секунд.
    Hud:PushObjective({}, “текст”) — добавляет новое задание (текст задания вписывается также в поле “текст”) в список заданий. Фигурные скобки не играют особой роли, но должны присутствовать обязательно.
    Hud:CompleteObjective(“текст”) — помечает задание выполненным, делая серым его текст. Текст в поле должен в точности совпадать с текстом завершаемого задания.
    Hud:FlashObjectives({}, ““) — просто стирает все задания из списка.
    Hud:SetRadarObjective(“имя метки”) — устанавливает метку задания на радаре. Меткой служит объект TagPoint (из одноименного раздела). В поле “имя метки” необходимо вписать имя этого объекта. Установка новой метки удаляет предыдущую метку, если она была.
    Hud:SetRadarObjective(“nil”) — убирает с радара метку, не создавая новой.
    Game:SendMessage(“StartLevelFade имя_уровня”) — запускает уровень, имя которого указано в параметре.
    Чтобы понять, как именно все это работает, создадим несложный скрипт. Для начала нужно создать два служебных объекта: Shape (из раздела Area) и AreaTrigger (из раздела Entity\Trigger). Затем выделите объект Shape, найдите в нижней части закладки, в поле Target Entities, кнопку Pick. Нажмите эту кнопку, а затем щелкните по объекту AreaTrigger в окне обзора — так вы свяжете эти объекты между собой. Вместе они составляют “выключатель”, запускающий скрипт при входе в обозначенную зону.
    Теперь внесем изменения в игровой скрипт — откройте его. Впишите следующий текст:
    function Mission:Event_start()
    Hud:AddMessage(“New objective”, 15)
    Hud:PushObjective({}, “Kill Kenny!”)
    end
    Скрипт выводит на экран извещение о новом задании и добавляет это задание в список. Но чтобы он выполнился, он должен получить команду от игры. Сохраните скрипт, перезагрузите его, а затем обратитесь к свойствам объекта AreaTrigger. В нижней части закладки Objects, в списке Input/Output Events, выделите событие On Enter. Щелкните по кнопке Mission Handler ниже и выберите единственный пока пункт — start. Это и есть метка скриптовой функции.
    Работать конструкция будет так: сначала игрок входит в скриптовую зону, огороженную объектом Shape. AreaTrigger, привязанный к этой зоне, получает сообщение — “игрок вошел в зону” — и тут же пересылает его метке start, активируя тем самым скриптовую функцию. А та уже исполняет все предписанные команды. Если вы хотите, чтобы задание появилось в списке сразу после старта уровня, просто расположите скриптовую зону так, чтобы она окружала точку старта игрока.
    Как вы, наверное, уже поняли, Input/Output Events — это список всех возможных действий данного объекта. Реагировать на события и отправлять связанные с ними сообщения могут не только триггеры, но и многие другие объекты, например персонажи, техника. Причем сообщения могут пересылаться не только меткам скриптов, но и другим объектам, заставляя выполнить те или иные действия. В случае, когда сообщение пересылается от одного объекта другому, вы должны указать, какое именно действие должен выполнить целевой объект. Например, создайте двух персонажей. В списке действий одного из них найдите пункт On OnDeath и выделите его. Щелкните кнопку Pick и выделите второго персонажа — его имя появится под выбранным действием. Щелкните по этой строке правой кнопкой мыши и из появившегося списка выберите Die. Теперь, если первый персонаж погибнет, второй умрет вместе с ним, даже если был абсолютно невредим. Пользуясь этими простыми примерами и комбинируя их, вы можете создавать самые разные игровые события.

    * * *
    Мы получили вполне презентабельный уровень, обладающий интерактивным окружением, действующими противниками и игровыми скриптами. Но и это еще не все, ведь помимо открытых уровней вы можете строить и традиционные “коридорные”. В их создании есть свои нюансы. Ждите следующей статьи — в ней мы рассмотрим создание закрытых пространств и продолжим совершенствовать уровень.


«Статья "ОСТРОВА В ОКЕАНЕ"

публикуется с разрешения редакции журнала «Игромания». Автор Андрей Желтяк».