Главная > Игры > 3D Action >
Unreal Movers Tutorial [4/6]
Муверы и освещение
__________________

Муверы имеют несколько настроек, связанных с освещением. Их можно найти в
пункте Mover, окна Mover Properties.

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

  BrushRaytraceKey - если Вы не воспользовались опцией bDynamicLightMover, то
  можете указать здесь номер кадра-ключа, для которого все же Вы хотите
  просчитать динамически освещение;

  WorldRaytraceKey - если Вы не воспользовались опцией bDynamicLightMover, то
  можете указать здесь номер кадра-ключа при котором все же будет просчитано
  динамическое освещение окружающего пространства (например, тень от лифта);

\ примечание - автор путает динамический свет и статический на лайтмапах.
  Raytrace ключи к динамическому свету отношения никакого не имеют. Это
  ключи в которых указывается как будет трассироваться свет при расчете
  (компиляции уровня). В Brush случае - номер ключа, в котором для мувера
  будут считаться лайтмапы с учетом окружающей геометрии, для World -
  номер ключа, в котором будет на окружающую геометрию падать от мувера тень \

Пример эффекта WorldRaytraceKey показан на скринах ниже. Мувером является лифт
с двумя кадрами-ключами: Key0(base) - в нижнем положении и Key1 - в верхнем.
Cледует помнить, что это сработает только при bDynamicLightMover равном false:

WorldRaytraceKey = 0

\ картинка - тень лежит точно под мувером \

WorldRaytraceKey = 1

\ картинка - тень отбрасывается, как если бы мувер стоял в 1-м ключе \

Вторая тень вычислена для лифта в верхнем положении. Вы также можете
использовать это для изготовления искусственных теней.
_______________________________________________________________________________
_______________________________________________________________________________

Зацикленные муверы (Looping movers)
__________________________________

Зацикленные муверы - это муверы, движение которых беспрерывно. Такой мувер все
же необходимо один раз активировать. Есть несколько способов создать
зацикленный мувер. Здесь будет рассмотрено три из них. У каждого способа есть
свои недостатки и преимущества, и соответственно различные результаты.

The DualDispatcherMethod (Thanks to Wanderer): необходимо иметь два диспетчера
(dispatchers) и датчик. При активации датчика один диспатчер начинает "цепную
реакцию", представляющую из себя бесконечное движение мувера между различными
кадрами-ключами.

Итак, приступим. Сперва добавим в уровень обычный мувер с необходимым
количеством кадров-ключей, перейдем в его свойства (Movie Properties). В пункте

Objects изменим InitialState на TriggerToggle. Также в разделе Events дадаим
ему имя (Tag), например, loopingmover. Теперь добавим два диспетчера (они
находятся в Браузере Актеров (Actor Browsers), в разделе Triggers).

Лезем в свойства одного из диспетчеров, в раздел Events, находим поле Tag и
вписываем сюда имя, например, Dispatcher1. В разделе dispatcher зайдем в
настройку OutEvents. В поле [0] впишем имя (Tag) мувера, в данном случае
loopingmover, а в поле [1] - вводим dispatcher2.  е забудьте в свойстве
OutDelays в поле [1] указать время (в секундах), необходимое для полного
открытия/закрытия. Узнать время не трудно: если MoveTime мувера равен 2, и у
него 4 кадра-ключа, ему понадобится 6 секунд для открытия/закрытия, а не 8
секунд: 4 кадра-ключа подразумевают движение из Key0(base) в Key1, затем из
Key1 в Key2, и наконец, из Key2 в Key3, т.е. три промежутка по 2 секунды. Итого
6 секунд.

Теперь то же самое проделаем и для второго диспетчера: имя (Tag) дадим ему
dispatcher2, а OutEvent[1] - dispatcher1:

\ 2 картинки - описывать их нет смысла и так ясно, что делать \

 а данном этапе осталось сделать одну вещь - добавить датчик (trigger) где-то в
