Mover'ы, часть 2Автор: Hruka
Введение
В первой части статьи мы рассмотрели только один тип Mover'ов и
сделали пару простеньких дверей и лифт. Если вы еще не читали первую часть, то
советую прочесть ее. Во второй части статьи мы рассмотрим еще несколько типов
Mover'ов, а также подробнее рассмотрим "простые" Mover'ы.
Вращающаяся дверь
Начнем мы с простого - с создания вращающейся двери. Все двери,
которые мы делали раньше, просто отодвигались в стену или в потолок. А эта дверь
будет открываться, как обычная дверь. Для того чтобы начать, сделайте две
комнаты 256x512x512 и соедините их маленьким коридором 128x128x16, а также
где-нибудь вне уровня создайте "строительную" комнату:

Теперь
переместитесь в строительную комнату. Сделайте там куб размерами 128x128x16 и
наложите на него текстуру двери (какую-нибудь из файла NaliCast.Door, например
SDoorN). Обратите внимание, тектсура на обеих сторонах двери должна быть
направлена в одну сторону, поэтому с одной стороны текстуру надо перевернуть по
горизонтали (Flip U). После того, как вы правильно наложили текстуры на дверь,
делайте intersect и двигайте дверь прямо в коридор. Теперь нажимайте кнопку Add
Mover Brush. Выберите получившийся Mover. Видите красный крестик в центре?

Этот крестик
- центр вращения Mover'а. Это очень важно при создании вращающихся Mover'ов.
Если вы попытаетесь покрутить Mover сейчас, то он будет крутиться вокруг этой
точки. В каком-нибудь другом случае это было бы прекрасно, но только не в нашем.
Нам надо переместить этот центр в одну из вершин Mover'а. Для этого просто
кликните на эту вершину:

Теперь
Mover будет вращаться вокруг этой точки. Установите Keyframe 1 и поверните дверь
на 90 градусов. Потом установите Keyframe 0 опять:

Теперь
добавьте PlayerStart и запустите карту. Как вы видите, в одну сторону дверь
работает нормально, однако когда вы пытаетесь открыть дверь с другой стороны,
она начинает открываться, потом натыкается на вас и сразу же закрывается. Это
потому что у нас стоит MoverEncroachType=ME_ReturnWhenEncroached, т.е. дверь
будет возвращаться в исходное положение при встрече с препятствием. Поставьте
там ME_IgnoreWhenEncroached, чтобы дверь игнорировала препятствия. Не самый
реалистичный эффект, но на данный момент этого достаточно. Теперь запустите
карту опять. Как вы видите, дверь теперь проходит через игрока, кроме того она
совершенно бесшумна. Назначьте двери какие-нибудь звуки. Теперь давайте решим
проблему с прохождением через игрока. Давайте добавим триггер на расстоянии
достаточном для двери чтобы открыться и не задеть игрока. Откойте class browser
и добавьте класс Trigger на расстоянии чуть больше открытой двери:

Теперь
установите Tag двери равным door1, установите такое же значение в поле Event
триггера и в параметрах двери поставьте
Object->InitialState=TriggerOpenTimed. Теперь чуть-чуть увеличьте радиус
действия триггера (Collision->CollisionRadius), поставьте где-нибудь 60-80.
Теперь запускайте карту. Как вы видите, теперь все нормально, но вы можете
пройти только в одну сторону, а в другую дверь не открывается. Неплохая ловушка
:). Однако, ловушки вы будете делать в сыоих уровнях, а мы с вами сейчас добавим
кнопку, которая будет открывать дверь с другой стороны.
Добавление кнопки
Итак, что же есть кнопка? А кнопка - это такой же Mover, как и
все двери, только маленький :). Перейдите в строиельную комнату и сделайте там
кубик размерами 32x32x16. Теперь наложите на него текстуры кнопки. Сначала на
весь кубик наложите какую-нибудь текстуру из группы Base, а потом на переднюю
часть наложите текстуру из группы Trim или Deco. Например, Ancient.Deco.AZ-3A.
Не забудьте уменьшить текстуру, чтобы она полностью помещалась на кнопке
(текстуру AZ-3A, например, которая имеет размер 512x512, надо уменьшить в 16
раз, т.е. увеличить в 0,0625 раза). Кстати, очень прикольно смотрится такая
большая текстура на таком маленьком объекте. В общем, после того как вы наложиле
текстуры, делайте intersect и прилепляйте вашу кнопку куда-нибудь к стене, с той
стороны, где дверь не открывается. Смотрите, не прилепите ее очень высоко, а то
игрок подумает, что вы над ним издеваетесь, когда будет играть на этой карте
:)). Нажмите кнопочку Add Mover Brush. Поставьте keyframe 1 и задвиньте вашу
кнопку наполовину в стенку:

