Untitled Document

Основы UnrealED
Информация и статьи получены на сайте , посвященному редатору Unreal
Глава 1. Основная информация
Автор : Hruka

Итак, вы первый раз запустили UnrealED. Перед вами находится главное окно UnrealED, которое выглядит примерно так, как представлено на рисунке.

Как вы видите, это окно состоит из трех частей. Первая часть - это панель с кнопками, расположенная слева.

Все эти кнопки выполняют какие-либо действия, которые также можно выполнить при помощи "горячих клавиш" или выбрав соответствующую команду в меню. В середине расположены четыре окна просмотра в которых вы собственно и будете редактировать ваш уровень. Если вы не трогали настройки то левое верхнее окно буде показывать ваш уровень сверху, левое нижнее будет показывать уровень в 3D перспективе, аналогично тому, как вы будете видеть уровень в самой игре. Два окна справа показывают уровень с разных сторон - слева и спереди. Справа расположена панель браузера. В этом браузере можно просматривать и выбирать для дальнейшего использование объекты в игре. В самом верхнем поле Browse вы выбираете тип объектов (Звуки, Музыка, Текстуры или Классы). В поле ниже вы выбираете файл, в котором содержатся объекты (в Unreal все объекты содержатся в упакованных файлах (packages), каждый из них служит для определенной цели или соответсвует определенной теме). В самом нижнем поле выбирается группа в файле (package может содержать несколько групп для удобства выбора объектов, например файлы с текстурами содержат группы Floor (Пол), Walls (Стены), Ceiling (Потолок) и т.д., в каждой из которых лежат текстуры для определенной цели). В центре браузера расположены собственно объекты. В самом низу браузера находятся кнопки для манипуляции с файлами и объектами.


Untitled Document

Автор: Hruka
Навигация
Если вы сделаете большой уровень, то он естественно не поместится в рамки окон просмотра (viewports). Для того чтобы увидеть разные части уровня надо скроллировать эти окна. Как мы видим, специальных ползунков для скроллинга здесь нету. Для перемещения по 2D видам (по умолчанию - все кроме левого нижнего) нажмите в нужном окне левую или правую кнопку и двигайте мышь не отпуская ее. Чтобы приблизить/отдалить вид нажмите одновременно обе кнопки мыши и двигайте ее вперед/назад. В 3D окне перемещаться несколько сложнее - ведь там можно двигаться в любую сторону. Для перемещения вперед/назад и поворотов влево/вправо нажмите в 3D окне левую кнопку мышии двигайте мышь, не отпуская кнопку. Для того, чтобы смотреть мышью по сторонам проделайте то же самое, но с правой кнопкой мыши. Если нажать обе кнопки мыши и двигать ее, то вы сможете стрейфится (двигаться боком) и двигаться вверх/вниз.
Управление объектами
Теперь давайте создадим какой-нибудь объект и посмотрим, что мы можем с ним делать. Нажмите на кнопку с изображением куба на ней ( [image]). В окнах просмотра должен появиться красный куб. Теперь посмотрим, что с ним можно сделать. Во-первых, его можно перемешать. Для этого надо выделить его, если он еще не выделен, простым нажатием на него. Затем надо нажать Shift+Левая кнопка мыши, и, не отпуская Shift'a ( и кнопки : ), двигать мышь. Во-вторых, его можно вращать. Для этого надо проделать то же самое, только нажимать надо не Shift+Левая кнопка мыши, а Ctrl+Правая кнопка мыши. Чтобы вращать и перемещать объект в 3D окне по разным осям надо нажимать разные кнопки мыши (Shift+ЛКМ, Shift+ПКМ и Shift+ЛКМ+ПКМ - это перемещение по разным осям, а Ctrl+ЛКМ, Ctrl+ПКМ и Ctrl+ЛКМ+ПКМ - это вращение по разным осям).


Untitled Document

Автор : Hruka
Создание первой комнаты
Давайте теперь создадим вашу первую комнату. Во-первых верните ваш куб на место. Это делается командой меню Brush->Reset->All. Теперь давайте загрузим тесткуры для вашей комнаты. Проверьте чтобы в поле Browse браузера стояло Textures. Если это не так, то поставьте там Textures. Теперь нажмите кнопку Load внизу браузера. В появившемся окне вы увидите собственно файлы (packages) с текстурами. Каждый файл есть набор текстур на определенную тему. Выберите любой файл оттуда (например, Ancient.utx). В нижнем поле браудера выберите группу Wall (стены). Выберите понравившуюся вам текстуру. Теперь давайте создавать комнату. В Unreal мир построен на основе constructive solid geometry (CSG, что-то вроде "конструктивная цельная геометрия"). Это значит что весь мир вокруг - сплошной и твердый. Чтобы сделать в нем комнату надо просто "вырезать" ее из мира, а если, например, вы хотите сделать стол в этой комнате, то его надо будет уже добавить к миру т.к. пространство в нашей комнате уже не сплошное, а пустое. Для начала сделаем ваш куб побольше, а то если его вырезать сейчас, то игроку будет очень тесно в такой комнатке. Для того чтобы сделать это, кликните правой кнопкой на кнопку с изображением куба ( [image]) и выберите Cube Properties... Появится окно с параметрами куба. Первые три значения и есть размеры куба - высота, ширина и длина соответсвенно.
Оставьте высоту по умолчанию (256), а длину и ширину поставьте в 512 (далее я буду просто говорить 256x512x512). Нажмите кнопку Build. Как вы видите, наш куб стал побольше. Теперь нам надо вырезать его. Для этого можно нажать кнопку Substract ( [image]), можно выбрать в меню Brush->Substract, а можно и просто нажать Ctrl+S. Лично я предпочитаю последнее. Как вы видите, в 3D окне появилась ваша комната...
Но есть проблема, которая впрочем легко решается, - текстуры пола и потолка не отличаются от текстур стен, и выглядит это все нелепо. Эта проблема решается легко. В 3D окне кликните на пол вашей комнаты. Он должен выделится синим цветом. Теперь в браузере выберите группу Floor (пол), и выберите подходящую текстуру, кликнув на ней. Текстура пола вашей комнаты должна измениться. Также проделайте с потолком, только выбирайте группу Ceiling. Аналогично можно изменить и текстуры стен вашей комнаты. Если вам надо выбрать несколько поверхностей, то выбирайте их одну за другой, удерживая Ctrl. Если надо выбрать все поверхности браша (браш - это любой объеккт который можно вырезать или добавлять к миру, в данном случае - куб), то можно выбрать одну и нажать Shift+B. Итак, наша комната готова. Осталось сделать всего ничего - добавить источник света (если мы попытаемся поиграть в наш уровень, то он будет весь темный и ничего не будет видно) и место где игрок будет начинать игру. Чтобы добавить источник света надо кликнуть правой кнопкой в то место, куда вы хотите его добавить (например, на пол или на потолок) и в появившемся меню выбрать Add Light Here. Можно сделать это также нажав L и кликнув левой кнопкой в нужное место. Теперь добавьте источник света примерно в центр пола и поднимите его (сначала выберите кликнув левой кнопкой, а затем в 3D окне с нажатыми Shift+обе кнопки мыши двигайте мышь) так, чтобы он оказался точно в центре комнаты. Теперь вам надо добавить место старта. Место старта - это класс который называется PlayerStart. Чтобы его добавить надо сперва выбрать "Classes" в поле Browse браузера. Вы увидите список классов там, где раньше были текстуры. Класс PlayerStart унаследован от класса NavigationPoint, так что раскройте класс NavigationPoint кликнув на минус слева от него. В появившемся списке выберите PlayerStart. Затем кликните правой кнопкой в месте где у вас должен начинать игрок (например, в углу комнаты) и в меню выберите Add PlayerStart here. Если в меню нету такой команды, убедитесь что класс PlayerStart действительно выделен. Все, ваша комната готова. Однако для того чтобы поиграть на этом уровне вам надо его "переделать". Нет, заново вы ничего делать не будете. "Переделать" (Rebuild) или "перестроить" означает пересчитать BSP-дерево, освещение, создать карты освещения для уровня и просчитать зоны в уровне. Для того чтобы "переделать" уровень нажмите F8.

Убедитесь что в закладке Geometry установлен флажок Auto BSP, а в закладке BSP установлен флажок Auto Lighting. Выберите закладку Geometry и нажмите кнопку Build Geometry. Вы увидите как изменится освещение вашей комнаты...

Все, теперь ваша комната полностью готова. Можете играть (Ctrl+P).


Untitled Document

Автор : Hruka | Создание других комнат и соединение их между собой
Поздравляю, вы сделали ваш первый уровень! Однако, уровень из одной комнаты не выглядит очень интересным. Скорее, он выглядит скучным. Так что давайте сделаем еще несколько комнат и соединим их между собой.
 | Сначала мы сделаем вторую комнату. Помните как вы делали первую? Точно так же вы делаете и вторую. Давайте сделаем ее побольше. Для этого вызовите окно Cube Porperties и поставьте размеры 256x1024x1024. Затем переместите ваш красный браш (он называется строительным) вправо от вашей певой комнаты.
Теперь выберите текстуру и вырежьте эту комнату командой Substract. Замените текстуры пола и потолка. Добавьте пару источников света (в разных углах). Ваша вторая комната готова. Теперь давайте соединим эти комнаты. Вызовите окно Cube properties и поставтье размеры в 256x128x1024. Поместите этот браш так, чтобы он выглядел как коридор, только "залезающий" за стены комнат. Удостоверьтесь что этот коридор не касается ничего кроме стен. Теперь нам надо обрезать этот коридор точно по границам комнат. Для этого существуют две операции - intersect и deintersect. Intersect обрезает ту часть браша которая остается в пустоте и не лежит внутри сплошного пространства. Deintersect наоборот, обрезает ту часть, которая лежит внутри сплошного пространства и оставляет ту часть, которая лежит в пустоте.
 | Так как весь мир в Unreal состоит из сплошного пространства, нам нужна первая операция, intersect. Для ее выполнения нажмите кнопку Brish Intersection ( [image] ) или Ctrl+N.Ваш коридор должен обрезаться точно по границам комнат, как на рисунке.Теперь вырезайте его командой Substract и накладывайте текстуры. Поздравляю! Вы сделали уровень с двумя комнатами. Вы точно так же можете добавить в этот уровень еще хоть 10 комнат. Причем они не обязательно должны быть прямоугольными.
Давайте сделаем еще одну, цилиндрическую комнату. В этот раз начнем не с самой комнаты, а с коридора, ведущего в нее.
 | Сделайте куб размерами в 256x128x512. Поместите его около одной из стен второй комнаты, так чтобы он касался стены, но не выходил за ее пределы. Теперь вырежьте этот браш. Теперь переместите его и поверните его на 90 градусов так, чтобы он был перпендикулярен только что вырезанному брашу. Теперь придвиньте его к стене этого браша, чтобы они образовывали букву L.
 | Вырежьте и этот браш. Теперь наложите на ваш коридор нормальные текстуры и добавьте пару источников света. Теперь будем делать собственно цилиндрическую комнату. Для этого правой кнопкой нажмите на кнопку с изображением цилиндра ( [image] ) и выберите Cylinder prpoerties из меню. Оставьте Heihght по умолчанию (256), а вот Outer radius измените на 256. Теперь нажмите кнопку Build и закройте это окно. Теперь подвиньте ваш цилиндр так, чтобы он касался стенки коридора.
Теперь вырежьте этот цилиндр, нанесите на него какие-нибудь текстуры, добавьте источник света. Потом переделайте уровень (F8). Все, теперь в этот уровень можно играть!


Освещение и текстуры

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

Перед тем как начать, мы сделаем небольшой уровень из двух комнат, соединенных коридорчиком.

Размер комнат, равно как текстуры и освещение не имеет значения, единственное что надо сделать, так это добавить PlayerStart.