уровне. При запуске карты мувер будет неподвижен, т.к. сперва нужно
активировать диспетчер. Если Вы хотите моментальной активации поместите датчик
где-то недалеко от места старта, где его кто-то точно включит, даже не
подозревая об этом.

После установки датчика не забудьте в свойcтве Events, в поле Event указать
либо Dispatcher1 либо dispatcher2 (в данном случае не имеет значения какой из
них будет являться первым).

The LoopMover Вообще в едиторе различают несколько видов муверов. Посмотреть
типы можно нажав правой кнопкой мыши на кнопке Добавить Мувер (Add Mover). В
развернувшемся списке Вы увидите все типы муверов. Самый верхний (Mover)
используется по умолчанию. Теперь же выберем LoopMover.

Классы муверов
______________

После непосредственного сконструирования самого мувера (ну и, естественно,
нескольких кадров-ключей), стоит залезть в его опции (Mover Properties). Затем
заходим в Objects, в пункт InitialState. Как Вы видите, здесь появилось новое
свойство - LoopMove. Это единственное свойство заставляющее работать мувер
бесконечно. Поэтому выберем его.

Единственный недостаток в том, что LoopMover не начнет движение сам. Его нужно
активировать. Для этого добавьте где-нибудь датчик (Trigger) и в его свойствах
в поле Event введите имя (Tag) Вашего LoopMover. Теперь при старте уровня,
мувер начнет движение как только кто-то попадет в радиус действия датчика. Если
же Вы покинете радиус действия, то и движение мувера прекратится в положении
ближайшего кадра-ключа.

Если же Вы хотите, чтобы мувер продолжал свое движение вне зависимости от того
находитесь ли Вы в радиусе действия датчика или нет, нужно позаботится о том
чтобы датчик был активирован все время. Вам понадобится кто-то или что-то для
активации датчика, но при этом им не должен являться игрок. Естественно это
что-то должно находится все время в радиусе действия Вашего датчика. К счастью
большинство pawns подходит для этой роли. Итак, выставляем опцию TriggerType в
положение TT_PawnProximity. Идеальный pawn для таких вещей - это  алийский
кролик (Nali Rabbit). Он находится в Браузере Актеров (Actor Class Browser) -
смотри скрин внизу.  о перед тем как Вы добавите кролика, Вам понадобится
комната размером, скажем, 256*256*256 за пределами Вашей карты. Сюда же воткнем
датчик. В данном случае здесь никто не сможет пристрелить кролика, да и убежать
ему будет некуда.

\ картинка - открыт браузер классов, кде выделена строка
     Pawn\FlockPawn\NaliRabbit    \
                    ^^^^^^^^^^
Скорее всего Вы подумаете, что нужно всего лишь закинуть этого кролика поближе
к датчику и все будет ОК.  о спешу Вас огорчить - не все так просто. В едиторе
есть баг - когда кто-то находится в радиусе действия датчика при старте уровня,
датчик не активируется. Для реальной активации Вам придется именно "зайти" в
радиус действия. Выход из этой ситуации - поместить кролика над датчиком, так
чтобы при падении он попал в радиус его действия. После того как Вы добавили
кролика в нужное место (над датчиком), нужно выставить его физику для падения.
Сделаем это, открыв его свойства, пункт Movement. Здесь в списке Physics
выберем PHYS_Falling.

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

Также Вы должны быть уверены, что кролик находится точно над пространством
действия датчика (если помните - то это цилиндр) и что он не разобьется при
падении. При использовании комнаты размером 256*256*256 поместите датчик ровно
по центру, примерно на высоте 64 юнита. Теперь перейдите в его свойства, раздел

Collision. Здесь установите CollisionHeight равный 64, а CollisionRadius
сделайте 200. Теперь смело добавляйте кролика. Вы можете посмотреть как это
выглядит на скрине ниже. Красный прямоугольник - не что иное, как радиус
действия датчика (его видно, потому что установлена Radii View):