Теперь нам
осталось только сделать так, чтобы кнопка открывала дверь. Для этого просто
установите параметр Event кнопки в значение равное Tag'у двери (т.е. door1). В
общем то все. Если хотите, можете также назначить кнопке какой-нибудь звук. Или,
например, сделать так, чтобы кнопка активировалась по выстрелу - сначала
поставьте Object->InitialState=TriggerOpenTimed, затем
Mover->bDamageTriggered=true. Mover->DamageThreshold - это количество
дамаджа, которое надо нанести кнопке, чтобы она активировалась.
Вращающийся Mover
Ну ладно, хватит с вас простых Mover'ов. Давайте рассмотрим
какой-нибудь другой тип Mover'ов, например вращающиеся Mover'ы. Вращающийся
Mover - это Mover который постоянно вращается. Наша дверь не является
вращающимся Mover'ом потому что она вращается только по keyframe'ам.
Вращающемуся Mover'у keyframe'ы не нужны. Итак, начнем. Мы будем делать
простенькую ловушку. Сначала сделайте еще одну комнату 512x1024x512:

Теперь
перейдите в строительную комнату. Сделайте в ней куб размером 512x64x512 и
добавьте его. Затем поверните строительный браш на 90 градусов и добавьте еще
раз, чтобы этими двумя кубами образовался крест. Этот крест будет вращаться
параллельно нашему коридору и игроку надо будет пройти между его лопастей чтобы
не умереть. Сделайте intersect всего креста и переместите получившийся браш в
середину нашей новой комнаты. Теперь нам надо добавить вращающийся Mover. Для
этого либо выберите класс Brush.Mover.RotatingMover в Class Browser'e, а затем
нажмите кнопку Add Movable Brush, либо, если вы работаете в UnrealED 2.0,
нажмите правой кнопкой на кнопку Add Mover Brush и из появившегося списка
выберите RotatingMover. Как вы видите, в коридоре появился RotatingMover:

Но
прежде чем мы запустим уровень, мы должны определить, как Mover должен
вращаться. Вращаться он может по трем осям - Pitch (вращение вправо/влево), Roll
(вперед/назад) и Yaw (вращение по вертикальной оси). Нам нужно вращение назад,
значит это будет Roll, причем с отрицательным значением:

Откройте окно
свойств RotatingMover'а, раскройте там сначала строку RotatingMover, а потом
RotationRate. В строке Roll нам надо указать скорость вращения Mover'а. Напишите
там -3000 для нормальной скорости. Нам осталось только поставить
MoverEncroachType=ME_CrushWhenEncroach, чтобы Mover мог задавить игрока. Можете
запустить карту. Как вы видите, все работает, однако есть несколько проблем.
Первая проблема - Mover иногда внезапно возвращается в начальное положение.
Вторая проблема - те части Mover'а, которые не были освещены так и остаются
темными, когда он вращается и из-за этого возникает неприятный эффект. Первая
проблема возникает из-за того, что у нас стоит
Object->InitialState=BumpOpenTimed. Что происходит когда Mover натыкается на
игрока? Он переходит к первому keyframe'у, а поскольку он у нас не определен, то
Mover переходит в начальное положение. Через некоторое время Mover опять
возвращается в начальное положение, т.е. к нулевому keyframe'у. Это решается
просто - ставим Object->InitialState=None и на Mover теперь ничто не
оказывает влияние. Вотрая проблема тоже решается просто - ставим
Mover->bDynamicLightMover=true и наш Mover будет освещаться в реальном
времени. Теперь можете запускать карту и тестировать ловушку.
LoopMover'ы
Как вы видите, наша ловушка прекрасно работает, однако у нее
есть недостаток - вы можете проходить через нее только в одну сторону, если вы
попытаетесь пройти в другую сторону, вас просто раздавит. Давайте сделаем
проход, ведущий из конца комнаты с ловушкой в стартовую комнату:

Мда, какой-то
длинный и скучный коридор получился... Давайте его немного разнообразим? Как
насчет пары-тройки прессов периодически обрушивающихся с потолка? Вот тут то нам
и пригодится новый тип Mover'ов, который называется LoopMover. LoopMover - это
такой Mover, который двигается от keyframe'а к keyframe'у, а после последнего
keyframe'а переходит обратно к первому и начинает двигаться заново.
Переместитесь в строительную комнату и добавьте туда куб шириной и высотой с ваш
коридор, а длиной 96 единиц. Наложите на него подходящие текстуры, сделайте
intersect и переместите браш в коридор. Затем добавьте LoopMover так же, как вы
добавляли RotatingMover. Теперь перейдите к первому ключевому кадру и поднимите
пресс вверх, затем вернитесь обратно к нулевому keyframe'у:
Теперь
давайте настроим параметры пресса. Поставьте MoveTime=0.5, чтобы пресс был не
слишком медленный. Также можете назначить прессу какой-нибудь громкий звук. И не
забудьте поставить Object->IntialState=LoopMove. Ну и конечно, самое главное
- MoverEncroachType=ME_CrushWhenEncroach. Теперь нажмите правой кнопкой на пресс
и выберите Duplicate, потом переместите копию LoopMover'а вперед по коридору.
Затем сделайте еще одну копию. В итоге у вас должно получиться три пресса. Вроде
бы все, однако это не так. По необъяснимыой причине LoopMover работает только
если игрок находится в зоне действия триггера, связанного с этим LoopMover'ом
(конечно, причина объяснима - так прописано в скрипте LoopMover'а, однако нафиг
так было делать - это уже никто не объяснит). Поэтому дайте прессам Tag'и
press1, press2 и press3 и под каждым прессом поместите по триггеру с Event'ом
равным Tag'у соответствующего пресса. Также увеличьте CollisionRadius триггеров
до 256. Вот теперь все. Можете запускать карту. Можно конечно поставить у всех
триггеров и дверей равные значения Tag'ов и Event'ов, но тогда возникнут глюки.
Например, иногда триггер перестает работать и игрок оказывается запертым между
двумя неработающими прессами. Лучше поставить один триггер с большим радиусом
действия, тогда никаких глюков не будет, но, возможно, прессы можно будет
активировать из какой-нибудь другой части уровня, ведь радиус у триггера
большой, а это иногда нежелательно. А если вы хотите, чтобы прессы работали
постоянно, то поставьте радиус триггера равным 99999. Тогда вы будете назодиться
в зоне его действия в любой части уровня.
AttachMover
Еще один часто используемый тип Mover'ов - AttachMover. Вы
можете "присоединять" объекты к Mover'ам данного типа и они будут двигаться
вместе с Mover'ом. Сначала сделайте еще одну комнату 256x512x512 рядом с вашей
второй комнатой:

Теперь
перейдите в вашу строительную комнату и создайте там куб 16x128x128. Наложите на
него текстуры естественно, и сделайте intersect. Переместите этот куб на пол в
левый нижний угол вашей комнаты и добавьте AttachMover. Установите первый
ключевой кадр и переместите Mover в левый верхний угол комнаты. Снова поставьте
базовый ключевой кадр. Теперь добавьте какой-нибудь предмет (например, броню
Inventory.Pickup.TournamentPickup.Armor2) в правом нижнем углу комнаты.
Установите параметр AttachMover->AttachTag Mover'а в Item1, такое же значение
запишите и в поле Tag брони. Запустите уровень. Как вы видите, броня двигается
вместе с Mover'ом и вы без проблем можете взять ее.
Невидимый AttachMover
Простой AttachMover - это не так уж и интересно. Зато невидимый
AttachMover - это уже получше. Хотя создается он практически также. Сделайте в
вашей строительной комнате кубик размером 32x32x32. Теперь выберите все его
поверхности, откройте окно их свойств и в закладке Flags (Effects) выберите
Invisible. Все остальное делайте также как и в предыдущем случае - делайте
intersect и добавляйте AttachMover. Добавьте его тоже в левом нижнем углу, но
только не на полу, а на потолке, чтобы он не мешал движению игрока и первого
AttachMover'а. В первом ключевом кадре подвиньте его в левый верхний угол.
Откройте окно свойств Mover'а и установите
Object->InitialState=TriggerOpenTimed, Events->Tag=attachmover1,
AttachMover->AttachTag=item2. Теперь добавьте какой-нибудь предмет слева от
брони, прямо в центре выхода из коридора. Добавьте, например, ThighPads
(Inventory.Pickup.TournamentPickup.ThighPads). Установите Tag равным item2.
Теперь в коридоре добавьте триггер с Event'ом равным attachmover1. Rebuild'ните
карту и запустите ее. Получится довольно интересный эффект - вы идете по
коридору, чтобы взять ThighPads, а они вдруг раз и ускользают от вас :). Таким
способом можно сделать много интересных вещей.
Заключение
Ну вот собственно и все. Хочу заметить, что часть из
вышеперечисленных эффектов возможна только в Unreal и почему-то не работает в
UT. Ну а теперь - вперед, добавлять двери и ловушки в ваши уровни! :)