Ну а теперь можно начать. Текстуры, как впрочем и все остальные объекты в Unreal, хранятся в специальных запакованных файлах, называемых packages. Файлы с текстурами имеют расширение *.utx. В каждом таком файле собраны текстуры определенной темы, например в файле StarShip.utx находятся текстуры космического корабля, а в файле NaliCastle.utx - замка Нали, того самого, который в заставке Unreal. В самих текстурных файлах для удобства текстуры разделены на группы. Например, в группе Wall находятся текстуры стен, в группе Floor - пола и т.д.
Чтобы загрузить какой-нибудь текстурный файл, надо в верхнем поле браузера выбрать "Textures" и нажать кнопку Load внизу. Загрузите package под именем PlayrShp.utx, в нем находится большинство текстур из первого уровня Unreal. Теперь посмотрите на панель браузера. Вы видите, что во втором сверху поле появилось название файла - PlayrShp. Слева от этого поля находятся две кнопки, которые последовательно переключают все загруженные текстурные packag'и. В поле внизу вы выбираете группу в текущем packag'e. Выберите там группу "Walls". Еще ниже есть несколько кнопок. Первые две, в виде стрелочек, последовательно переключают группы, следующими тремя можно выбрать формат отображения текстур в браузере, а последняя просто отменяет текущий выбор группы, показывая все текстуры из файла. Ну а теперь давайте начнем текстурирование уровня. Сначала выберите все стены в уровне. Это можно сделать выбрав по отдельности каждую стену, но гораздо проще выбрать только одну, а затем нажать Shift+W. Это выберет все стены, прилегающие к выбранной стене. Теперь в браузере выберите группу Walls (стены) и кликните на подходящую текстуру (например Ribbed1). Теперь выберите поверхности пола. Это проще всего сделать выбрав только одну поверхность и нажав Shift+F. Это выберет все поверхности пола прилегающие к данной. Теперь выберите группу Floor и кликните на какую-нибудь текстуру. Теперь проделайте то же самое с потолком, выбирая текстуры из группы Ceiling.
Окно
Теперь давайте сделаем еще одну комнату рядом с нашей первой комнатой и между этими комнатами сделаем окно. Сначала вырежьте еще одну комнату на расстоянии одной клетки от первой комнаты и прорежьте небольшую дырку размерами 128x128 между этими комнатами:
Если вы не можете правильно поместить вашу дырку, то измените размер сетки до 8 единиц. Для этого нажмите правую кнопку на пустом месте в 2D окне и выберите Grid->8 units. После того, как вы вырезали дырку, можно делать и само окно (стекло в этой дырке). Сначала выберите подходящую текстуру стекла. Ее можно найти в packag'e GenIn.utx, в группе Glass. Теперь мы сделаем саму поверхность стекла. Нажмите правой кнопкой на кнопку "Build a sheet" ( [image]) и выберите из меню Sheet properties.
Значения полей U(длина) и V(ширина) поставьте на 128(размер нашей дырки), В поле Orientation выберите X-Wall или Y-Wall. Теперь подвиньте поверхность точно в центр нашей дырки.
Теперь нажмите кнопку Add Special Brush ( [image]), в поле predefined выберите "Transparent window", в поле Visibility выберите 2-sided и нажмите на кнопку Add Special.

Поверхность окна появится в 3D окне. Окно готово, однако когда вы запустите игру, вы увидите, что сквозь это окно без проблем проходят выстрелы, объекты, монстры и т.п. Это происходит из-за того, что простая поверхность никогда не будет блокировать актеров. Для того чтобы через окно нельзя было стрелять, надо добавить невидимое препятствие. Сделайте куб размерами 126x126x1 и поместите его точно перед поверхностью (для этого надо установить размер сетки равный единице).

Почему этот куб должен быть размерами 126x126, а не 128x128? Да потому, что если бы он касался сторон нашей дырки, то возник бы эффект HOM (Hall Of Mirrors).

Теперь нажимайте на кнопку Add Special Brush и в поле Predefined выберите Invisible Collision Hull. Теперь жмите на кнопку "Add Special". В 3D окне появится этот куб, но в самой игре его не будет видно. Также его не будте видно, если включить обновление уровня в реальном времени (кнопка в виде джойстика в углу 3D окна).

Все, окно готово.


Untitled Document

Добавление актеров
Вы создали великолепный уровень из трех комнат, однако первого приза он не получит пока его комнаты остаются пустыми. Давайте исправим эту проблему и добавим в него оружие и монстров. Все эти предметы в Unreal получили название "актеры". Добавить их проще простого - вспомните как мы добавляли место старта. Актеров надо добавлять точно так же, но вместо класса PlayerStart надо выбирать клас соответствующего актера. Давайте, например, добавим в нашу первую комнату пару ящиков с оружием и аммуницией, а в цилиндрическую комнату добавим Скарджа. Класс деревянного ящика (WoodenBox) является подклассом класса Decoration. Чтобы добавить его в поле Browse браузера выберите "Classes", затем раскройте класс Decoration и выберите в списке WoodenBox. Теперь добавьте его в первую комнату так же как вы добавляли PlayerStart или источник света. Только в меню выберите Add WoodenBox here. Добавьте парочку ящиков в комнату. Теперь надо добавить в эти ящики содержимое. Для этого кликните два раза на одном из ящиков. Должно появится окно WoodenBox properties, по виду похожее на Advanced Options в Unreal. Раскройте закладку decoration, там есть параметр contents. Выберите этот параметр, затем в Browser'e закройте класс Decoration и раскройте Inventory->Weapon. Выберите ASMD из списка. Теперь в окне WoodenBox parameters в строке contents нажмите кнопочку Use. Строка contents должна принять вид "class'UnrealShare.ASMD'". Теперь закройте это окно. Вызовите окно параметров другого ящика и измените его содержимое (contents) на Inventory.Pickup.Ammo.ASMDAmmo. Теперь добавим Скарджа в цилиндрическую комнату. Монстры находятся в классе Pawn.ScriptedPawn. Выберите оттуда моснтра Skaarj.SkaarjWarrior (не раскрывайте его) и добавьте в цилиндрическую комнату. Все, уровень готов. Можете переделывать его и играть! Удачи вам в процессе создания следующих карт! ;))


Создание неба

 Создание неба в UnrealED
Вы наверняка хотели бы создать уровни содержащие большие открытые пространства. Ну или небольшие. Ну или совсем маленькие. Неважно. Главное - то, что в каждом таком уровне у вас должно быть небо вверху. Вот о процессе создания неба и будет повествоваться в этой статье.
SkyBox
Небо в Unreal устроено следующим образом: у вас есть собственно уровень, с открытыми пространствами, и небольшой отдельный кусочек(SkyBox), в котором где-то есть объект SkyZoneInfo, который играет роль "камеры". Внутри этого кусочка вы делаете ваше небо, горы, планеты, солнце и т.д. В вашем уровне есть несколько поверхностей с установленным атрибутом "Fake backdrop". Сквозь эти поверхности вы можете видеть изображение, передаваемое камерой (т.е. объектом SkyZoneInfo). Эти поверхности - как бы мониторы, передающие изображение неба. Таким образом, для создания неба нам нужно 2 компонента - SkyBox и несколько поверхностей-"мониторов".
Небо
Мда, в теории это выглядит сложно, однако давайте сделаем наш первый SkyBox и вы сразу разберетесь, что к чему. Для начала сделайте квадратную комнату 512x512x512. Загрузите файл GenEarth.utx с текстурами травы, земли, камней и т.д. и назначьте одну из текстур полу вашей комнаты. Теперь выделите все остальные плоскости комнаты, нажмите на одной из них правую кнопку мыши и выберите "Surface Properties (x selected)...". В закладке Effects отметьте флажок Fake Backdrop. Теперь эти поверхности в игре не будут видны, а сквозь них мы будем видеть небо. Но чтобы его увидеть, его надо сначала создать. Сделайте комнату 512x1024x1024 где-нибудь в вашем уровне. Теперь загрузите файл SkyBox.utx с текстурами неба, гор и т.д. Измените размер куба на 256x256x256, выберите из файла SkyBox.utx текстуру земли (GRD) и добавьте этот куб прямо в центр вашей комнаты:
Это будет поверхность земли. Теперь мы на эту поверхность добавим горы. Посмотрите на такие текстуры из packag'а SkyBox, как LND1, LND2, LND3 и т.д.
Они выглядят как горы, но только на черном фоне. Чтобы черный фон стал прозрачным, для этих текстур надо установить атрибут Masked, который заменяет все черные пиксели в текстуре на прозрачные.
Для этого мы используем специальную заготовку "Masked wall".
Нажмите правой кнопкой мыши на кнопку Build a sheet и вызовите окно Sheet properties. В поле Orientation поставьте X-Wall, и установите размеры U=256 V=128. Теперь подвиньте поверхность на край нашей поверхности земли, как на рисунке. Нажмите на кнопку Add Special Brush. В поле Predefined выберите Masked Wall, а в поле Visibility выберите 2-sided.
Теперь в браудере текстур выберите текстуру LND2_1 и нажмите кнопку Add Special. Поверхность появится в 3D окне.
Теперь поверните поверхность по часовой стрелке на следующий край:
вот так -
Справа выберите текстуру LND2_2 и добавьте эту поверхность точно также как и предыдущую. Затем переместите поверхность на следующую позицию, измените текстуру на LND2_3 и добавьте поверхность. И, наконец, проделайте то же самое для последней позиции. Итак, вы сделали горы. Теперь можно приступать собственно к созданию неба. Небо у нас будет состоять из двух поверхностей над горами: одна поверхность - непрозрачное статичное изображение облаков. Вторая - прозрачное изображение плывущих облаков. Вызовите окно sheet properties, установите Orientation в Floor/Ceiling и размеры 1024x1024. Поместите эту поверхность на две клетки выше гор. Выберите справа текстуру SkytstAX и нажмите кнопку Add Special Brush. Из списка predefined выберите Regular brush, в поле Visibility выберите 2-sided и добавьте поверхность. Теперь мы добавим плывущие облака. Переместите поверхность на 1 клетку вниз, выберите текстуру NCld, нажмите Add Special Brush и поставьте такие же параметры как и для предыдущей поверхности, только на этот раз отметьте флажок Transparent. Как вы видите, в 3D окне появились облака. Чтобы сделать их плывущими, выберите поверхность с облаками, вызовите окно Surface properties и в закладке Effects установите флажок U-Pan или V-Pan. Теперь перейдем к освещению. Выберите поверхности гор и земли, взыовите для них окно Surface properties и установите флажок Unlit - для гор цветное освещение не очень нужно.
Ну а теперь освещайте ваше небо как душа пожелает - добавляйте источники света, меняйте их цвет, яркость и т.д., пока не создадите нормальное освещение. В итоге у вас должно получиться что-то вроде этого.
Ну и еще вы наверное захотите добавить солнце или планету. Это делается очень легко, просто добавляется обыкновенная поверхность с изображением планеты. Измените размер поверхности на 64x64, поместите ее на небо, в любое место, и разверните в сторону центра. Теперь выберите текстуру планеты (напр. Rpl), нажмите Add Special Brush и используйте те же параметры что и для прозрачных облаков. Скорее всего, размер текстуры вашей планеты больше чем 64x64(например, размер Rpl - 128x128). В этом случае выберите поверхность с планетой, вызовите окно Surface properties, и в поле Scale->Simple scaling установите необходимый масштаб. Например, для текстуры Rpl надо установить значение 0,5. Ну и, наконец, самое главное - добавьте объект Info.ZoneInfo.SkyZoneInfo прямо в центр вашего SkyBox'a. Все, теперь ваше небо готово. Можете это проверить, нажав Ctrl+P. Как вы видите, небо видно сквозь все поверхности с установленным атрибутом Fake backdrop.
Создается видимость того, что весь уровень поместили в ту маленькую комнатку, в SkyBox, точно на место где находится объект SkyZoneInfo. Теперь, надеюсь, всем понятно устройство неба в Unreal.
Заключение

И в заключение я хочу дать несколько советов по созданию неба:

  1. Скорость плывущих облаков можно менять. Откройте окно параметров SkyZoneInfo и изменяйте параметры ZoneLight->TexUPanSpeed, TexVPanSpeed. Рекомендую ставить эти значения где-то в 0.3-0.5 для хорошей скорости
  2. Никогда не используйте динамических источников света в SkyBox'e - это будет очень сильно тормозить.
  3. При осмотре оригинальных уровней Unreal, вы можете заметить, что там 2 SkyBox'а. На самом деле SkyBox в уровне может быть только один. Просто в оригинальных уровнях один используется для низких разрешений, другой - для высоких.


Музыка и звуки

 Добавление звуков и музыки