\ картинка - комната с кроликом над зоной коллизий триггера \

 у и последняя вещь о которой стоит упомянуть - в свойствах мувера, в списке
MoverEncroachType выберем ME_IgnoreWhenEncroach, в противном случае мувер
остановиться навсегда при прикосновении к нему одним из игроков.

Если же Вы хотите избежать подобных проблем, Вы можете воспользоваться
комбинацией двух вышеописанных методов: DualDispatcherMethod и LoopMover. В
данном случае установите OutDelay[1] равным MoveTime Вашего мувера, вместо
указания времени полного открытия/закрытия.

Теперь рассмотрим некоторые отличия этих двух методов. Основное отличие состоит
в порядке движения между кадрами-ключами в случае если их больше чем 2. К
примеру, возьмем мувер с тремя кадрами-ключами.  ормальный мувер будет
двигаться так: из Key0(base) в Key1, из Key1 в Key2, после этого вернется в
Key1 и, наконец, в Key0(base).

LoopMomer будет вести себя несколько иначе: из Key0(base) в Key1, потом в Key2,
но после этого мувер кратчайшим путем вернется в Key0(base).
Поэтому в зависимости от Ваших потребностей используйте либо первый либо второй
метод.

TriggerPound: этот метод использует специфическое значение InitialState вашего
мувера: TriggerPound. То есть после изготовления мувера и нескольких
кадров-ключей не забудьте установить это значение в InitialState. В принципе
TriggerPound это то же самое что и InitialState равный LoopMove при
использовании LoopMover, с той лишь разницей, что в данном случае мувер будет
двигаться как в DualDispatcherMethod. Для активации мувера воспользуйтесь той
же схемой с кроликом.

Преимущество этого метода состоит в том, что Вы можете регулировать время
задержки мувера перед началом закрытия (последний кадр-ключ), а также время
задержки перед открытием (исходное положение). Для этого перейдем в свойства
мувера (Mover Properties), в раздел Mover. Для задержки перед открытием
воспользуйтесь полем StayOpenTime, а перед закрытием - OtherTime.

\ примечание - во всей истории с инициализацией луп-мувера непонятно одно -
  нафига нужен кролик? предлагаю еще два решения:
  1. возле PlayerStart поставить триггер, на который игрок по любому
  наступит и активирует один раз.
  Триггер связать с мувером, расположенном над уровнем и уже
  к нему приаттачить еще один триггер настроенный на любое воздействие и
  с параметром TriggerControl. Механика такова - игрок запускает первый
  триггер и мувер опускается (туда, где его не будет видно) и не возвра
  щается больше. Второй триггер детектит игрока (этот триггер должен
  покрывать зоной своего воздействия весь уровень) и пускает нужный
  луп-мувер. Так как детектить он будет постоянно, то луп-мувер будет
  постоянно двигаться.
  2. надо взять триггер, который сработает автоматически при запуске уровня,
  например Stohastic Trigger, естественно ему надо настроить соответствующим
  образом минимальное и максимальное время срабатывания.\
_______________________________________________________________________________
_______________________________________________________________________________

Связанные муверы (AttachMovers)
_______________________________

Существует особый вид муверов - связанные муверы (AttachMover). Смысл их
заключается в том, что они привязаны к другому муверу и в точности копируют их
движения.  а самом деле для тех же целей намного легче, да и надежней
использовать нормальные муверы, если Вы хотите, чтобы объект двигался вместе с
мувером.

Для начала создайте нормальный мувер, дайте ему имя (Tag), например,
AttachMover. Теперь добавьте любой объект: оружие, декорацию, свет и т.д. в Ваш

уровень. Откройте окно свойств объекта, и перейдите в пункт Movement. Здесь в
поле AttachTag впишите имя (Tag) мувера, в данном случае AttachMover. После
этого в разделе Advanced установите следующие значения: bMovable равный true,
bNoDelete равный false и bStatic тоже в положение false:

\ картинка - окно Light Properties с раскрытой строкой Advanced. \

Теперь "привязанный" объект будет в точности повторять движения мувера, не
зависимо от каких-либо внешних помех - даже будет проходить сквозь стены.

Если Вы все же хотите воспользоваться классом AttachMover, то нажмите правой
кнопкой мышки на иконке Add Mover и выберете его в списке. После этого откройте

свойства связанного мувера (AttachMover Properties). Дайте ему имя связного :)
(AttachTag). Теперь все объекты, имеющие такое же имя будут двигаться вместе в
ним.

Получается, что единственная разница между использованием AttachMovers и
обычного мувера лишь в том, что при использовании последнего Вы указываете
одинаковое имя (Tag) в поле AttachTag объекта и в поле Tag самого мувера, а в
другом случае наоборот: в поле AttachTag мувера и в поле Tag объекта.
_______________________________________________________________________________
_______________________________________________________________________________

Муверы, связанные между собой
_____________________________

 икто Вам не запрещал привязывать один мувер к другому. Делается это абсолютно
точно также как и с привязкой объекта. При таком раскладе у Вас появляется
возможность создания мувера у которого промежуточные положения могут не
совпадать с заданными кадрами-ключами. Предположим мувер (А) привязан к другому

муверу (В). Мувер А будет двигаться в соответствии со своими кадрами-ключами,
но в случае движения мувера В, он также будет копировать его движения. Поэтому,
если мувер В двигается в другом направлении отличном от траектории движения
мувера А, непосредственно сам мувер А будет совершать движение по двум
направляющим: его собственная и направление мувера В.

Мувер В, в свою очередь можно спрятать где-то на карте, так что игроки будут
видеть только мувер А!

Если Вы захотите чтобы мувер был привязан к нескольким муверам, необходимо
будет создать цепочку: мувер А привязан к муверу В, а мувер В к муверу С и т.д.

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

Основное использование такой техники - это лифты с внутренними дверями. В этом
случае двери будут опускаться и подниматься вместе с лифтом.

Кручение может не работать, хотя иногда встречаются рабочие.

Используя привязки муверов друг к другу Вы увидите, что это направление имеет
огромный потенциал. С помощью привязки Вы сможете делать поразительные вещи, не
прибегая к помощи скриптов!
_______________________________________________________________________________
_______________________________________________________________________________

События муверов
_______________

 иже описано несколько полезных событий муверов.

Первый тип событий - это когда что-то или кто-то запускает мувер. В разделе
Movers окна свойтсв (Mover Properties) есть две опции: BumpEvent и
PlayerBumpEvent.

BumpEvent - событие возникающее каждый раз при запуске мувера
кем-либо (игроком, объектом и т.д.), в то время как событие PlayerBumpEvent
возникает в следствие запуска только игроком.

Второй тип событий - те же что использовались для датчиков (Triggers). В окне
свойств, выберем пункт Events. Когда Вы введете в поле Event имя события, оно
будет вызвано при достижении мувером своего последнего кадра-ключа. С помощью
этого Вы можете создать кнопочку, являющуюся мувером, которая заезжает в стену
при нажатии, и как только кнопка достигнет своего последнего положения
откроется дверь. В данном случае датчики не понадобятся.

При использовании некоторых типов муверов, таких как GradualMover и
AssertMover, Вы можете указать различные события для каждого кадара-ключа. Это
будет объяснено ниже.


Страница 1 2 3 4 5 6 <<< Предыдущая Следущая >>> Содержание


Украинская Баннерная Сеть

Главная  Алфавитный индекс  Справка  Добавить FAQ  E-mail
Новости  Поиск по сайту

Copyright © 2001 - 2003 Olexandr Slobodyan.
Сайт создан в системе uCoz