FarCry то вышел давно, но вот уже на горизонте виднеется вторая часть, а на полках уже давно лежит Крайзис, возможно (пока не знаю, не вскрывал, но скорее всего, их редакторы будут идентичны, если не одинаковы т.к. и Ubisoft и CryTek имеют право на использование редактора игры. А редактор, как известно, независима я от движка вещь и его можно прикрутить с другому, схожему по свойствам, движку. В любом случае можно создать несколько карт для мультиплеера или сингла и похвастаться перед кем-нибудь, типа "вот я крут, карту создал для FarCry". Итак...
Редактор игры — CryEngine Sandbox —устанавливается вместе с игрой. Как и сама игра, он сделан блестяще. Интерфейс, вобравший в себя лучшие качества множества других редакторов (например, 3D Studio MAX, Photoshop и даже редактора уровней для Serious Sam), прост, понятен и имеет множество настроек, позволяющих подстроить внешний вид редактора по своему вкусу. Кроме того, редактор использует возможности игрового движка, что дает возможность опробовать уровень в действии, не выходя из редактора.
Работать в утилите лучше при разрешении экрана не меньше 1152*864 точки, иначе не все кнопки на панелях инструментов поместятся на экране, и придется постоянно изменять размеры элементов интерфейса, чтобы сделать кнопки доступными.
Обзор
Центральную часть окна занимают два окна обзора уровня. Первое (обозначено цифрой 1) работает в режиме Perspective, отображая трехмерный вариант уровня (так, как он будет выглядеть в игре). Второе (цифра 2) показывает карту уровня и размещенные на ней объекты в виде каркасов и условных меток. Щелкнув по заголовку любого из окон, вы можете переключать режимы их работы в открывшемся меню. В нижней половине этого меню располагаются три общие для всех видов окон опции:
Maximized — при выборе этой опции активное окно обзора разворачивается до максимальных размеров, а остальные окна закрываются. Рекомендую вам сразу же развернуть окно Perspective на всю доступную площадь, так как все действия, описанные в сегодняшней статье, будут осуществляться именно в нем.
View — здесь вы можете выбрать режим работы окна. Режимы Top, Front и Left позволяют видеть условные обозначения размещенных на уровне объектов (в проекциях сверху, спереди и слева). Perspective и Map — уже знакомый вам трехмерный режим и режим карты. ModelPreview — режим предварительного просмотра игровых моделей. Z View — режим изменения высоты объектов (используется очень редко).
Configure Layout — выбрав эту опцию, вы установите количество и расположение окон обзора.
В верхней части контекстного меню расположены опции, которые присутствуют в зависимости от того, какой режим обзора выбран:
Labels — включает и выключает отображение текстовых меток объектов (их названия и порядковые номера). При большом скоплении объектов множество таких меток будет мешать обзору, поэтому логично их отключить.
Wireframe — включает отображение трехмерных каркасов ландшафта и объектов.
Show Height Map — включает отображение карты высот в режиме Map.
Grid — включает привязку объектов к сетке координат.
Show Safe Frame — загорается голубая рамка, имеющая стандартные пропорции экрана, независимо от пропорций окна обзора. Может пригодиться при работе над скриптовыми роликами.
Управление камерой в трехмерных режимах обзора осуществляется с помощью клавиатуры и мыши. Кнопками W, S, A и D вы можете двигать камеру вперед, назад, влево и вправо (если зажать Shift, камера станет двигаться быстрее). Если вы будете двигать курсором мыши при зажатой средней кнопке мыши, камера будет двигаться вверх-вниз и влево-вправо относительно окна обзора. Также двигать камеру вперед-назад можно с помощью колеса прокрутки мыши или зажав одновременно правую и среднюю кнопки мыши. Поворачивать камеру можно, зажав правую кнопку мыши и двигая курсор в нужном направлении.
В режимах карты и боковых проекций вид в окне можно прокручивать, зажав правую кнопку мыши. Колесико мыши служит для увеличения и уменьшения масштаба.
Скорость движения камеры регулируется в поле Speed, расположенном прямо под окнами обзора. Кнопка Coll рядом включает/отключает возможность переместить камеру под поверхность земли.
Инструментарий
Основные инструменты для редактирования уровня располагаются на панели RollupBar справа от окон обзора (цифра 3). Все функции панели делятся между четырьмя закладками:
Objects и Terrain — на этих закладках располагаются свитки с инструментарием для добавления на уровень всевозможных объектов и для редактирования ландшафта. Каждая кнопка открывает дополнительный свиток, который не всегда умещается в пределах экрана. В таких случаях вы можете прокручивать его либо перетаскиванием, зажав левую кнопку мыши над пустым пространством свитка, либо с помощью тонкой полосы прокрутки справа от свитка. Изучать действия всех кнопок сейчас мы не будем — необходимые функции будут рассмотрены позже, по ходу статьи.
Render Settings — эта закладка содержит сразу два свитка: Render Settings и Hide by Category. С помощью Hide by Category вы можете настроить, какие объекты надо отображать в окнах обзора, а какие стоит пока скрыть. Например, скрыть растительность и прочие "фоновые" объекты окружения, чтобы они не мешали работать над архитектурой уровня, маленькими служебными объектами. На свитке Render Settings вы отключаете прорисовку графических объектов (вплоть до теней и систем частиц). Также в нижней части этого свитка разрешено включить отображение всевозможной отладочной информации.
Layer Settings — здесь несложно настроить виртуальные "слои" объектов на карте. Эти слои объединяют в себе различные типы объектов, которые вы добавите на карту. Например, можно под одним слоем собрать все объекты окружения — растительность, живность, камни. Под другим — строения. Под третьим — объекты, с которыми взаимодействует игрок (технику, врагов, оружие). Одна категория объектов совсем не обязана целиком принадлежать одному слою: разрешено сделать несколько слоев для одного типа, чтобы экспериментировать с различным расположением объектов на карте, переключаясь между этими слоями.
Это все, что следует знать перед началом работы в редакторе. Все остальные функции мы рассмотрим в процессе создания уровня.
Создание ландшафта
Чтобы создать новую карту, выберите пункт меню File\New. В появившемся окне необходимо указать имя нового уровня (в поле Level Name). Затем включите опцию Use Terrain. В списке Height Map Resolution выберите разрешение карты высот нового ландшафта. В списке Meters Per Unit укажите масштаб карты высот — скольким метрам будет соответствовать каждый ее пиксель. Диапазон значений в этих списках довольно широк. Максимальный размер
создаваемого ландшафта — 2000*2000 километров, или 4 миллиона квадратных километров. Но не стоит сильно жадничать: если вы попытаетесь создать настолько большие просторы, редактор просто закроется с сообщением об ошибке. Для начала хватит карты высот размером 1024*1024 точки и с масштабом 2 метра на точку, и можно нажимать OK.
Редактирование геометрии
Новый ландшафт пока представляет собой идеально ровное морское дно, покрытое ужасной красной текстурой с надписью replace me. Для изменения рельефа местности в редакторе есть два инструмента. Один из них расположен на панели RollupBar, на закладке Terrain (рис. 2). Это кнопка Modify. При активировании этой кнопки внизу закладки откроется дополнительный свиток Modify Terrain. В нем располагаются параметры кисти, которой вы будете "рисовать" ландшафт.
Тип кисти устанавливается в списке Type. Типа всего два:
Flatten — кисть, выравнивающая высоту ландшафта на заранее заданной высоте.
Smooth —кисть, сглаживающая неровности ландшафта.
Ниже находятся три бегунка:
Radius — радиус кисти. Также регулируется кнопками [+] и [] на цифровой панели клавиатуры.
Hardness — сила воздействия кисти, влияет на скорость изменения ландшафта.
Параметр Height определяет высоту, на которую будет выравниваться земная поверхность при использовании кисти типа Flatten. Регулируется кнопками [/] и [*] на цифровой панели. Вы можете также установить значение бегунка равным высоте какой-либо точки ландшафта, щелкнув по этой точке левой кнопкой мыши при зажатой клавише Ctrl.
Параметр Enable Noise включает "шум" — относительно небольшие ямы и бугры на земной поверхности, которые будут появляться вместе с изменением ее высоты. Перепад высот и частота этих неровностей устанавливается бегунками Scale и Frequency.
Если включить параметр Reposition Objects, то все объекты, находящиеся на карте, будут изменять свою высоту вместе с изменением высоты поверхности под ними, чтобы не провалиться под землю или не зависнуть над ней.
Чтобы поднять из морских пучин несколько островов, установите бегунок Height на максимум, Hardness — на 0.03 и выберите тип кисти Flatten. Теперь просто водите курсором по ландшафту, зажав левую кнопку мыши, пока не добьетесь желаемого результата.
Второй инструмент для изменения ландшафта — встроенный редактор карты высот (включается кнопкой Terrain на панели инструментов). Он довольно прост в освоении, но редактировать карту высот (черно-белое изображение, где интенсивность белого цвета определяет высоту каждой точки ландшафта) без достаточного опыта довольно сложно. Мы пока не будем рассматривать работу в нем, а сразу перейдем к текстурированию уровня.
Текстурирование
Текстуры накладываются на ландшафт довольно нестандартным способом. Вы не наносите их на поверхность кистью, а создаете текстурные слои, покрывающие всю карту целиком. Для указания, какие текстуры в каком месте карты будут отображены, используются альфа-маски, или маски прозрачности (квадратная черно-белая картинка с разрешением, равным разрешению карты высот). Текстура отображается в тех местах карты, которым соответствуют белые участки альфа-маски. На основе заданных слоев и их масок генерируется общая текстура ландшафта, включающая в себя тени от строений и возвышенностей, и свойства, определяющие видимость участков ландшафта. Такой способ текстурирования не очень нагляден и может показаться неудобным, но с другой стороны — это лучше, чем вручную закрашивать квадратные километры территории уровня. В редакторе также предусмотрена возможность непосредственного нанесения текстуры на желаемый участок карты, но это становится возможным лишь после предварительной подготовки текстурных слоев и генерации общей текстуры ландшафта.
Для создания текстурных слоев предусмотрено отдельное окно Terrain Layers Editor, вызываемое кнопкой Texture на панели инструментов. В верхней левой части окна находится список текстурных слоев — Layers. Справа, в поле Static, задаются параметры слоя. Параметр Layer in Use указывает, активен ли данный слой или нет. Щелкнув по кнопке Load Texture, вы можете задать основную текстуру слоя. В окне выбора текстуры, открывающемся этой кнопкой, слева есть папки, обозначающие ту или иную категорию текстур — нужные нам текстуры покоятся в папке Terrain.
В списке Surface Type устанавливается тип поверхности (набор параметров, определяющий свойства поверхности, текстуру детализации и т.д.). Кнопка Edit Surface Types открывает дополнительное окно, где создаются и редактируются типы поверхности.
Рассмотрим элементы окна:
Surface Types — в этом списке с помощью кнопок Add, Clone, Remove и Rename вы можете, соответственно, создавать, копировать, удалять и переименовывать типы поверхности.
Surface Type Settings — список, задающий материал поверхности (песок, камень и другие).
Detail Texture — здесь задается текстура детализации. Именно текстура детализации задает визуальный характер поверхности — скалы, трава, песок...
Detail Bump Map — еще один тип текстур детализации, задающий рельеф поверхности (эффект bump-mapping). Не столь важен, как предыдущий, но для таких поверхностей, как скалы (имеющие крупные неровности), можно использовать и этот тип текстур.
X и Y Scale — масштаб текстур детализации.
Projection Axis — ось, по направлению которой текстуры (включая основную) проецируется на ландшафт. По умолчанию установлена вертикальная ось Z — текстура проецируется сверху. Однако для участков земли, близких к вертикальным, можно использовать боковые оси X и Y.
Detail Objects — в этот список можно включить модели, которые будут нанесены на поверхность — тоже своего рода детализация. Например, слою, отвечающему за текстуру травы, присвоить еще и модель пучка травы. Но такие модели не должны содержать более 12 треугольников.
Создавая тип поверхности, лучше называть его так же, как и текстурный слой, которому вы присвоите этот тип, иначе легко запутаться и, например, текстуре травы присвоить атрибуты скальной поверхности.
После установки всех атрибутов текстуры нужно создать альфа-маску. Можно (и, в большинстве случаев, нужно) сгенерировать маску средствами редактора — для этого в окне Terrain Layers Editor существует поле Layer Mask Auto Generation. Параметр Auto Generate Mask определяет, используется ли для данного слоя генерируемая маска, — включите его. Маска генерируется на основе двух шкал:
Altitude Range — с помощью этой шкалы задается диапазон высоты, в пределах которой используется текстура. Диапазон варьируется от 0 до 255, что соответствует градациям высоты ландшафта. Чтобы установить минимальное значение, переместите бегунок на желаемую позицию и нажмите на кнопку Set Start. Нажатием кнопки Set End задается максимальное значение.
Slope Range — эта шкала задает диапазон наклона ландшафта. С ее помощью несложно ограничивать использование текстуры на крутых склонах или, наоборот, ровных участках. Градация шкалы также варьируется от 0 до 255, где 0 соответствует 0 градусам наклона, а 255 — 90 градусам. Установка диапазона значений такая же, как и у шкалы высот.
Маска, которая получится в итоге, отображается в нижней левой части окна в поле Layer Mask. А справа в поле Final Texture Preview — конечный вариант общей текстуры.
Закончив работать над текстурированием, закройте окно. Чтобы сделанные изменения вступили в силу, необходимо сгенерировать новую текстуру ландшафта. Для этого откройте пункт меню File\Generate Surface Texture. В появившемся окне нажмите кнопку Yes, а в следующем — выберите желаемое разрешение для текстуры. Чем выше разрешение, тем более четкий ландшафт вы получите, но тем больше времени необходимо будет для генерации текстуры. Кроме того, для генерации текстуры размером 16384*16384 пикселя требуется 1Гб оперативной памяти — не удивляйтесь, если редактор откажется ее генерировать. Также лучше включить параметр Hi Quality Compression — так конечная текстура будет более качественной.
Когда текстура ландшафта будет готова, вы, возможно, решите, что текстуры легли на карту не совсем так, как вам хотелось бы. Кроме того, вам может понадобиться нарисовать на земной поверхности дороги, какие-либо искусственные пустыри — в общем, детали, которые невозможно задать простой генерацией альфа-маски. Для этого на панели RollupBar на закладке Terrain включите кнопку Layer Painter. Она активирует кисть, которой вы можете непосредственно наносить на ландшафт заранее подготовленный текстурный слой (то есть вы вручную создаете белые участки на альфа-маске этого слоя). Набор параметров кисти почти такой же, как и у "кисти", изменяющей ландшафт. Наносимая текстура выбирается из списка в нижней части свитка.
Освещение
Осталось отрегулировать освещение карты. Для этого нажмите кнопку Lightning на панели управления.
В открывшемся окне в поле Lightning Type устанавливается тип освещения. В поле Settings регулируются параметры источника света:
Sun Direction — направление солнечного света.
Sun Height — высота солнца.
Ambient — яркость рассеянного света. Доступно только для типа освещения DP3.
Sky Quality — точность освещения. Доступно только для типа освещения Precise.
Кнопка Sky Color позволяет задать цвет неба (т.е. рассеянного атмосферой света). Кнопка Sun Color отвечает за цвет солнечного света.
В поле Shadowing устанавливаются параметры теней, отбрасываемых возвышенностями и добавленных на карту статическими объектами:
Blur — смазанность теней.
Intensity — интенсивность теней.
Terrain Shadows — включает/выключает тени, отбрасываемые ландшафтом.
Object Shadows — включает/выключает тени от статических объектов.
Чтобы увидеть на карте заданные тени, придется снова сгенерировать текстуру ландшафта. Если вы измените ландшафт, то чтобы увидеть изменения в освещении и текстурах, вам придется также генерировать текстуру заново. Надеюсь, вы дочитали эту главу до того, как начали генерировать текстуру размером 8192*8192...
Размещение объектов
Основа уровня готова, но ландшафт выглядит весьма уныло. Пора украсить острова растительностью, расставить здания и обставить их всевозможной утварью.
Растительность
Перейдите на закладку Terrain на панели RollupBar и активируйте кнопку Vegetation. Ниже появится одноименный свиток. В нем есть: набор кнопок для работы с объектами (их названия отображаются в строке состояния редактора при наведении курсора на кнопку); шкала Brush Radius, задающая размер кисти; кнопка Paint Objects, активирующая кисть, с помощью которой объекты наносятся на карту; список Objects, где располагаются выбранные модели растительности (пока он пуст); безымянный список, где задаются свойства добавляемых на карту растений; окно предварительного просмотра выделенной
Модели
Объекты в списке можно разделять на категории, чтобы не смешивать вместе разные типы растений. Создайте новую категорию, нажав кнопку Add Vegetation Category, и назовите ее Trees (деревья). Затем выделите ее и нажмите кнопку Add Vegetation Object. Так же, как и при выборе текстур, в левой части открывшегося окна вы можете выбрать тип моделей — нас интересует тип Natural (природные). Модели деревьев находятся в папке Trees. Несложно задать сразу несколько моделей, зажав Ctrl и последовательно щелкая на приглянувшиеся экземпляры. Затем нажмите Open — выбранные модели появятся в списке. Также разрешено удалять объекты из списка кнопкой Remove Vegetation Object и заменять их на другой тип кнопкой Replace Vegetation Object (это приведет к замене уже добавленных на карту объектов на новый тип).
Чтобы "посадить" растение на карте, выделите его в списке, включите кнопку Paint Objects и щелкните по желаемой точке на земле. Вы можете задать ряд параметров для каждого типа растений.
Вот некоторые из них:
Size — размер объекта. 1 соответствует 100%, 0,5 — 50% и т.д.
SizeVar — случайное изменение размера объектов в указанных пределах (так же, как и в предыдущем случае, в процентах).
Density — плотность объектов. Чем выше цифра, тем больше расстояние между соседними деревьями. Имейте в виду, что при низкой плотности объектов может потребоваться увеличить радиус кисти.
ElevationMin и ElevationMax — диапазон высот, в пределах которых можно добавлять выбранные растения.
SlopeMin и SlopeMax — диапазон наклона поверхности, в пределах которого можно размещать выбранные объекты.
PhisNonColl — важный параметр, который указывает, можете ли вы пройти сквозь выделенный тип растений или нет. Логично включить его для растений типа кустов и травы и отключить для деревьев.
Прочие объекты
Для работы с игровыми объектами на панели инструментов в верхней части окна есть группа кнопок и списков — они служат для выбора осуществляемых над объектами действий. Наведя курсор на элемент, вы увидите его название. Наибольший интерес представляют следующие элементы:
Select Object — активировав эту кнопку, вы сможете лишь выделять объекты на карте.
Select and Move — выделение и перемещение объектов.
Select and Rotate — выделение и вращение.
Select and Scale — выделение и масштабирование. Вы можете масштабировать практически все объекты, даже технику, которой можно управлять. Так из любой моторной лодки можно сделать самый настоящий крейсер.
Select Object Types — список слева от кнопок, в котором вы можете ограничить возможность выделения различных типов объектов.
Follow Terrain — при включении этой кнопки добавляемый на карту объект будет всегда находиться в указанной курсором точке ландшафта, не проваливаясь в него и не зависая в воздухе.
Snap to Grid — включив этот список, вы указываете объектам перемещаться с шагом, равным размеру ячейки координатной сетки. Размер ячейки задается здесь же.
Snap Angle — при включении этой кнопки поворот объектов будет не плавным, а дискретным, с шагом в несколько градусов.
Перейдите на панель RollupBar и откройте закладку Objects. Каждая кнопка здесь отвечает за свой особый тип объектов. На данный момент интерес для нас представляют следующие кнопки:
TagPoint — кнопка, содержащая всего три служебных объекта: Respawn — точка старта игрока в одиночных и мультиплеерных уровнях; TagPoint — контрольные точки, с помощью которых задаются, например, маршруты передвижения искусственно-интеллектуальных болванчиков; Comment — ярлык с комментарием, который вы можете разместить в любом месте на карте (это может быть полезным, если над одним уровнем работает сразу несколько человек). Сейчас нам нужно лишь создать точку старта игрока — объект Respawn. Выделите его в списке, а затем разместите на карте щелчком по желаемой точке в окне 3D-обзора.
Brush — здесь находятся разные статические объекты — здания, вышки, камни и многое другое. Вообще, в качестве статических объектов легко разместить на карте абсолютно любые модели. Создайте на острове какие-нибудь следы цивилизации — не по одним же джунглям бегать.
Entity — содержит структурированный список всевозможных "действующих объектов" — от динамических предметов (ящиков, бочек и всего, что можно пнуть, толкнуть и т.д.) до оружия и транспорта. Носимое оружие, а также амуниция, аптечки и ключ-карты располагаются в папке Pickups. Транспорт — в папке Vehicles. Динамические объекты — в папке Others. Пока на уровне нет ни одного супостата, можно спокойно потренироваться в стрельбе, постреливая по разложенному тут и там хламу, катаясь на багги по созданным просторам.
Закончив расставлять объекты, обновите текстуру карты, чтобы на ней появились тени от статических объектов. Сохраните уровень, а затем выберите пункт меню File\Export to Engine (или нажмите Ctrl+E) — так вы подключите уровень к игре. Теперь, чтобы запустить уровень, достаточно в главном меню игры открыть консоль (клавишей [~]) и набрать в ней команду "\map [имя карты]" (без кавычек).
Ваш первый уровень готов. Конечно, пока он мало подходит для виртуальных побоищ, но уже можно оценить, как он будет выглядеть в игре, и в случае необходимости исправить недочеты.
Подробнее об объектах
Можно ограничится лишь простой расстановкой различных типов объектов на карте, не очень вдаваясь в свойства этих типов. Но это не будет верным ибо без этого вы хорошей карты не слепите. Поэтому сейчас мы изучим их подробнее. Первые два типа, скрывающиеся под кнопками 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 —просчет столкновений со статическими моделями.
[b]CollideWithTerrain —просчет столкновений с земной поверхностью.
Accuracy[/b] — точность расчета колебаний ткани.
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. Теперь, если первый персонаж погибнет, второй умрет вместе с ним, даже если был абсолютно невредим. Пользуясь этими простыми примерами и комбинируя их, вы можете создавать самые разные игровые события.
Бегать по просторам джунглей океанских островов с автоматом наперевес, конечно, интересно. Но где это вы видели, чтобы какая-нибудь сверхсекретная лаборатория, разводящая жутких мутантов с помощью новейших достижений продажной девки империализма, была расположена прямо под палящим солнцем, на песчаных откосах берегов? Нет, такая лаборатория должна непременно быть упрятана глубоко под землей. Иными словами: нам необходимо создать закрытые помещения на нашей карте.
Внутренние помещения
Геометрия
Внутренности зданий в игре создаются без особых ухищрений с помощью заранее подготовленных кусочков пола, потолка, стен. Все они находятся на закладке Objects панели RollupBar под кнопкой Brush в папке glm. Чтобы не мучиться с подгонкой частей друг к другу, заранее включите на панели инструментов кнопку-список Snap to Grid, установив размер ячейки в 0.5 единиц, и кнопку Snap Angle — так объекты будут перемещаться строго с заданным промежутком и поворачиваться с шагом в 5 градусов. Также в некоторых случаях намного удобнее будет работать над “коридорными” уровнями в окнах плоских проекций (Top, Left, Front), особенно при создании зон видимости, описанных ниже.
Все модели, составляющие помещение, можно поделить на четыре типа: полы (Floors), стены (Walls), потолки (Ceilings) и “внутренние” модели, такие как колонны (Pillars), части, из которых составляются дверные проемы (Doors). Они находятся в подкаталогах с соответствующими названиями. Модели первых трех типов почти все представляют собой покрытый текстурой квадрат, видимый лишь с одной стороны. Остальные также имеют дыры — для экономии полигонов у них отсутствуют “задние” грани. Поэтому, создавая уровень, следите, чтобы на нем не появлялись окна в пустоту.
Так как внутренние помещения, скорее всего, будут спрятаны под землей, то вам понадобится создать проход в земной поверхности, иначе игрок просто не сможет пройти ни в один бункер. Для этого нужно перейти на закладку Terrain и нажать кнопку Holes. Тут все просто. Кнопка Make Hole создает дыру в земле. Remove Hole — закрывает дыру. Радиус кисти задается бегунком под кнопками. При создании подобного прохода нужно позаботиться о маскировке стыков земной поверхности и выпячивающихся из земли деталей — чтобы не было щелей и нигде не торчали “висячие” полигоны.
Зоны видимости
Поскольку все помещения создаются из статических моделей, не идет речи о каком-либо автоматическом разбиении пространства на зоны видимости. Игре придется обрабатывать абсолютно все помещения, а также объекты на поверхности, которые будут в пределах зоны видимости игрока, даже если эти объекты заслонены стенами подземного бункера. А это приведет к большим потерям в производительности. Поэтому зоны видимости необходимо установить вручную. Это делается с помощью объектов VisArea и Portal (скрываются под кнопкой Area на закладке Objects). Первый как раз и является зоной видимости, позволяя игроку, попавшему в эту зону, видеть лишь те объекты, которые также находятся в данной зоне. Порталы же являются “окнами” между зонами видимости и позволяют смотреть наружу (если вы находитесь внутри VisArea) или наоборот — внутрь (если вы находитесь вне VisArea).
Во избежание проблем с размещением порталов лучше использовать прямоугольные зоны видимости. Смежные зоны видимости должны быть расположены вплотную друг к другу, без зазоров. Редактировать размер и форму любой зоны можно, выделив ее и щелкнув по кнопке Edit Shape на закладке Objects. Перемещаются точки левой кнопкой мыши. Добавляются также левой кнопкой при зажатом Ctrl. Удаляются двойным левым щелчком по удаляемой точке. Высоту можно настроить в параметре Height. Лучше, чтобы у зоны был некоторый запас по размерам, чтобы модели, составляющие ограничиваемую комнату, наверняка оказывались внутри этой зоны. Те объекты, которые находятся прямо на границе зоны, не всегда отображаются корректно. Пример расположения зон можно увидеть на рис. 2.
Порталы создаются и редактируются точно так же, как и зоны видимости. Их нужно располагать прямо на стыке двух зон, чтобы они полностью перекрывали место их соприкосновения. Но не следует делать порталы чрезмерно объемными, наоборот — старайтесь делать их по возможности более плоскими (рис. 3). Корректируя габариты и положение портала, старайтесь добиться того, чтобы можно было увидеть соседнюю зону видимости из любой точки текущей зоны.
Текстурирование
“Кирпичики”, из которых собирается очередная секретная лаборатория, уже имеют свои текстуры. Но текстуры эти весьма однообразны, да и вариантов моделей с разными текстурами не так уж и много. Что же делать, если вы захотите сменить серые бетонные стены на сверкающие металлические или еще на что-либо?
Для начала следует открыть уже знакомое окно базы данных, обитающее в меню Window\Show Data Base View, и там перейти на закладку Materials. Как и в подробно изученной в прошлой статье закладке Entity Library, все наборы текстур (а точнее — материалов) содержатся во внешних библиотеках. Чтобы открыть библиотеку, щелкните по кнопке Load Library и выберите желаемый набор в появившемся окне. Открыв библиотеку, выделите один из приглянувшихся вам материалов. Затем в окне обзора Perspective выделите текстурируемую модель и нажмите кнопку Assign Material to Selection. Вернуть стандартную текстуру модели всегда можно кнопкой Reset Material On Selection.
К слову, текстуры вовсе неспроста называются материалами. Ведь в библиотеке содержатся не только стандартные “диффузные” текстуры. Материалы содержат и карты отражений, и рельефные текстуры, и всевозможные их сочетания. С их помощью вы можете придать любой поверхности какой угодно вид.
Освещение
Освещение — важная часть в создании подземных уровней. Это вам не залитые солнечным светом пляжи. Существует два типа освещения: динамическое (обрабатываемое в реальном времени) и статическое (предназначенное для компиляции карт освещения на статических моделях). Оба типа могут также иметь свойство fake (муляж; задается в параметрах). От обычных источников света fake-лампочки отличаются тем, что освещают лишь статические объекты и не принимают участия в освещении движущихся моделей, экономя тем самым ресурсы компьютера.
По умолчанию все внутренние помещения освещены весьма ярко, что категорически неправильно — ведь солнечный свет туда не проникает, а других источников света там пока еще нет. Погрузим их в сумрак. Для этого откройте меню Game\Generate Lightmaps. В открывшемся окне (рис. 4) в поле Quality настраивается разрешение карт освещения — бегунок Texel Size настраивает масштаб пикселей, а в списке Texture Resolution вы можете выбрать разрешение текстуры. Чтобы скомпилировать карты освещения на всех статических объектах карты, надо нажать кнопку All в поле Recompile в нижней части окна. Кнопка Selection обновит карты освещения только на предварительно выделенных объектах, а кнопка Changes — лишь на объектах, подвергшихся каким-либо изменениям со времени предыдущей компиляции карт.
Теперь можно заняться искусственными источниками света. Как статическое, так и динамическое освещение задается одним и тем же типом объектов — DynamicLight из раздела Entity, папка Lights. Установите этот объект в одной из комнат и обратите взор на набор его параметров. В свитке Entity Params включено два параметра — CastShadowMaps и RecvShadowMaps. Они означают, что объект (точнее, его модель) может отбрасывать динамическую тень, и тени от других объектов могут падать на него. Их можно отключить: тень от абажура лампы, появляющаяся лишь при наведении второго источника света, вряд ли очень необходима, а ресурсы процессора небесконечные. Если включить параметр CastLightmap, то объект перестанет быть динамическим источником света и будет проецировать обычные карты освещенности (конечно, лишь после того, как вы заново откомпилируете их). Цвет излучаемого света изменяется в параметре Diffuse в свитке Entity Properties. Яркость — в параметре DiffuseMultiplier. Расстояние, на которое распространяется свет, — в параметре OuterRadius.
Статический источник света светит равномерно во всех направлениях. Динамическая же лампочка испускает конус света в заданном направлении (хотя, включив параметр ProjectInAllDirs, можно и их заставить светить во все стороны). Ширина этого конуса задается параметром ProjectorFov. А вот параметр ProjectorTexture позволяет изменить вид пятна света с обычного расплывчатого круга на что-нибудь более интересное (например, светлое пятно будет перечеркнуто решеткой,
загораживающей лампу). Задавая различные значения параметру LightStyle, можно заставить лампу моргать, периодически гаснуть и вообще вести себя так, как приличные лампы не ведут. Чтобы источник света был по-настоящему движущимся, надо задать ему шейдер в параметре LightShader (шейдеры лампы в списке можно найти по названию, каждое из которых начинается на light). После этого, кроме условного обозначения источника света, вы также сможете видеть модель, которая будет изображать лампу в игре. Если текущая модель вас не устраивает, выберите другую в параметре Model3. Можете дополнительно настроить скорость затухания колебаний качающейся от какого-либо толчка лампы в параметре damping. Чем выше значение, тем быстрее лампа успокоится, но если установить 0 или меньше, лампа не прекратит качаться никогда.
Расставляя лампы, имейте в виду, что свет не проникает сквозь порталы между зонами видимости (рис. 5). Если статическое освещение можно продублировать, расположив по лампочке с каждой стороны портала, то с динамическим освещением такой фокус не пройдет. Поэтому не располагайте динамические светильники слишком близко к порталам.
Вейпойнты
Вейпойнты — это сеть из точек маршрутов, предназначенных для того, чтобы управляемые AI персонажи могли ориентироваться в нестандартных для них зонах. Нестандартными в Far Cry считаются все зоны, кроме земной поверхности на открытых участках уровня. То есть, все ступеньки, мосты, закрытые помещения и прочее. Так как возможность автоматической генерации вейпойнтов в редакторе не предусмотрена, все придется делать вручную.
Вейпойнты находятся в разделе AI, объект AIPoint. Они бывают четырех типов — Waypoint (стандартные точки маршрута, из которых и составляется основная сетка), HidePoint (точка, в которой персонажи прячутся в случае опасности; их следует устанавливать за углами, колоннами и т.д.), Entry Point (точка входа и выхода из нестандартной зоны; нужна, чтобы персонаж, обычно находящийся вне сетки маршрутов, мог при необходимости перейти на нее и затем выйти) и Exit Point (точка только выхода). Типы переключаются в свойствах объекта в свитке AIPoint Parameters.
Расставлять точки следует равномерной сеткой с промежутком между соседними объектами в пределах 2-4 метров. После расстановки вы должны соединить вейпойнты в единую сеть, так как персонажи могут перемещаться только между теми точками, что соединены между собой. Присоединить одну точку к другой можно, щелкнув по кнопке Pick в нижней части свитка AIPoint Parameters, а затем кликнув на присоединяемую точку. Пример расстановки вейпойнтов вы можете видеть на рис. 6. Обратите внимание, как разрежены точки на более открытом участке и как они “уплотняются” в более тесном и сложном месте.
Окружение
Возводя всевозможные над- и подземные сооружения, мы совсем не обращали внимания на окружающую среду — небо, туман, воду. А ведь и их можно настраивать по своему вкусу. Не вечно же стоять ясной и солнечной погоде? Чтобы отредактировать параметры окружения, нажмите кнопку Environment на закладке Terrain. Внизу откроется свиток с набором параметров, разделенных на несколько групп. Важнейшие из них — Fog и Shaders.
В разделе Shaders выбираются шейдеры (скрипты, содержащие команды — что и как отображать в игре), задающие внешний вид неба, воды, волн, накатывающих на берег, и отражения солнца в воде. Большинство параметров можно оставить как есть. Но если карта, которую вы создаете, — не очередной райский остров, а что-то более мрачное, то можно выбрать и более мрачное небо. За шейдер неба отвечает параметр SkyBox. Нужные шейдеры находятся в самом верху списка и имеют названия, соответствующие названиям уровней игры, на которых они используются.
В группе Fog настраивается туман, дымка, заволакивающая объекты по мере их удаления. Параметр Color позволяет выбрать цвет дымки (лучше, чтобы он совпадал с основным цветом неба). Параметр Start отвечает за расстояние между ближним краем тумана и игроком. Параметр End — за расстояние, на котором туман становится абсолютно непрозрачным. ViewDistance — устанавливает дальность обзора.
При изменении параметров окружения возникает одна существенная проблема. После того, как вы выберете новые шейдеры, параметры тумана и прочее, вам придется создать новый скрипт уровня, чтобы изменения вступили в силу. Делается это нажатием кнопки New Mission в нижней части панели инструментов. В списка слева вы выбираете, какой из скриптов в данный момент активен. Проблема же в том, что при создании нового скрипта вам придется создавать с нуля практически всю карту — создавать объекты, прописывать дополнительные скрипты. Также желательно будет обновить параметры освещения уровня и текстуру ландшафта. Поэтому редактировать параметры окружающей среды лучше в самом начале работы над новым уровнем.
Подробнее о триггерах
Рассмотрим два конкретных способа их применения — организацию автосохранений и создание транспорта, управляемого оппонентами.
Автосохранения
Так как сохраняться в любой момент в игре нельзя, необходимо добавить на уровне точки автосохранения, дабы облегчить игроку прохождение уровня. Основной объект, отвечающий за сохранение игры — GameEvent из раздела Entity, папка Others. Чтобы объект сработал, надо активировать его каким-либо триггером. Это можно сделать таким же образом, каким мы активировали цели миссии в прошлой статье. Но, вообще, поводом для автоматического сохранения может стать абсолютно любое событие в игре, вплоть до самых рядовых (смерть NPC, уменьшение запаса здоровья у какой-нибудь машины и т.д.). Мы же сделаем “традиционное” сохранение, происходящее по прибытии игрока в условленную точку на уровне.
Поместите GameEvent в месте предполагаемого сохранения, задав ему уникальный номер в параметре Id (это необходимо для правильной работы). Также добавьте объект AreaTrigger и создайте зону (объект Shape из раздела Areas), при входе в которую будет происходить сохранение. В свойствах зоны в список Target Entities добавьте объект AreaTrigger, щелкнув по кнопке Pick и затем по триггеру в окне обзора. В свойствах самого триггера в списке Input/Output Events выделите событие On Enter и присвойте ему объект GameEvent. Также, чтобы сохранение в данной точке происходило один раз, а не повторялось при каждом прохождении игрока через скриптовую зону, включите параметр триггера TriggerOnce.
AI и транспорт
Враги в игре могут не только бегать с автоматами наперевес, но также ездить на всех видах транспорта, метко отстреливая гранатометом и давя колесами зазевавшихся игроков. Но чтобы NPC залезли в тот же джип, необходимо создать отдельный триггер.
Расположите где-нибудь на карте (можно даже на воде) машину (или лодку) и поставьте рядом с ней двух наемников (у транспорта и солдат при этом должен быть одинаковый номер Groupid в свойствах). Затем создайте очередной AreaTrigger с присоединенной скриптовой зоной. Сделайте так, чтобы при входе в зону триггер отправлял сигнал машине, активируя либо событие On Chase, либо On Patrol. В первом случае солдаты верхом на машине будут гоняться за игроком, как только тот появится в пределах видимости (разумеется, лишь после активации триггера). Во втором — транспортное средство отправится патрулировать территорию по заданному маршруту. Маршрут задается с помощью объектов TagPoint. Просто расставьте их в ключевых точках и задайте однотипные названия с указанием номера контрольной точки (например, patrol1, patrol2 и т.д.), чтобы выделить данный маршрут среди других. Водитель транспорта сам “подцепит” ближайший маршрут и будет неустанно колесить по нему.
Статья взята из компьютерно-игрового журнала "Игромания"