Большинство уровней, которые вы делали ранее, могли обладать рядом достоинств, таких как хорошая задумка, отличная архитектура, красивое освещение, сбалансированный геймплей. Однако (это касается в первую очередь сингл-плеер уровней), этот уровень был бы не очень интересен без звуков и музыки. В самом деле, если у вас в уровне имеется пусть даже очень красивый водопад, то все равно шума воды этот водопад будет совершенно нереалистичным, а интерактивная (и даже простая) музыка добавляет очень много атмосферности в уровень. За примерами далеко идти не придется. Запустите сначала Unreal Single Player без звука и пройдите несколько уровней, а потом попробуйте поиграть со звуком. Разница сразу станет заметна. Вот об этой разнице мы и пговорим в этой статье.
Начинаем...
А начнем мы с простенького уровня, состоящего из двух комнат и коридора между ними. Сначала создайте одну комнату 256x512x512, затем вырежьте коридор длиной 512 единиц, выходящий из этой комнаты (неважно в каком направлении). Теперь поверните браш на 90 градусов, поместите в конец коридора и вырежьте его, чтобы в результате образовался L-образный коридор.
Теперь поверните браш обратно и опять вырежьте его. Наконец, добавьте еще одну комнату после получившегося зигзагооборазного коридора. Вот что должно получиться:
Фоновые звуки
Фоновые звуки или Ambient sounds - это звуки которые постоянно звучат в ващем уровне. Это может быть свист ветра, пищание от компьютеров или шум водопада. Фоновые звуки могут добавить реалистичности и атмосферности игре. Для того, чтобы добавить фоновый звук нам нужны две вещи - объект AmbientSound и собственно звук, который будет исходит от этого объекта. Но сначала мы сделаем объект в уровне из которого по идее должен исходить звук. Пусть это будет большой компьютер. Добавьте куб размерами 256x64x256 в первую комнату. Теперь зарузите файл PlayrShp.utx и выберите группу Panel. Найдите там самую первую текстуру с экранами компьютера и назначьте ее передней грани вашего куба. Теперь смените текстуры боковых сторон по вкусу.
Можете также добавить источник света перед компьютером для реалистичности. Вот что должно получиться:
Теперь давайте добавим звук рядом с компьютером, чтобы казалось что звук исходит от него. Добавьте объект KeyPoint.AmbientSound прямо перед компьютером и откройте окно его свойств. Найдите параметр Sound.AmbientSounds, т.е. собственно звук, который будет исходить от объекта. Теперь мы назначим этот звук. В верхнем поле браузера выберите "SoundFX". Теперь загрузите звуковой файл "AmbModern.uax" кнопкой Load. Если вы откроете список групп, то увидите, что их тут две - Looping и OneShot. Looping - это циклические звуки, которые можно воспроизводить бесконечно. OneShot - это просто звуки, которые обычно воспроизводятся один раз. Из группы Looping выберите звук comp1 и нажмите кнопку Use в поле AmbientSound в окне свойств AmbientSound. Теперь закройте это окно. Все, звук появился. Вы можете в этом убедиться, нажав кнопку "Real-time update" в 3D-окне (выглядит как PlayerStart). Эта кнопка включает обновление уровня в реальном времени - анимированные текстуры, звуки и т.п.
Звуки, воспроизводимые по событию
Иногда требуется воспроизводить звук не всю игру, а только когда игрок что-нибудь сделает или произойдет какое-то событие. Например, можно добавить писк, когда игрок будет проходить через металлодетектор на какую-нибудь секретную базу скаарджей. Для этого используются триггеры. Как я уже говорил, триггер - это такой объект, который активируется при определенном условии. Например, когда игрок входит в зону его действия. Таким образом, чтобы создать звук, воспроизводимый по событию нам нужен триггер, объект звука, настроенный на этот триггер и собственно звук. Сначала вы должны решить, где поставить триггер.
Давайте поставим его в кроидоре, сразу на вызоде из комнаты, чтобы звук вопроизводился сразу после того, как мы вышли из комнаты. Добавьте объект Triggers->Trigger в коридор:
Теперь откройте окно свойств триггера и найдите параметр Events->Event. Это - имя события, которое будет посылать триггер. Напишите там что-ниудь типа "sound1". Теперь мы увеличим радиус триггера, т.к. по умолчанию он довольно мал. Измените значение параметра Collision->CollisionRadius на половину ширины вашего коридора. Теперь мы добавим объект звука. Мы будем использовать объект Triggers.SpecialEvent, который позволяет проигрывать звук по событию. Добавьте этот объект рядом с триггером и откройте окно его свойств. Сначала мы настроим его так, чтобы он проигрывал звук. Найдите параметр Object->InitialState и выберите там PlaySoundEffect. Теперь мы настроим его на наш триггер. Измените значение параметра Events->Tag на имя события триггера ("sound1"). Ну и наконец, добавим звук. Найдите параметр SpcialEvent->Sound. Мы добавим звук scream1 из группы OneShot файла AmbModern. Выберите этот звук и нажмите кнопку Use. Теперь перестройте карту и запустите. Вы должны слышать звук от компьютера, а когда вы выйдите из комнаты, вы услышите истошный крик. Возможно, вы захотите услышать крик только один раз, когда вы первый раз покидаете комнату, для этого поставьте параметр триггера Trigger->bTriggerOnceOnly в true.
Музыка
Уже довольно атмосферно, не так ли? Однако, музыка добавит в уровень еще больше атмосферности. В поле браузера выберите "Music" и нажмите кнопку Load. Теперь выберите любой umx файл, например EverSmoke. Вы можете послушать файл нажав кнопку Play внизу. Теперь добавьте эту музыку в уровень. Нажмите F6 чтобы открыть окно свойств уровня и раскройте строку Audio. Найдите параметр Song. Выберите из браузера понравившуюся вам мелодию и нажмите Use. Все, теперь в вашем уровне будет играть эта музыка.
Изменение музыки
Однако даже с музыкой наш уровень не очень атмосферен. Чтобы сделать его по-настоящему атмосферным, нам надо добавить интерактивную музыку. Это делается очень просто. Дело в том, что музыку в уровне всегда можно сменить используя Triggers->MusicEvent. Добавьте такой объект куда-нибудь в коридор и откройте окно его свойств. Раскройте строку MusicEvent. В поле Song выберите мелодию, в поле Section выберите секцию мелодии (0 - нормальная, 1 - предчуствие битвы, 2 - битва), в поле Transition выберите способ смены (MTRAN_Instant - мгновенно, MTRAN_xxxxFade - плавно, но с различной скоростью). Теперь измените значение Events->Tag на что-нибудь вроде changemusic и добавьте триггер с параметром Events->Event = changemusic там, где вы хотите, чтобы музыка сменялась. Вот и все. Перестройте уровень и запустите игру.
Использование звуков и музыки
Музыка и звуки могут добавить _ОЧЕНЬ_ многое в уровень. Правильная музыка в правильное время может заставить игрока дрожать и подпрыгивать от страха. Правильное расположение и использование звуков может сделать уровень намного атмосфернее и реалистичнее. Звук и музыка - это неотъемлемая часть любого хорошего уровня и использовать ее надо мудро. Слишком много изменений музыки или слишком частое использование одного звука может раздражать игрока. Если что-то должно воспроизводиться только один раз, то проверьте что это воспроизводится именно один раз. Также используйте звуки соответствующие теме уровня - не используйте футуристических звуков в древних замках и наоборот. Звуки и музыка могут добавить новое измерение в ваш уровень. Ну а теперь бегом добавляйте в ваши уровни звучание!


Untitled Document

Глава 2: Создание воды в UnrealED

Итак вы сделали свой самый первый уровень из трех (у некоторых больше) комнат, с монстрами, с оружием, в общем - полный отпад. Однако, поиграв в этот уровень пару часов вы вдруг замечаете что в нем страшно не хватает воды! Все Монстры мучаются от жажды и из-за этого еле стоят на ногах. Давайте исправим этот недостаток.
Зоны
Сначала немного поговорим об устройстве Unreal. Каждый уровень в Unreal может содержать до 64 зон. Зона - это полностью замкнутый участок пространства. В каждой зоне могут быть свои физические параметры - гравитация, трение, освещение, реверберация и т.д. Кроме того, разделение уровеня на зоны увеличивает скорость, т.к. движку легче определить какая часть уровня видна игроку, а какая - нет, и визуализировать только видимую игроком часть. Вода как раз и является такой зоной. Значит, чтобы создать воду надо создать замкнутое пространство и "сказать" движку что бы он поместил воду внутрь этого пространства. Теперь приступим к собственно действиям.
Собственно создание воды
Для начала сделайте стандартную комнату 256x512x512, наложите текстуры, добавьте источник света и место старта, в общем все как положено. Чтобы создать воду надо сначала сделать "дырку" для нее, а затем закрыть эту дырку поверхностью, чтобы внутри дырки образовалось замкнутое пространство. Ну и потом, естественно, "сказать" движку что внутри этого пространства у нас будет вода. Итак, по порядку...
Сначала сделайте браш любой формы (я например сделал куб 128x256x526), который мы вырежем из пола и тем самым создадим нашу "дыру" для воды.
Теперь подвиньте этот браш, чтобы его верхняя граница была на одном уровне с полом вашей комнаты, как на рисунке. Теперь вырезайте вашу дыру командой Substract. Наложите на нее какие-нибудь текстуры. Теперь нам надо закрыть эту дыру, чтобы внутри образовалось замкнутое пространство. Для этого служит инструмент "поверхность" (sheet). Нажмите правой кнопкой на кнопку с изображением квадратной поверхности ( [image]). Из меню выберите "Sheet properties...". Появится окно с параметрами поверхности. Три верхних параметра - это ориентация поверхности. Поставьте там Floor/Ceiling (Пол/потолок). Два значения ниже - это размеры поверхности. Нам надо чтобы поверхность закрывала всю дыру, так что сделайте вашу поверхность размером точно с вашу дыру (256x256).
Если у вас дыра не прямоугольная, то сделайте вашу поверхность такой, чтобы она полностью закрывала вашу дыру (см. рисунок).
Теперь подвиньте вашу поверхность повыше к уровню пола (чтобы она была ниже уровня пола на 1-2 клеточки) и загрузите текстуры воды. Большинство текстур жидкостей находятся в файле liquids.utx. Загрузите его и выберите понравившуюся вам текстуру. Теперь вы можете просто добавить вашу поверхность, и потом настроить ее параметры (по умолчанию поверхности не ограничивают зону, вам надо самомстоятельно поставить этот параметр) вручную, однако для этого есть способ проще. Убедитесь что ваша поверхность выделена и нажмите кнопку Add Special Brush ( [image]). Появится окно Add Special Brush. Из списка "Predefined:" выберите Water (вода, если кто не знает :) и нажмите кнопку Add Special. В 3D окне должна появиться поверхность воды. Если она не появилась, то попробуйте переделать (F8) ваш уровень. Если она не появилась и в этот раз то проверьте, находится ли камера внутри комнаты - поверхности, ограничивающие зоны в редакторе могут быть видны только из тех зон, которые она ограничивает (во сказал, а?). В противном случае повторите операцию еще раз. Итак, ваша дыра готова и теперь в ней образовано замкнутое пространство.
Осталось только "сказать" движку что в вашей дыре должна быть вода. Для этого существует класс Info.ZoneInfo.WaterZone. Просто добавьте его в любое место под водой.
Теперь переделайте уровень и можете в него играть.


Untitled Document

 Создание лавы и токсичной жидкости
Если вы захотите где-нибудь в уровне добавить не воду, а, например, лаву или противную зеленую токсичную жидкость, то вам надо сделать все то же самое, что и при добавлении воды, только вместо класса WaterZone добавлять класс LavaZone для лавы и SlimeZone для токсичной жидкости. Текстуры для лавы лежат в файле LavaFX.utx, а для токсичной жидкости можно приспособить пару текстур из файла GenFluid.utx (правда там они не анимированы).
Водопады
И, последнее о чем я расскажу вам в этой статье - это о том, как создавать водопады. Сделайте еще одну комнату размерами 512x512x512 и соедините ее с вашей первой комнатой коридором. Теперь сделайте куб размерами 128x512x128 и поместите его в центр вашей комнаты на уровень пола, это будет ваша вторая дыра для воды. Именно сюда и будет падать вода из водопада. Вырежьте этот куб, тем самым создав дыру. Наложите на нее текстуры. Теперь создайте куб размерами 448x32x128 (448 полчено путем сложения 128 (высота или глубина вашей дыры), 256 (половина высоты комнаты) и 64 (чтобы водопад не казался низким)).
Это и будет место где будет стекать вода. Поместите куб с любой стороны вашей дыры.Теперь вырежьте его и наложите текстуры.
Теперь закройте вашу дыру поверхностью воды размерами 544x128 (число 544 было получено в результате сложения 512, длины вашей дыры, и 32, ширины того браша, который мы только что вырезали, в результате чего наша дыра слегка расширилась) аналогично тому, как мы сделали это в первый раз. Добавьте под воду класс Info.ZoneInfo.WaterZone. Теперь нам надо добавить собственно падающую воду. Для этого мы тоже будем использовать поверхность. Вызовите окно sheet properties, там где указывается оринетация поверхности поставьте X-Wall или Y-Wall в зависимости от расположения вашего водопада. Оставьте ширину поверхности ("U:" ) равной 128, а высоту ("V: ") измените на число равное 256+64 (высота нашего водопада, если считать от пола комнаты) + расстояние от пола комнаты до поверхности воды.
Одна клетка по умолчанию равна 16 единицам. Значит, если у вас поверхность воды на одну клетку ниже пола, то высота вашей поверхности должна быть равна 256+64+16. Теперь поместите поверхность в центр того браша, который мы вырезали специально для падающей воды. Если вершины поверхности не совпадают с сеткой, то кликните правой кнопкой на любую вершину поверхности.
Теперь загрузите файл текстур gen_fluid.utx. В этом файле лежат все текстуры воды которые есть в файле Liquids.utx плюс еще много всего, однако текстуры там не анимированы. В данном случае нам не нужна красивая анимация текстур на самом водопаде, нам лишь нужно чтобы вода падала сверху вниз. Теперь выберите текстуру, которую вы использовали для водной поверхности в этом файле. Убедитесь что ваша поверхность для водопада выбрана и нажмите кнопку Add Brush ( [image]) Должен появиться собственно водопад. Если он не появился, то не расстраивайтесь.
Дело в том что поверхности по умолчанию односторонние, т.е. видны только с одной стороны. В 3D окне выйдите из комнаты и зайдите за водопад. Вы должны увидеть вашу поверхность...
Чтобы сделать поверхность двусторонней выделите ее, нажмите на ней правой кнопкой и в меню выберите Surface Properties (1 selected). В закладке Effects установите флажок "2-Sided". Теперь все должно быть OK. Нам осталось только сделать так, чтобы вода падала сверху вниз. Для этого в том же окне Surface properties в закладке Effects установите флажок V-Pan. В 3D окне кликните на маленькую кнопку в углу с изображением джойстика. Это включит обновление картинки в реальном времени. Если текстура движется не сверху вниз, а снизу вверх, то войдите в окно Surface Properties, закладка Rotate, и нажмите кнопку Flip V. Это перевернет вашу текстуру и она будет двигаться в нужную сторону. Однако, осталась одна проблема - этот водопад выглядит совсем нереалистично. Для того чтобы он выглядел намного реалистичнее мы растянем нашу текстуру по вертикали. Для этого вообще-то предназначается закладка Scale в том же окне Surface Properties, однако у меня работает только режим Simple Scaling, а нам сейчас ружен режим Custom Scaling. А так как он у меня не работает (скорее всего, у вас тоже не заработает), я буду растягивать текстуру вручную, через консоль. Выберите в меню команду Window->Log. Теперь выделите поверхность водопада и в окне Unreal Log Window напишите: POLY TEXSCALE UU=1 VV=0.2. Если у вас работает Custom Scaling, то в поле Texture V поставьте значение от 5 до 8.
Ваш водопад теперь стал выглядеть гораздо лучше...Для придания большей реалистичности можете также поставить парfметр V-Pan и для собственно поверхности воды в водопаде.
Все, теперь можете играть (Ctrl+P)! Конечно, этот водопад не самый лучший в мире, например, вода у нас просто течет из стенки, однако вы можете без проблем исправить этот недостаток. Впоследствии, когда вы научитесь новым вещам в UnrealED вы сможете улучшить ваш водопад - например, добавить звуки, туман и т.п. Счастливого создания уровней!


Untitled Document

Создание огня в UnrealED
Как вы уже могли заметить ходя по вашим уровням, свет в них приходил из ниоткуда. Не было никаких видимых источников света - фонарей, факелов и т.д. Сейчас мы исправим эту проблему. Ну а так как уровень у нас скорее всего сделан в готическом стиле, то в качестве источника света мы будем использовать огонь.
Самый простой способ создания огня
Как вы наверное уже знаете, огонь в Unreal состоит из нескольких перекрещивающихся плоскостей. Такой огонь создать довольно просто, однако проще всего испоьзовать уже готовый объект, который сделали товарищи из EpicGames - класс Light.TorchFlame . Для начала сделайте стандартную комнату 256x512x512. Теперь сделаем подставку для нашего огня. Добавьте в центр комнаты куб размерами 64x64x64 (если не знаете, то это делается кнопкой Add Brush [image] или просто Ctrl+A) Теперь в центр вашей подставки добавьте класс Light.TorchFlame. Как вы видите, на вашей подставке появился огонь. Однако он слишком большой для этой подставки, его надо уменьшить. Для этого кликните два раза на этом огне, появится окно TorchFlame properties. Раскройте строку Display. Найдите параметр DrawScale. Этот параметр показывает во сколько раз надо изменить размер объекта, например значение 0.5 сделает объект в два раза меньше, а значение 2 - в два раза больше. Измените значение этого параметра на 0.5. Теперь огонь как раз подходит под нашу подставку. Его осталось только придвинуть к подставке, а то он стал висеть в воздухе после того, как мы изменили его размер. Если вы переделаете ваш уровень сейчас, то вы увидите что огонь испускает очень мало света. Для исправления этой проблемы опять вызовите окно TorchFlame properties и раскройте строку LightColor. Вы увидите три параметра отвечающих за цвет данного источника света. Первый параметр, LightBrightness - это яркость цвета. Второй параметр, LightHue - это оттенок цвета (0 - красный, 32 - желтый, 64 - зеленый, 128 - голубой, 160 - синий, 255 - опять красный). Ну и третий - это LightSaturation, насыщенность, или вернее сказать, бледность цвета (255 - самый бледный, 0 - самый насыщенный).
Теперь поставьте яркость примерно в 128, оттенок примерно 16, и насыщенность где-то 120-150. Ваш огонь выглядит уже просто отлично!
Можете теперь переделать уровень и запустить его.
Создание огня из плоскостей
Итак, вы научились добавлять огонь в ваши уровни, однако иногда возникает необходимость создать огонь отличный от стандартного - например другого цвета. В этом случае вы должны сделать огонь из нескольких плоскостей при помощи инструмента "поверхность" (sheet). Сделайте вторую комнату 256x512x512 и соедините ее с первой. В центре комнаты соорудите подставку для огня (куб размерами 32x128x128). Теперь давайте делать сам огонь. Сначала загрузите текстуры огня (они находятся в файле GreatFire.utx).
Теперь создайте поверхность с ориентацией X-Wall (или Y-Wall). Поместите ее на нашу подставку.
Выберите подходящую текстуру (например, Ancflame2). Теперь нажмите кнопку Add Special Brush. В меню Predefined выберите Transparent window. В поле Visibility выберите 2-Sided и нажмите кнопку Add Special. Если текстура не совсем подходит по размеру, то ее можно увеличить/уменьшить в окне Surface properties, закладка Scale. Если надо подвинуть текстуру, то в том же окне для этого служит закладка Move. После манипуляций с текстурой, утстановите в этом же окне в закладке Effects флажок Unlit. Теперь в любом 2D окне нажмите правой кнопкой на вашу поверхность (именно на поверхность, а не на строительный браш. Его, лучше всего, пока отодвинуть подальше).
Из появившегося меню выберите Duplicate. Рядом с вашей поверхностью появится еще одна. Подвиньте ее и поверните так, чтобы они образовывали крест (видите, на рисунке светло-зеленая линия?).
Теперь осталось только одно - добавить источник света, ведь поверхности сами не излучают свет. Добавьте его и поместите над вашим огнем. Если вы хотите чтобы свет мерцал, то кликнув два раза на источнике света, вызовите окно Light properties. В этом окне раскройте строку Lighting. Найдите параметр LightEffect. Здесь можно установить разные световые эффекты. Чтобы сделать наш источник света мерцающим выберите LE_TorchWaver или LE_FireWaver. Если хотите, поменяйте цвет источника. Теперь вы можете переделать карту и играть. Конечно, вы можете сделать огонь не из двух, а из трех, четырех и даже шести поверхностей. Такой огонь будет выглядеть почти настоящим, однако если в нем будет слишком много поверхностей то игра будет заметно тормозить. Однако, в некоторых местах, когда огонь может быть виден только с одной стороны, для него можно использовать всего лишь одну поверхность. Все зависит от ситуации.
Создание дыма
Итак, вы научились делать огонь, однако какой же огонь без дыма? Давайте к нашему огню добавим еще и дым. Для этого существует два способа.
Первый способ:
- классы Effects.SmokeHose и Effects.SmokeHoseDest.
SmokeHose это точка из которой будет идти дым, а SmokeHoseDest - это та точка, куда он будет идти. Так что чтобы добавить дым надо всего лишь поместить класс SmokeHose прямо над огнем, а SmokeHoseDest чуть выше.
Вот теперь можете переделывать ваш уровень и играть.
Этот способ довольно прост, однако у него есть один очень существенный недостаток, который перевешивает все его достоинства - объектов SmokeHoseDest не может быть больше двух. Конечно, вы можете создать их хоть десять, однако дым из класса SmokeHose будет идти только в одну точку, в которой находится класс SmokeHoseDest созданный раньше всех. Поэтому я рекомендую вам пользоваться вторым способом, хоть он и немного сложнее.
Второй способ:
Этот способ - класс Effects.SmokeGenerator. Этот класс похож на SmokeHose, однако ему не нужен никакой другой класс для указания точки в которую будет идти дым. Он будет всегда идти вверх. Основным отличием SmokeGenerator'a от SmokeHose'a является то, что SmokeGenerator нужно сначала "включить". Для этого используется триггер. Простой триггер - это такой объект, который при некотором условии (по умолчанию - когда игрок входит в зону действия триггера) посылает сообщение, а другой объект его принимает. Это сообщение указывается в поле Events->Event настроек триггера. Чтобы какой-то объект "принял" это сообщение нужно записать поле Events->Tag объекта это же сообщение. Так что удалите объекты SmokeHose и SmokeHoseDest, и вместо SmokeHose создайте SmokeGenerator. Теперь найдите место, где у вас находится PlayerStart. Поднимите сам объект PlayerStart повыше, а прямо под ним добавьте класс Triggers.Trigger (не раскрывайте его). Это надо чтобы триггер посылал сообщение сразу после начала игры. Теперь дважды щелкнув на ваш триггер вызовите окно его параметров и впишите любое уникальное название события (например SmokeTrigger) в поле Events->Event. Также измените значение параметра Trigger->bTriggerOnceOnly на True чтобы наш триггер мог быть активирован только один раз в самом начале игры. В противном случае при возврате на место старта наш триггер активировался бы заново и отключил бы наш SmokeGenerator. Теперь откройте окно настройки SmokeGenerator'a и впишите это же сообщение в поле Events->Tag. В 2D окнах эти два объекта должы соединиться темно-красной линией. Вот собственно и все. Можете переделывать уровень и играть... Удачи вам и счастливого уровнестроения! ;))


Создание порталов

Создание порталов в UnrealED
Одной из интереснейших особенностей движка Unreal являются порталы. Порталы - это такие зоны, при входе в которые вы оказываетесь в другой "портальной" зоне. Однако порталы не только перемещают игрока в пространстве (чего же тогда тут интересного - телепортеры появились еще в Doom'e), но и позволяют видеть все, что происходит в другом портале, стрелять сквозь портал. В общем, портал - это такая "дыра", концы (или начала :) которой могут находиться в совершенно разных местах, некое "окно" в другое место.
Устройство
Как я уже сказал, портал это особая зона. Зона эта называется Warp Zone, и чтобы ее создать нам нужен объект WarpZoneInfo. Ну а поскольку зона портала должна вести игрока в другой портал, то таких зон надо две. Итак, все что нужно для создания порталов - это два постамента (или два окна, или две дыры - это ограничено только вашей фантазией), внутри которых имеется по одной Warp Zone.
Собственно создание порталов
Сначала сделайте две не соединенных между собой комнаты любых размеров, желательно отличающихся друг от друга. Поместите в одной из них PlayerStart.
Теперь приступим к созданию порталов. Для начала создайте в каждой комнате два примерно таких постамента.
Постамент сделан из двух брашей - большого куба 192x192x64 и вырезанного из него куба поменьше - 176x160x48. Ну а теперь мы добавим в каждый постамент по зоне. Сначала отделите пространство внутри постамента поверхностью. Текстуру для поверхности можно выбрать либо из файла GenWarp.utx либо из какого-нибудь *FX.utx. Я, например, выбрал текстуру Pad_FX из файла Old_FX.utx (она лежит в группе Effects). Не забывайте, что поверхности надо добавлять кнопкой Add Special Brush. В окне Add Special Brush выберите параметры Regular, 2-sided, Transparent, Zone Portal. После добавления поверхности выберите ее, нажмите правую кнопку и откройте окно свойств поверхности. В закладке Effects отметте флажок Unlit. Проделайте то же самое с другим постаментом. Теперь добавьте объект Info.ZoneInfo.WarpZoneInfo внутрь каждого постамента. Выберите один из объектов WarpZoneInfo и откройте окно его свойств. Раскройте строку WarpZoneInfo и найдите два параметра, ThisTag и OtherSideURL. ThisTag - это имя данного протала, OtherSideURL - это имя портала, в который ведет данный портал. Так что поставьте ThisTag=portal1, OtherSideURL=portal2 у одного портала и ThisTag=portal2, OtherSideURL=portal1 у другого портала. Теперь перестройте уровень и запустите игру. По идее, все должно работать. Однако, лично у меня в Unreal Tournament часто возникают странные глюки с порталами, вроде мерцания или эффекта HOM (Hall Of Mirrors). Причем в Unreal все в порядке. Как вы (наверное) видите, сквозь порталы можно спокойно видеть, слышать, стрелять. Однако (глюк), нельзя стрелять из "мгновенных" видов оружия (Enforcer, Automag, Minigun etc.) - выстрелы "застревают" в портале.
Создание телепортеров в стиле UT
Как вы может быть уже заметили, на стандартных картах UT порталов нету.
Вместо них в UT используются телепортеры вот такого вида.
Телепортеры - это уже не порталы, они устроены намного проще. Это просто объекты, которые перемещают игрока в пространстве. Сквозь них нельзя стрелять, видеть, слышать и т.п. При помощи телепортеров можно только перемещаться. Телепортеры создавать намного проще, чем порталы - ведь для них не надо никаких постаментов и зон, каждый телепортер - это отдельный объект. Для того чтобы добавить телепортер в уровень, добавьте объект (а точнее два) NavigationPoint.Teleporter.VisibleTeleporter. Теперь откройте окно свойств телепортера. Найдите параметр Events->Tag. Это имя данного телепортера, напишите там что-нибудь вроде "teleporter1". Теперь найдите параметр Teleporter->URL. Это имя того телепортера, в который вы телепортируетесь. Наберите там "teleporter2". Теперь смените Tag и URL второго телепортера на teleporter2 и teleporter1 соответственно. Все, телепортеры готовы, можете проверить.
Создание невидимых телепортеров/выходов с уровня
Иногда требуется добавить телепортер так, чтобы его не было видно (см. карту CTF-Face), для этого вместо VisibleTeleporter надо добавить просто NavigationPoint.Teleporter. Все параметры точно такие же. Создать выход с сингл-плеер уровня на следующий - это уже сложнее. Для этого надо сначала добавить два Teleporter'а, первый в самом конце одного уровня и второй в самом начале следующего. Tag второго надо установить во что-нибудь типа "SecondLevelEntry". Теперь URL первого поменяйте на "SecondLevel#SecondLevelEntry?peer", где SecondLevel - название следующего уровня. То есть формат строки URL такой: "Имя_уровня#имя_телепортера?peer". Для чего нужен ?peer мне неизвестно, но в оригинальных уровнях он всегда присутствует. Вот вы и познакомились с порталами и телепортерами. Ну а теперь быстренько запускайте UnrealED (если он еще не запущен) и начинайте добавлять их в свои уровни...


Кикеры

Автор : ReZOnAnS
Кикеры

Прогуливаясь по картам других челов, ты наверняка замечал такую вещь: заходишь на определённую площадку и она тебя закидывает на определённую высоту. Такая вещь реализуется с помощью такого актёра, как Кикер.

Как это делается...

Итак, рассмотрим создание кикера на примере.

Создаём площадку, как те, которые ты видел, прогуливаясь по уровням других мэпмэйкеров (мне, например, пришлось поёрзать в 2dShaper`e). Накладывай на неё текстуры (на верхнюю площадку - FractalFX->DaveJump, на борта - лампочки, названия длинные - сам найдёшь). Теперь кидаешь в центр площадки собственно сам Kicker, который обитает по адресу Actor->Triggers->Kicker в Actor Browser`е. Прижми его поближе к площадке. Открываем его свойства, пункт Kicker. Нас здесь интересует KickVelocity. Это, как раз, то, что управляет тем, куда забросит игрока. Раскрываем его. Итак, если смотреть в Top окне, то в соответствии со знаком параметра тебя будет кидать: X(+ вправо, - влево), Y(+ вниз, - вверх), Z(+ будет выбрасывать вверх, - вниз). Кстати, залезь в свойства кикера - Collision->CollisionHeight и CollisionRadius - эти два параметра отвечают на то, на каком растоянии будет реагировать твой кикер. Поставь Height=32, Radius=ширина твоей площадки. Далее. Там ещё, в разделе kiker есть такая вещь - Killvelocity. Так вот, эта вещь убирает сопротивление гравитации. Т.е. чтобы не маяться каждый раз при создании кикеров на своих уровнях с разной гравитацией (ведь ты будешь делать и такие, ты ж собираешься стать крутым мапмэйкером ;)?) просто включи этот параметр. ОК. Запускай мапу и попрыгай. ОК.

Но кикер без звука - не прикольно. Ну на какой мапе ты видел кикер без звука? А? Вот. Сейчас мы сделаем так, чтобы когда кикер срабатывает, проигрывается звук. ОК. Для начала найди подходящий звук. В принцепе, можешь выбрать любой, но негласно принятый стандарт - Unreall->Pickups->BootSnd. Выдели его. Теперь в том же разделе, Actor->Triggers находишь такую вещь - SpecialEvent. Она много для чего годится, но мы сейчас коснемся только одного его аспекта - проигрывание звука по событию. ОК. Кидай его на площадку прямо в её центр... да, да, там где находится кикер. И, желательно, опять же, поближе к ней. Открываем его свойства. Object->InitialState, поставь там PlaySoundEffect. Потом идёшь в закладку его свойств - SpecialEvent. Там есть пункт - Sound. Если ты не снял выделение со звука - жми по Use. Далее. Открываем свойства кикера - Events->Event - поставь там значение SpecialEvent (это если ты не изменил Tag у SpecialEvent`a). Оттащи SpecialEvent немного в сторону - между ним и кикером должна быть видна красная линия. Поставь его на место. Всё. Ребилдь на всякий случай и запускай мапу. Оп! :)


Детализация - Подставка для факела

Детализирование уровней в UnrealED
Итак, вы научились делать уровни из нескольких комнат, добавлять в них актеров, воду и даже огонь. Однако если вы хорошенько присмотритесь к вашим уровням, то вы заметите что они очень примитивные и их архитектура оставляет желать лучшего. Давайте добавим деталей в ваш уровень.
Создание брашей
Как вам уже известно, браш - это любой объект который можно добавить к уровню или вырезать из него. В UnrealED есть несколько стандартных брашей - это куб, сфера, цилиндр, конус, три вида лестниц и поверхность. Детализирование уровня заключается в создании своих собственных брашей из уже имеющихся и добавлении/вырезании их из вашего уровня. В процессе создания своих брашей очень часто используются операции intersect и deintersect. Я вам напомню что делают эти операции. Intersect ( [image], Ctrl+N) удаляет ту часть браша, которая лежит в пустоте и оставляет часть, которая лежит в сплошном пространстве. Deintersect ( [image], Ctrl+D) делает все наоборот - удаляет ту часть браша, которая лежит внутри сплощного пространства и оставляет ту его часть, которая находится в пустоте. Теперь давайте сделаем первый браш.
Подставка для факела
Вспомните, что мы с вами делали в последнем уроке. Правильно, огонь. Только он у нас располагался на квадратной подставке на полу. Давайте сделаем нормальную подставку для факела и поместим ее на стену. Для начала сделайте комнату размером 512x1024x512. Кроме того вам потребуется отдельная "строительная" комната, где вы будете собственно создавать ваши браши. Сделайте где-нибудь вне уровня такую комнату размерами где-то 1024x1024x1024. Добавьте туда несколько источников света. О текстурах можете не беспокоиться - все равно эта комната не является частью вашего уровня. Итак, давайте начнем делать нашу подставку. В качестве основы для нее мы возьмем конус. Нажмите правой кнопкой на кнопку с изображением конуса ( [image]) и выберите из меню "Cone properties..." чтобы вызвать окно параметров конуса. Поставьте параметр Height (высота) в 128, а Outer radius (внешний радиус) в 64. Об остальных параметрах можете не беспокоиться. Нажмите кноку Build. Так как огонь у нас будет находиться не на кончике нашего конуса а на основании, переверните конус.
Теперь придвиньте его к стенке комнаты так, чтобы одна половина конуса была слева, а другая справа.
Чтобы получилась готовая подставка нам надо удалить одну половину конуса. Для этого примените операцию Deintersect. Как видите, от конуса осталась только одна половина. Теперь добавьте этот конус в строительную комнату и наложите на него текстуры. После того как вы все закончили, в любом 2D окне нажмите на подставку (не на строительный браш, а на готовую подставку) правой кнопкой и в меню выберите Copy polygons->To brush. Вы увидите что ваш строительный браш принял форму подставки. Кроме того, когда вы его добавите он будет иметь такие же текстуры, хотя вы этого видеть не можете.
Теперь добавьте пару таких подставок на стены в вашей основной комнате и поместите на каждую подставку огонь (можете сделать это любым способом).

В целях экономии времени, рекомендую вам просто добавить туда объект TorchFlame и поменять DrawScale на 0.5-0.7.

Можете переделывать ваш уровень и играть.


Детализация 2 - улучшеный держатель

Автор : Hruka | Держатель для факела
Вы сделали подставку для факела, однако этот объект достаточно примитивный, кроме того он состоит всего лишь из одного браша. Давайте сделаем более сложный держатель для факела из нескольких брашей. Переместитесь в строительную комнату. Сначала мы сделаем верхнюю часть, где и будет располагаться огонь. Это будет конус с параметрами Height=32, Outer radius=64. Добавьте его куда-нибудь в строительную комнату. Теперь мы добавим еще ожин маленький конус снизу.
 | Сделайте конус с высотой 32 и внешним радиусом 16. Поместите его как показано на рисунке.
Теперь добавьте его. Нам осталось сделать только только небольшую палку на которой это сооружение будет держаться.
 | Для этого создайте куб 8x8x128 и поместите его вот так.
Если вы не можете его так поместить, то нажмите правую кнопку на пустом месте в любом 2D окне и в меню выберите Grid->4 units. Это сделает размер одной клетки равным 4 пунктам вместо 16 по умолчанию. Добавьте этот куб. Наш держатель почти готов. Если вы еще не наложили на него подходящие текстуры, сделайте это. Теперь нам надо сделать один браш из этих трех объектов, чтобы потом добавить его в нашу комнату. Для этого можно использовать операцию intersect. Сделайте куб размерами 128x256x256 и поместите его так, чтобы наш держатель полностью находился внутри него, но чтобы кроме держателя внутри куба ничего не находилось. Теперь примените оберацию intersect. Вы увидите как ваш куб принял форму держателя. Теперь удалите подставки для факелов сделанные вами ранее и добавьте вместо них наш браш в форме держателя. Ну и естественно добавьте огонь. Для держателей такого размера необходимости изменять параметр DrawScale нету.
 | Вот примерно то что у вас должно получиться.
Переделайте уровень и запустите Unreal чтобы посмотреть на ваше творение. Там оно будет выглядеть несколько лучше чем в маленьком софтварном окошке UnrealED'а.


Детализация 3 - Колонны

Колонны
Теперь посмотрите на вашу комнату. Здесь явно не хватает колонн, поэтому давайте добавим их. Однако, эти колонны тоже будут не простыми цилиндрами, а слегка модифицированными. Эти колонны будут расширятся сверху и снизу. Переместитесь в строительную комнату и создайте основу для будущей колонны - цилиндр высотой с нашу комнату (512) и радиусом 32.
Теперь сделаем утолщения. В качестве утолщений мы возьмем два конуса с высотой 64 и таким же радиусом. Добавьте эти конусы вверху и внизу колонны.
Теперь сделайте подходящего размера куб (где-то 512x128x128) и поместите его так же как и в предыдущий раз (чтобы вся наша колонна находилась внутри куба, но чтобы кроме нее внутри куба ничего не было).
Примените операцию intersect. В результате вы получите браш в виде колонны. Теперь добавьте шесть таких колонн в вашу комнату.
Можете переделывать ваш уровень и играть...
Светильник
Итак, у нас есть два факела на стенах, но они освещают только одну половину комнаты. Чтобы осветить другую половину, мы добавим туда напольный светильник. Переместитесь в строительную комнату. Для начала добавьте куб размерами 64х64х64. Это основа нашего светильника.
Сейчас мы вырежем из нее середину. Для этого сделайте куб 48х48х80 и поместите его так, чтобы он проходил сквозь наш основной браш точно посередине.
Теперь вырежьте этот браш. Поверните его на 90 градусов и опять вырежьте. У вас должен получится браш в виде клетки с четырьмя прутьями по углам. Для нашего светильника мы добавим еще четыре на каждой стороне. В качестве оных мы используем куб размерами 48x8x8. Добавьте по прутику в середине каждой стороны.
Если вы не можете пометить прут точно в середине стороны используйте способ изложенный выше (Grid->4 units). У вас должна получится примерно такая клетка.
Так как наш светильник будет располагаться на полу, мы сделаем подставку для него.
Добавьте цилиндр высотой 64 и радиусом 16 под светильник, что бы он как бы стоял на цилиндре. И, наконец, добавьте куб 16x64x64 под цилиндр. У вас должно получиться что-то типа этого.

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

Удачи вам!


2D редактор

 Использование 2D редактора
В одной из моих прошлых статей, а именно в статье "Детализирование уровней", я рассказал о процессе создания новых брашей. Способ создания брашей, описанный в той статье используется очень часто (почти всегда). Однако таким способом довольно трудно создать некоторые формы (например туннель произвольной формы, тор (бублик) и т.п.). Поэтому в UnrealED, как впрочем и в любой хорошей программе для 3D моделирования, есть свой 2D редактор, при помощи которого такие объекты делать довольно просто. Этому редактору и будет посвящена статья.
2D редактор
2D редактор вызывается из меню Window командой 2D Shape Editor(Experimental). Как вы видите, этот редактор назван "Экспериментальным". Причин тому три: баги, глюки и ошибки, коих здесь предостаточно. Если вы будете делать что-то неправильно, то редактор выдасть сообщение об ошибке и закроется. Этот редактор не совершенен. И хотя это очень мощное средство для создания брашей, у него есть свои пределы. При помощи редактора можно сделать подходящую 2D форму и затем "выдавить" ее в 3D объект. Если вы ранее работали с программами 3D моделирования, то вам уже знаком этот принцип. Если нет - то просто попробуйте "выдавить" форму и вы все поймете. Но вернемся к глюкам, багам и ошибкам. Работая в 2D редакторе, чаще сохраняйтесь (File->Save). Не допускайте пересечения линий формы. Не пытайтесь отменить ваше неправильное действие. Не пытайтесь минимизировать окно редактора. Все это приведет к ошибке. Если вы сделали что-то неправильно, просто закройте окно редактора и откройте его опять. Конечно, допустить ошибку в процессе создания сложной формы очень неприятно. Но вас предупредили, что редактор экспериментальный.
Начинаем...
Теперь вы знаете "правила общения с 2D редактором" и можно начинать работу. Откройте редактор. Вы должны увидеть черное окно с синей сеткой и большим треугольником в центре. Этот трегольник и есть ваша 2D форма, именно его вы будете редактировать добавляя и перемещая вершины. Перемещать вершины очень легко - просто кликните на вершину и тащите ее мышкой. Теперь посмотрите в центр окна. Видите крестик в центре? Это - центр вашей формы. На данный момент он нам не особенно нужен, однако потом вы поймете зачем он здесь. Давайте приступим к созданию простой формы. Сначала вы наверное захотите добавить еще одну вершину. Нажмите на любую вершину треугольника. Вы увидите как одна из сторон треугольника, выходящая из этой вершины, подсветилась. Чтобы подсветить другую сторону, выходящую из этой вершины, кликните на эту вершину еще раз. Теперь выделите правую сторону треугольника. Чтобы добавить вершину, нажмите Ctrl+I (или из меню выберите Vertex->Insert). Как вы видите, подсвеченная сторона разделилась этой вершиной пополам, на две отдельных стороны. Вы можете двигать эту вершину точно так же как и остальные. Вставляя новые вершини и двигая их можно получить почти любую форму. Ограничение только одно - не допускайте пересечения сторон. Теперь про сетку - длина одной клетки всегда равна 16 единицам. Так что сделав квадрат 4x4 клетки и выдавив его на 64 единицы, мы получим куб 64x64x64. Теперь закройте окно редактора и откройте его снова.
Вы опять увидите треугольник. Добавьте к нему еще одну вершину и превратите его в квадрат 128x128.
Теперь давайте сделаем из этого квадрата какой-нибудь 3D объект. Выберите команду "Extrude"(выдавить) из меню "Loft". Измените значение Depth на 256 и нажмите "Build". Вы получите куб 128x128x256. Зачем? - спросите вы, - ведь у нас есть кнопка Build a cube! А просто так. На этом примере я просто показал, что значит "выдавить" форму. Попробуйте изменить значение Depth на какое-нибудь другое и посмотрите что получится. Думаю, вам сразу станет понятно, что такое выдавливание. Эта форма просто "двигается" вниз на заданное кол-во единиц и получается 3D объект. Давайте сделаем другую форму. Закройте редактор, откройте его опять. Не меняйте форму треугольника, а сразу выберите Loft->Extrude. Оставьте все значения по умолчанию и нажмите Build. У вас получится 3D объект в форме призмы. Т.е тот же самый треугольник, но "вытянутый" вниз на 64 единицы.
Другие способы создания 3D объекта
Вы наверняка заметили, что в меню Loft кроме Extrude есть еще несколько команд. Все эти команды служат для получения разными способами 3D объектов из 2D формы. Build Sheet - просто создает 2D поверхность. Для этой команды даже нету никаких опций. Revolve - вращает нашу форму вокруг центра - того самого крестика, о котором говорилось в самом начале.
Заново откройте редактор и переместите вершины треугольника вот так.
Теперь выберите Loft->Revolve. Как вы видите, справа есть два параметра, Sides per 360 degrees и Number of sides. Первый параметр влияед на детализированность объекта и показывает сколько сторон надо на объект, полученный вращением формы на 360 градусов вокруг центра:
Второй параметр показывает сколько сторон должно быть в объекте. Если значение этого параметра будет равно значению первого параметра, то мы получим замкнутое кольцо. Если оно равно половине этого параметра, то мы получим полукруг, если четверти - то четверть круга и т.д. Revolve можно использовать для создания тора, изогнутых коридоров и тому подобных вещей. Extrude to point - то же самое что и обычный extrude, только объект выдавливается в точку. Например, если выдавить квадратную форму на 64 единицы используя extrude to point, то мы получим квадратную пирамиду с высотой 64 единицы. Bevel - то же что и extrude to point, только с острия пирамиды срезается некоторая часть, которая устанавливается параметром Cap height:
Создание арки
Ну а теперь, когда вы уже знаете как работает 2D редактор, можно уже сделать какой-нибудь полезный браш, который можно использовать в вашем уровне. Пусть это будет закругленная арка. Для начала загрузите текстурный package под названием NaliCast.utx и создайте стандартную комнату 256x512x512.
Теперь выберите текстуру Arch->WRC_Door (самая последняя в этой группе), измените размер куба на 256x32x512 и добавьте эту перегородку в центр вашей комнаты. У вас должно получиться примерно вот это:
Теперь мы в 2D редакторе сделаем браш, которым мы сможем вырезать эти черные дыры и получить нормальные арки. В 2D редактор можно загружать BMP изображения чтобы использовать их как "направляющие" для ваших форм. Мы загрузим в редактор текстуру нашей арки, сделаем форму в точности повторяющую ее форму и выдавим эту форму чтобы получить конечный браш. Сначала мы превратим нашу текстуру в BMP изображение. Для этого выберите ее и внизу нажмите кнопку Export. Созраните текстуру в файл wrcdoor.pcx. Теперь нам надо кнвертировать ее в формат BMP. Для этого подойдет любой графический редактор, например стандартный Paint. Просто загрузите в него эту текстуру и сохраните как 256-цветный BMP файл. Теперь откройте 2D Shape Editor, выберите команду меню Image->Load Image и загрузите текстуру. Теперь создайте форму полностью повторяющую форму арки.
Вам скорее всего будет мешать привязанность вершин к сетке, поэтому ее надо отключить (Grid->Snap to grid). Вот примерно то, что у вас должно получиться:
Теперь выдавите этот браш на 32 единицы (это ширина нашей перегородки). Не забудьте изменить Loft plane (плоскость в которой форма будет выдавливаться) на X или Y. Переместите его сначала в левую арку и вырежьте, затем в правую арку и тоже вырежьте. Вот что должно получиться:

Вот и все. Этот браш можно сохранить выбрав в меню Brush->Export..., но еще лучше - сохранить 2D браш, чтобы потом из него делать все, что душа пожелает. Можно, например, сделать два полукруглых коридора в разные стороны используя Revolve. Но это вы уже будете делать сами. Удачи вам!


Клиппинг

Автор : Юрий "Vened" Лавриков
Brush Clipping
Очень часто вам приходится сталкиваться с необходимостью создания браша нестандартной формы. Перетаскивание вершин - это, конечно, выход, но можно сделать все гораздо проще и быстрее (правда не во всех случаях, ньюансы ниже по тексту). Здесь вам и пригодится очень мощное средство по редактированию брашей - brush-clipping. Сразу оговорюсь, что в данной статье я не буду пытаться объяснить вам все возможности данного метода, а дам лишь основные навыки работы с clipping'ом. Дальше все будет зависеть от ваших экспериментов и смекалки.
Работа с вырезкой\врезкой на примере...

Эта кнопка активирует режим "резки брашей".

Сделаем, для примера, восьмиугольную колонну.

Для начала, установим параметры строительного браша (куба) в 800х128х128. "Клиппинг" (введем такой термин, так будет короче и понятней) будет работать как на строительном, так и на готовом браше.

Построим браш:

Теперь выбираем окно с видом сверху (Top) и активизируем режим клиппинга, нажав вышеупомянутую кнопку. Теперь нам предстоит расставить clip-маркеры (по внешнему виду они представляют из себя офисные булавки):
Расставить их можно, щелкая по вершинам правой или левой кнопкой мыши. Можно добавить и третий и четвертый маркер, но сейчас нам это не нужно. Абсолютно не важно, где будут расположены два наших маркера (внутри браша, под или над ним), все зависит только от того, в каком окне проекций вы собираетесь работать. Потому что красная линия, соединяющая маркеры, представляет собой как бы "проекцию плоскости", по которой будет происходить "резка" браша. Делать треугольную колонну не входит в наши планы, поэтому маркеры мы будем двигать, выбрав их левой кнопкой мыши и зажав Shift или Ctrl. Сами маркеры могут находиться как на границе браша, так и за его пределами.

Короткая красная линия, перпендекулярная соединяющей маркеры, "указывает" на ту сторону, которая при резке будет удалена. Поменять ее направление можно нажав на эту кнопку:

Теперь удалим ненужную часть, выделив нужный нам браш левым кликом и нажав на кнопку clip selected brushes [image], причем в случае со строительным брашем, кнопка split selected brushes [image], будет иметь тот же эффект, тогда как в случае с готовым брашем (additive или subtractive), исходный браш будет разделен надвое, согласно положению клип-маркеров, положение линии-указателя в данном случае не имеет значения:

Нам не нужно делить браш (тем более он у нас строительный), поэтому мы должны нажать кнопку clip selected brushes, убедившись заранее, что линия-указатель направлена в сторону от центра нашего исходного браша. Затем можно удалить клип-маркеры (вручную или нажав на кнопку [image]), а затем установить их в нужном месте, или, просто выделив оба маркера, перемещать и вращать их стандартными способами, добиваясь нужного положения. В конце концов должно получиться нечто подобное:

Теперь можно экспортировать браш, или сразу, "на месте", добавлять его в вашу карту.

Вот и все. Вперед! Резать ваши браши! :)


Обьединение полигонов

Автор : Merging Poly's by Andy Ford
Объединение полигонов
Эта функция особенно полезна, при создании браша с помощью 2D Shape editor. Даже создавая куб, поверхности верха и низа разделены на 2 разных полигона. Вот, например, в 1-ой фигуре вся поверхность опорной стойки состит из одного полигона, но когда она была создана в 2D Shape editor, состояла из нескольких. Т.к. текстуры были под разным углом друг к другу, выравнивание [aligning] текстур было довольно затруднительно, но после сливания полигонов, у меня была лишь одна поверхность.

Трудно поверить, но вся сторона была выделена одним кликом!

Как это получилось? В конце концов, в Фигуре 2 вы можете видеть, что она состоит из нескольких полигонов.

Для начала, вам нужно произвести определенные выравнивания текстур (не обращайте внимания на синий браш Фигуры 2).

1. Выберите все вертикальные стороны браша (включая те, которые под углом) и выберите Align to Wall.

2. Выберите все горизонтальные стороны браша и нажмите Align to Floor.

Теперь правым кликом по брашу и выбираем Polygons/Merge.

Наконец, компилируем карту ( Rebuild).

P.S. В едиторе, браш будет все еше виден, состояшим из многих полигонов, это позволяет разъединить их обратно.


Построение зон

Автор : Тим Свиней Epic MegaGames , Inc.

Перевод: Yury JIP

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

Уровни Unrealа могут быть огромны; многие из наших готовых уровней помещают 20,000 полигонов. Одновременно, игрок обычно видит только100-200 полигонов, крошечную часть из этих 20,000 . Engine игры тратит огромное количество времени ЦЕНТРАЛЬНОГО ПРОЦЕССОРА на выделение и расчет полигонов, которые мы видим в каждой сцене, из общего количества всей карты. Unreal Engine использует несколько методов, чтобы ускорить этот процесс. Большинство этих методов не требует никакого вмешательство проектировщика. Однако, один из наиболее мощных методов, зонирования, требует, чтобы проектировщики уровня вручную поместили невидимые полигоны, так называемые, Zone Portals в их уровнях. Зоны значительно ускоряют вычисления видимости движка, и они также дают возможность проектировщикам создать много специальных эффектов, которые являются специфическими для данной области, типа тумана, отражаемость света (Ambient lighting) или измененной силы тяжести. Зона - это не материальная (осязаемая) часть трехмерного пространства, как, например, комната, а комплексная группа нескольких взаимосвязанных участков уровня Деля вашу карту в зоны, Вы получаете несколько выгод:

  • Быстродействие. Удачно разделенный на зоны уровень обычно ускоряет процесс расчета движком более чем на 100 % в сложной карте, по сравнению с не зонным уровнем.
  • Отражаемость света (Ambient lighting). Каждая зона может иметь ее собственное значение отражаемости света, которое добавляется к постоянному освещению на каждой поверхности. Отражение света очень полезно на открытом пр-стве, где чистые черные тени неестествен, также как в диффузных средах, где можно было бы ожидать более темные тени.
  • Реверберация. Каждая зона может иметь ее собственные звуковые реквизиты реверберации (эхо, скорость звука и т.д.)
  • Физические свойства пространства, типа трения и силы тяжести.
  • Вода.
Наблюдение зон

UnrealEd имеет специальный режим, который дает возможность Вам видеть зоны вашего уровня графически, где каждая зона выполнена в отдельном цвете. В UnrealEd, в меню трехмерной области просмотра, выбирают Zone/Portal view. Вы можете также видеть это в игре, печатая RMODE 2 в консоли.

В UnrealEd, зональные проходы (zone portals) обычно видимы, и Вы не можете видеть через них. Чтобы убрать их, нажмите кнопку джойстика [image] в области просмотра, которая включает обновление в реальном масштабе времени области просмотра. Рекомендуется использовать это только для предварительного просмотра вашего уровня, поскольку это значительно замедляет остальную часть интерфейса пользователя редактора.

Выделение разделов уровня в зоны

Вы можете выделять части уровней в зоны, используя специальные виды brush, зональных порталов (zone portals), запечатывать области их карт и делать их герметичными.

В UnrealEd имеются два инструмента для создания зон:

  • Sheet brush - [image]. Нажав соответствующий значок на инструментальной панели, Вы сформируете плоский квадратный полигон. Используя этот инструмент, Вы сможете построить пространственные зоны. Вы должны создавать полигоны, достаточно большие, чтобы полностью отсечь нужную Вам часть пространства(для изменения параметров используйте меню всплывающее при нажатии правой клавиши мышки).
  • Add special brush - [image]. Этот инструмент дает возможность Вам добавить полигон к миру со специальными реквизитами. Когда Вы нажимаете Аdd special brush, небольшое диалоговое окно предлагает несколько опций. Выберите Zone Portal. Затем установите Ваш Sheet brush и нажимайте add, когда вы готовы.

Используя инструменты Sheet brush и Add special brush, разделите свою карту на зоны. Затем, вызвав опцию Build Geometry, перекомпилируйте Ваш уровень. Компилятор просмотрит вашу карту и назначит уникальную зону к каждой области. Вы можете войти в Zone/Portal просмотр, чтобы проверять, графически, правильно ли ваш уровень разделен на зоны.

Если, в Zone/Portal просмотре, Вы видите, что Engine не распознал ваши зоны, Вы, вероятно, не сделали Zone Portal герметичными. Тогда Вы должны увеличить их, что бы отдельные зоны полностью блокировались друг от друга. Если, в игре, Вы видите эффект "зал зеркал ", в том месте, где Вы поместили портал, то удостоверьтесь, что ваши Zone Portal полностью запечатывают области пространства, которые они отделяют. Если Вы имеете портал, который только частично заполняет проход, Вы можете увидеть через него небытие (:)).

Где помещать зональные двери

Для специальных зон, подобно зонам воды, Вы должны поместите Zone Portal везде, где нужно ограничить данную зону и избежать утечки.

Для зон, чья цель только ускорить Engine, Вы должны делить Ваш уровень в зоны порталами как можно меньшими по размеру. Следовательно, Надо помещать Zone Portal в проходы, которые естественно отделяют большие области, типа дверных проемов, узких проходах и прихожих. Этот подход удачно разделит уровень, без добавления слишком много количества Zone Portal.

Нет никакой пользы (и часто даже наоборот) в размещении Zone Portal в середине больших комнат. Эти огромные двери обычно едят большее количество времени ЦЕНТРАЛЬНОГО ПРОЦЕССОРА, чем экономят.

Добавление ZoneInfo actors , для определения свойств зоны

Если Вы хотите назначать индивидуальные свойства зоны, типа воды, отражения света, или реверберации, Вы должны добавить объект ZoneInfo [image] в Вашу зону. Это надо делать, если только Вы хотите назначать специальные свойства зоны; если Ваша цель- быстродействие, Вы не должны добавлять ZoneInfo.

В окне просмотра классов, откройте класс Info, и выберите ZoneInfo. Вы можете добавлять ZoneInfo в любое место Вашей зоны; но не больше, чем один ZoneInfo и в пустом месте (не занятом другими actors и brushes). Для UnrealEngine, чтобы распознать ваш ZoneInfo , Вы должны перекомпилировать Вашу карту снова.

В окне свойств ZoneInfo имеются много крутых изменяемых параметров, типа трения, силы тяжести, отражения света, боли, воды, и т.д.

Вода и прозрачные порталы

фСоздавая зону воды, найдите в браузере классов в разделе ZoneInfo - WaterZone. Код физики Unreal Engine автоматически распознает эти зоны воды и разницу между идущим и плавающим игроком или объектом.

Чтобы сделать ясную воду, надо выделить поверхность воды, выбрать Surface Properties (свойства поверхности) и включить опцию Translucent (прозрачность).

Предупреждение
Уровень может только иметь 64 зоны. Если Вы создаете больше чем 64 зоны, Engine объединит некоторые зоны вместе, что приведет к потере эффективности. Но это ограничение может быть изменено в будущем.


Взрывающиеся обьекты (настройки)

Автор : Exodus
Взрывающиеся объекты (настройки) 1.
Для создания реалистичности в игре существуют специальные актёры, которые позволяют создавать эффекты разрушения. Создание взрывающихся объектов требуют очень большого внимания и точных расчетов, чтобы не перегружать компьютер и не создавать помех в игре. Как правило они используются в заставках и одиночной игре. Ну и разумеется, что за Assault без них, игрокам нужно удовлетворение после тяжелого боя.
Основные настройки актера
Здесь приведены основные настройки актёра и мувера для создания полноценного эффекта уничтожения объекта.
Принцип и создание

Актёр Exploding Wall имеет довольно ограниченное количество команд и выполняет второстепенную функцию, создавая эффект разлетающихся со звуком обломков, которые и требуется правильно настроить. Если вы собираетесь разрушить к примеру кирпичную стену и просто установите его, привязав к брашу, то звук будет отсутствовать, а их текстура будет иметь жалкий вид. Стена же будет стоять еще тверже, не реагируя на ваши потуги (хотя, в этом изюминка есть, надо будет обязательно использовать). Вот пожалуй отсюда и можно начать.

Создадим MOVER, в виде кирпичной стены, чтобы при выстреле по ней, мувер мгновенно исчезал навсегда за пределы "мира" и пропишем в его свойствах:

Events:

  • Event - имя к кому будет обращение.
Mover:
  • bDamageTriggered - активироваться при нанесении повреждения;
  • bTriggerOnceOnly - одноразовая активация;
  • bDamageThreshold - сила повреждения для инициализации;
  • MoverEncroachType - поведение мувера в движении (чаще игнорировать препятствия);
  • DelayTime - задержка перед выполнеием (чаще н0ль);
  • MoveTime - время выполнения (чаще н0ль);
  • StayOpenTime - задержка перед выполнеием возврата;

Object:

  • InitialState - чаще выполняется как TriggerOpenTimed.

Установим взрывное устройство Actor->Effects-> EXPLODING WALL и пропишем в его свойствах:

Events:

  • Tag - персональное имя нашего детища.

ExplodingWall:

  • BreakingSound - нужный звук;
  • WallTexture - текстура нашей стены;
  • WallParticleSize - размер обломков;
  • NumWallChuncks - количество обломков.

Дополнительные свойства актёра EXPLODING WALL:

Advanced:

  • bNoDelete - запретить удаление после выполнения;
  • LifeSpan - определить время жизни актёра (самоликвидация).

Collision:

  • bBlockActors - запрет прохождения через него других актёров;
  • bBlockPlayers - запрет прохождения через него только игроков;
  • bProjTarget - определить его активным детонатором;
  • bCollisionHeigt - высота его действия для активации;
  • bCollisionRadius - радиус его действия для активации.

Effects:

  • bOnlyTriggerable - работать как тригер.

ExplodingWall:

  • ExplosionDimensions - равномерность взрыва;
  • ExplosionSize - величина взрыва;
  • ActivatedBy - активировать заданные действия;
  • Health - сила повреждения для активации.

Ну и разумеется если вы решили разнести какой-нибудь мини-маркет одним махом, можно разнообразить этим букетом:

  • WallTexture - WallParticleSize - NumWallChuncks
  • WoodTexture - WoodParticleSize - NumWoodChuncks
  • GlassTexture - GlassParticleSize - NumGlassChuncks

Дополнительно, так же входит уже оптимально настроенный актёр Actor->Effects->ExplodingWall->BreakingGlass, который предназначен создавать эффекты разбивания стекла (детские шалости).


Взрыв 2 (советы - примеры)

Автор : Exodus
Взрывающиеся объекты (советы\примеры) 2.
Да, почитав дополнения, сразу становится тоскливо, от непонятного нагромождения разрешений и запретов. Не волнуйтесь, будем потихоньку разбираться.
Разбор примерной карты
Для изучения можно использовать учебную карту, в которой заложены принципы работы взрывающихся объектов. Основные и являющиеся простыми объектами, сделаны в виде стендов по приципу из памятки. Деревянный щит, стеклянная витрина и 5 кирпичных переборок, с разными настройками.

Деревянная перегородка выполнена единым мувером и является детонатором. То-есть, в какое её место вы не выстрелите, мувер мгновенно исчезнет и инициализирует актёра ExplodingWall, который незамедлительно создаст эффект со звуком разлетающихся обломков. Так-как перегородка высокая, установлено два актёра. Аналогично выполнена стеклянная витрина, с одной разницей, что установлен актёр BreakingGlass, которому нужно только дать имя, включить по желанию bTranslucentGlass и bUnlitGlass. Пять кирпичных перегородок имеют разные настройки bDamageThreshold от 10 до 50. Вторая и четвертая восстанавливаются через 4 секунды. Так-же можно изучить реальный пролом в правой стене при помощи мощного оружия. Актёр находится в глубине пещеры, для того чтобы обломки не разлетались по мапу, создавая эффект, что у вас не рогатка в руках. Водный тоннель имеет тот же принцип, но отключен в свойствах мувера bTriggerOnceOnly, что и создает эффект быстро замерзающей воды. Если вам понравилась прорубь, то можете смело внедрять в свой мап и топиться. Учитывать нужно то, что вода поверх льда немного смягчает удар. Преодолев водную преграду, вы обнаружите хижину дяди Тома. Здесь немного усложнено, добавлением новых актёров. Бочка рома (Barrel), эффекты огненого взрыва ценной жидкости (ExplosionChain) и испускание оной духа (SmokeGenerator):

ExplosionChain Propertities:

ExplosionChainvents:

  • Damage - поджарить можно всех, в общем по желанию;
  • DelayTime - задержка перед выполнеием;
  • MomentumTransfer - эффект взрыва
  • Size - размер, если Stylus не врет.

SmokeGenerator Propertities:

SmokeGenerator:

  • BasePuffSize - объем клуба дыма;
  • RisingVelosity - скорость возвышения;
  • SizeVariance - величина растояния между клубами;
  • SmokeDelay - задержка появления дыма;
  • TotalNumPuffs - определяет время работы.

Функцию детонатора просто однозначно обязан исполнять бочёнок. Обратить нужно внимание на безошибочную работу двух муверов: хижины и двери. Если через окно выстрелить в бочку, то дом разлетится, а дверь останется. Не реалистично как-то, проверено на практике, ром сносит всё. Поэтому надо обязательно просчитывать в подобных конструкциях со спиртными напитками.

Пожалуй я пока закончу на этом и буду ждать вашей реакции. Фантазируйте, задавайте вопросы и при помощи их, туториал будет продолжен. P.S. Совсем забыл, наверху временно живут родственники Карлсона. Вы уж не обижайте их сильно. Мап сделан игрововым в режиме Unreal для UT.

С уважением, кто дочитал.

Exodus.


Муверы 1 часть - быстро

Двигающиеся объекты в UnrealED 1.
Если вы бы хотели создать гениальный уровень, то в нем наверняка былы бы такие объекты как двери, лифты, кнопки, рычаги и т.д. Однако, до сей поры, вы ничего не знали о том как создаются эти объекты. Прочитав эту статью вы научитесь основам этого дела. В Unreal существует несколько типов таких объектов, которые объединены в один класс Mover. Я не собираюсь перегружать вас информацией о каждом типе, и расскажу только о простых Mover'ах. В дальнейшем, я напишу вторую часть этой статьи, в которой подробно будут описаны другие типы Mover'ов. Но это все было вступление, а сейчас приступим к делу.
Создание простой двери
Мы начнем с простой комнаты 256x512x512. Сделайте такую комнату, наложите на нее текстуры (я выбрал текстуры из файла starship.utx). Теперь сделайте куб размерами 256x512x32 и поместите его в середину вашей комнаты, чтобы он разделял ее пополам. Добавьте этот браш. Это будет стена, в которую мы поместим нашу дверь.
Только нам надо прорезать в ней дырку для нашей двери. Чтобы сделать это, просто вырежьте из нее куб размерами 256x256x32. У вас должно получится примерно вот это.

После создания заготовки вашей двери, сделайте куб размерами больше вашей двери и поместите его так, чтобы вся ваша дверь была внутри него, но чтобы кроме этой двери внутри него ничего не было. Теперь примените операцию intersect. Ваш куб примет форму двери. Теперь двигайте этот куб в то место, где должна быть дверь (т.е. в нашу комнату, в дырку в стене). Нам осталось превратить наш браш в Mover. Для этого нажмите кнопку Add Movable Brush - [image]. Вы увидите как цвет браша сменился с красного на фиолетовый. Теперь можете отодвинуть красный браш подальше, чтобы не мешался.

Теперь нам надо изменить некоторые параметры двери, чтобы она работала как положено. Для этого щелкните правой кнопкой на наш Mover и выберите "Mover properties..." из меню. Для начала раскройте закладку Object и найдите параметр InitialState. Этот параметр показывает, когда наша дверь будет открываться. По умолчанию значение этого параметра BumpOpenTimed. Это значит, что дверь будет открываться, когда игрок подойдет к ней вплотную. Не меняйте пока значение этого параметра, и зайдите в закладку Mover. Вы увидите здесь огромное число параметров. Сначала найдите параметр MoverEncroachType. Этот параметр показывает, что надо делать нашей двери, если во время движения на ее пути появился какой-то объект (например, игрок). По умолчанию здесь стоит ME_ReturnWhenEncroach, т.е. дверь просто вернется в исходное положение при встрече с препятствием. Для нашей двери мы будем использовать установки по умолчанию, хотя для других дверей вы можете изменить MoveTime (время, за которое дверь открывается/закрывается), bTriggerOnceOnly (открывается только один раз и остается открытой), bUseTriggered (для открытия используется триггер).

Теперь нам надо указать, в какую сторону будет открываться наша дверь. Для этого используются ключевые кадры (keyframes). Ключевые кадры - это положения Mover'а, на пути его движения. Допустим, что мы хотим чтобы наша дверь открывалась вверх. Тогда первый (базовый) ключевой кадр - это дверь в текущем положении (т.е. закрыта), а второй ключевой кадр - это дверь в открытом положении. Чтобы выбрать номер ключевого кадра, надо щелкнуть правой кнопкой на Mover'е, в меню выбрать Mover Keyframe, и затем номер кадра.

В данный момент нам надо установить второй ключевой кадр, так что выберите Mover Keyframe->Key 1.

Теперь двигайте вашу дверь вверх, чтобы из потолка торчал только небольшой кусочек.
Теперь выберите опять Key 0 (Base). Вот собственно и все, ваша дверь готова. Если вы в этом сомневаетесь, то можете нажать Ctrl+P и проверить.
Звуки

Как вы уже заметили, у нашей двери есть один недостаток - она не издает звуков. Сейчас мы это поправим. Для начала нам надо загрузить какие-нибудь звуки. Для этого в браузере выберите SoundFX, и загрузите какой-нибуть звуковой package, например DoorsMod (в нем хранятся звуки механических дверей/лифтов). Теперь откройте окно Mover properties и раскройте Mover sounds.

Здесь вы видите 5 параметров:

  • ClosedSound (звук, воспроизводящийся когда дверь полностью закрывается)
  • ClosingSound (когда начинает закрываться)
  • MoveAmbientSound(когда движется)
  • OpenedSound (когда полностью открылась)
  • OpeningSound (когда начинает открываться)
Теперь мы назначим этим событиям соответсвующие звуки. Как вы видите справа в окошке браузера, имена звуков имеют вид xxxS, xxxL, xxxE или xxxStart, xxxLoop, xxxEnd. Эти названия означают начало движения, собственно движение и конец движения соответственно. Для нашей двери мы выберем три звука: md6start, md6loop и md6end. В окне Mover properties выберите параметр ClosingSound. Теперь справа в браузере выберите звук md6start. Теперь нажмите кнопку Use напротив параметра ClosingSound. Его значение должно измениться на Sound'DoorsMod.General.md6start'. Назначьте этот же звук параметру OpeningSound. Теперь назначьте звук md6end параметрам OpenedSound и ClosedSound, и наконец звук md6loop параметру MoveAmbientSound. Вот собственно и все. Можете проверить это нажав Ctrl+P. Если вы сделали уровень не футуристический, а, например, средневековый, то звуки соответствующих дверей можно найти в файле DoorsAnc.


Муверы 2 часть - Двойные двери

Двигающиеся объекты в UnrealED 2.
Усложним задачу...
Двойная дверь
С такой же легкостью можно сделать дверь, которая будет открываться влево или вправо - надо всего лишь изменить ее положение во втором ключевом кадре. Давайте сделаем двойную дверь, которая будет состоять из двух половинок, которые будут открываться вправо и влево (как в метро). Сначала сделайте еще одну комнату, точную копию нашей первой комнаты, только без двери, и соедините ее с первой комнатой. Теперь переместитесь в строительную комнату. Сначала мы сделаем обе половинки двери.
Сделайте два куба размерами 256x128x16 и поместите их рядом в строительной комнате. Наложите на них текстуры двери.

Теперь превратим наши половинки в Mover'ы. Сделайте куб аналогичный тому, который мы делали для первой двери (чтобы внутри него назодилась одна половинка двери). Нажимайте Intersect. Теперь двигайте этот браш в нашу комнату и нажимайте Add Movable Brush.

Также поступите и со вторым брашем. У вас должно получится вот так.Теперь выберите левую половинку, поставьте второй ключевой кадр (т.к. нумерация ключевых кадров начинается с нуля, вам надо выбрать Mover keyframe->Key 1), и переместите ее влево так,
чтобы из стены выступала только небольая часть. Тоже проделайте и со второй половинкой. Теперь для обоих половинок верните обратно базоввый ключевой кадр. Нам надо чтобы эти половинки открывались одновременно.
Поэтому для открытия двери мы будем использовать триггер. Добавьте объект Triggers.Trigger на пол прямо между дверьми.

Теперь мы настроим триггер и двери. Откройте окно параметров одной половинки двери и раскройте группу Object.

Найдите параметр InitialState. Этот параметр показывает, при каком условии дверь должна открываться. У этого параметра есть три значения, предназначенных для работы с триггером:

  • TriggerOpenTimed (открывается когда триггер активируестя, и через некоторое время закрывается)
  • TriggerControl (открыта, когда игрок находится в зоне действия триггера, в противном случае закрыта)
  • TriggerToggle (активация триггера меняет положение двери - если активировать триггер - открывается, если активировать его еще раз - закрывается)
Для нашей двери мы дубем использовать TriggerToggle (если игрок будет стоять рядом с дверью, она будет открыта, если отойдет - закроется). Теперь в этом же окне раскройте группу Events и измените параметр Tag на что-нибудь уникальное (например, Slider). Закройте окно и проделайте эти же манипуляции со второй половинкой. Теперь кликните правой кнопокой на триггере и вызовите окно его параметров (если еще не догадались, Trigger properties). Сначала мы увеличим зону действия триггера. раскройте группу Collision и поменяйте значение параметра CollisionRadius на 128. Теперь раскройте группу Events и измениет параметр Event на то значение, которое стоит у ваших половинок в параметре Events->tag (т.е. на Slider). В 2D окнах триггер и обе половинки двери должны соединиться красными линиями. Вот и все. Можете добавить для каждой половинки звуки, и затем нажать Ctrl+P.


Муверы - быстро 3 часть лифты

Двигающиеся объекты в UnrealED 3.
Здесь будет коротко рассказано о том, как сделать:
Лифты
Последнее о чем я хочу рассказать вам в первой части моей статьи - это о том как делать лифты. В общем то этот процесс не слишком сильно отличается от процесса создания двери. Сначала мы сделаем комнату в которую будет ехать наш лифт. Сделайте комнату 256x512x512 и поместите ее на 16 пунктов (1 клетка) выше нашей второй комнаты. Теперь сделайте дырку размерами 16x128x128 в полу этой комнаты. Туда будет ездить лифт. Теперь переместитесь в строительную комнату. Сделайте площадку лифта размерами 16x128x128 и поместите ее повыше.
Площадка по воздуху конечно летать не будет, так что нам нужна опора для нее. сделайте куб размерами 256x64x64 и поместите под площадку.
Теперь делайте куб внутри которого пометится это сооружение, нажимайте Intersect, двигайте этот браш в комнату, прямо под дыру, чтобы на полу была только площадка лифта, а опора была под полом. Нажимайте Add movable brush.

Теперь переключайтесь на второй ключевой кадр, и двигайте лифт вверх, пока площадка не войдет в дыру в потолке.

Теперь откройте окно параметров лифта и измените значение параметра Object->InitialState на StandOpenTimed, чтобы лифт поднимался когда на него встанет игрок.

Теперь назначьте этому лифту какие-ниюудь звуки, переделывайте уровень. Вот и все. Можете проверить ваш лифт нажав Ctrl+P. Ну а теперь бегите добавлять в ваш уровень двери и лифты! И чем больше тем лучше! ;))