faqs.org.ru

 Главная > Компьютерные игры > Quake и подобные игры >

Unreal Editor Movers FAQ

Секция 2 из 3 - Предыдущая - Следующая
Все секции - 1 - 2 - 3

    Shockrifle: projectile 55, shot 40, superexplosion (combo) 165
    Enhanced shockrifle: 1000
    Ripper: razorblade 30, explosive razorblade 34 (?)
    Biorifle: small glob 20, large glob 75
    Rocketlauncher: rocket 75, grenade 80
    Flackcannon: flakshell 70, chunk 16
    Redeemer: 1000

  Следовательно, датчик с DamageThreshold = 999 может быть активирован с
  помощью Redeemer, но если DamageThreshold = 1001 Redeemer не поможет;

  Message - это текст, появляющийся в текстовом поле Вашего HUD в момент
  активации датчика;

  RepeatTriggerTime - если у Мувера установлено значение Message, указывает
  сколько секунд будет повторяться это послание пока Вы находитесь в радиусе
  действия датчика. 0 означает что Message отобразится на экране только один
  раз без последующих повторений;

  ReTriggerDelay - если значение отлично от 0, Вы сможете активировать датчик
  только по истечении времени, указанном в TriggerDelay;

  TriggerType - указывает, что может быть причиной активации датчика:

    TT_PlayerProximity - активация происходит при попадании игрока в радиус
    действия датчика;

    TT_PawnProximity - активируется при попадании в радиус действия pawn
    (ракета, ящик, любая декорация);

    TT_ClassProximity - действие вызывается при активации датчика только
    актером (by actor) выбранного класса (class). Пока не работает;

\ дополнение - автор не говорит ничего о ClassProximityTipe, но об этом
  упоминает ниже, описывая Elevator Trigger. Там автор дает ссылку на эту
  главу, но так как здесь ничего нет... Замкнутый круг, кто-то ошибся -
  либо автор, либо 32 Pistoleta (переводчик). Работае это так - при выборе
  TT_ClassProximity необходимо указать в строке ClassProximity тот
  класс, который должен действовать на триггер. Другое дело, что сопряжено
  это с определенным извратом, кнопка Use не всегда работает. \

    TT_AnyProximity - объединяет первые две опции: активируется как игроком,
так и при помощи pawn;

    TT_Shoot - действие возбуждается при нанесении повреждения, и при этом урон
    превышает значение, указанное в DamageThreshold;

\ дополнение - автор ничего не сказал про строку bInitiallyActive, однако
  это очень интересная весч. Если указать в ней False, то триггер не будет
  реагировать на любой "раздражитель". В принципе, это не важно, такой
  триггер явно не несет полезной нагрузки, это как будто его и нет, если
  не знать, что из этого состояния его можно вывести другим триггером,
  связав аналогично примеру с мувером. И переключить обратно. Такая штука
  уже позволит реализовать, вкупе с Dispatcher'ом довольно сложную логику.
  Правда, актуально это скорее в сингле.\
_______________________________________________________________________________
_______________________________________________________________________________

Муверы и освещение
__________________

Муверы имеют несколько настроек, связанных с освещением. Их можно найти в
пункте 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, Вы можете указать различные события для каждого кадара-ключа. Это
будет объяснено ниже.
_______________________________________________________________________________
_______________________________________________________________________________

Лифтовой мувер (ElevatorMover)
______________________________

ElevatorMover, наверное, является самым продвинутым мувером, т.к. он
предоставляет Вам возможность контролировать каждый кадр-ключ. Пример: если у
Вас мувер с четырьмя кадрами-ключами, Вы можете поставить 4 лифтовых датчика
(ElevatorTriggers) на уровне - один для Key0(base), второй для Key1, третий для
Key2 и четвертый для Key3.

Чтобы добавить мувер этого класса просто нажмите правой кнопкой мыши на иконке
AddMover и в списке выберете ElevatorMover. Организуйте для него 4 кадра-ключа.

Откроем свойства мувера (ElevatorMover) и в разделе Objects установим
InitialState в положение ElevatorTriggerGradual. Затем в пункте Events дадим
муверу имя (Tag), например, ElevatorMover.

Лифтовые муверы не работают с нормальными датчиками. Вам необходимо будет
использовать специальный вид датчиков - лифтовые датчики (ElevatorTriggers).
Ясное дело, что у таких датчиков есть свои, присущие только им, настройки.
Кстати, ElevatorTrigger находятся в Браузере Актеров (Actor Class Browser) в
разделе Triggers.

Добавьте 4 таких датчика (каждый для соответствующего кадра-ключа), и перейдите
в их настройки. В разделе Events в поле Event введем ElevatorMover. Теперь Вы
увидите красные линии, проведенные из датчиков к муверу.

Затем, выберете один из лифтовых датчиков (ElevatorTriggers), откройте окно
свойств, пункт ElevatorTrigger.

Здесь находятся следующие настройки:
  bTriggerOnceOnly - датчик одноразовый (после одной активации больше работать
  не будет);

  ClassProximityType - используйте в совокупности с TT_ClassProximity. Более
  подробно смотрите в главе Муверы с датчиком (Triggered Movers);

  GotoKeyFrame - это и есть то уникальное свойство присущее только лифтовым
  датчикам: при активации подобного датчика, он не только активирует мувер, но
и указывает ему к какому кадру-ключу ему нужно двигаться, тем самым,
  указывая, что он контролирует этот кадр-ключ;

  MoveTime - если больше чем 0, указывает скорость Лифтового Мувера
  (ElevatorMover), но, судя по всему, эта фишка пока не работает;

  TriggerType - указывает, кто или что может быть причиной активации датчика.
  Более подробно описано в главе Муверы с датчиком (Triggered Movers);

Установим свойство GotoKeyFrame для каждого датчика соответственно равным 0, 1,
2 и 3.

Если теперь запустить карту, и Вы активируете один из датчиков, мувер
переместиться в положение кадра-ключа, номер которого Вы указали в опции
GotoKeyFrame данного датчика.  е имеет значения, с какого кадра-ключа мувер
начал движение - он всегда переместиться в нужное положение!

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

Что касается звуков: для Лифтовых Муверов (ElevatorMover) никогда не
используйте зацикленные звуки - они останутся звучать вечно.

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

AssertMover
___________

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

Сделать этот мувер просто: на кнопке Add Mover нажмите правый батон мыши и в
списке выберете AssertMover. сделайте для него более 2 кадров-ключей, например
4. В его свойствах укажем InitialState равный AssertTriggerOpenTimed. И дадим
ему имя (Tag) - например AssertMover. Затем добавим датчик с таким же именем в
поле Event.

Откроем окно свойств мувера (AssertMover Properties), и воспользуемся
настройками в разделе AssertMover.

  bOnceOnlyStopOpen - если установлено в положение true, то мувер останется
  навсегда открытым по достижении последнего кадра-ключа;

  CloseTimes - в отличии от нормальных муверов, которым можно задать время
  закрытия между соседними кадрами-ключами (и это время будет относиться ко
  всем кадрам-ключам), для этого класса муверов есть возможность указания

  времени закрытия для каждого промежутка между кадрами-ключами. CloseTime[0] -
время движения (при закрытии) из Key1 в Key0(base), CloseTime[1] - время
  движения (при закрытии) из Key2 в Key1 и т.д. не забывайте использовать эти
  настройки вместо свойства MoveTime. Если оставить эту опцию равную 0, то Ваш
  мувер будет двигаться  еРеально быстро;
  OpenTimes - OpenTime[0] - время необходимое муверу для движения при открытии
  из Key0(base) в Key1, OpenTime[1] - из Key1 в Key2 и т.д.

   еудобно, что CloseTimes и OpenTimes работает только в случае если
  InitialState мувера установлено в AssertTriggerOpenTimed. Если Вы используете

  другой InitialState, то для указания времени мувер использует MoveTime. Если
  Вы все же хотите управлять временем перемещения мувера для каждого
  кадра-ключа, но не используете AssertTriggerOpenTimed, Вы можете симитировать
  его, привязав датчик к муверу (см. главу Связанные муверы (AttachMovers));
  WaitUnAssertTime - это время задержки перед началом закрытия, в случае если
  Вы покинули радиус действия датчика;
_______________________________________________________________________________
_______________________________________________________________________________

GradualMover
____________

Этот тип муверов по достижении каждого из своих кадров-ключей меняет свое имя
(Tag). Поэтому в положении, соответствующем кадру-ключу 0 (Key0), мувер будет
"слушаться" одного датчика, в другом положении (например, в Key1) - уже
другого. Также у Вас есть возможность указать разные события для каждого
кадра-ключа мувера. Добавим такой мувер и зайдем в его свойства (GradualMover
Properties).

  CloseTimes - то же самое что и CloseTimes для AssertMover;

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

  OpenTimes - то же самое что и OpenTimes для AssertMover;

  Tags - имя для каждого кадра-ключа мувера (возможно указание только для
  первых 6 кадров-ключей). Если для Tag[0] введено А, а для Tag[1] - В, то в
  положении Key0(base), мувер придет в движение только при возбуждении события
А,и никак не отреагирует при возникновении события В. Если же мувер  находится
в Key1, то он активируется событием В. Событие А на него, в данном  случае,
никак не подействует;

Зайдя в пункт InitialState в разделе Object свойств мувера, Вы заметите 3 новых
значения для InitialState:

  GradualTriggerToggle - при активации датчика соответствующего Tag[0], мувер
  сместится в последний кадр-ключ и останется в этом положении до следующей
  активации именно тем же датчиком, что вызовет возврат в исходное положение.
  Мувер не будет останавливаться в промежуточных кадрах-ключах, и Вы не можете
  использовать различные имена (Tags) - в данном случае работать будет только
  Tag[0]. Тем не менее, различные события для каждого положения все же будут
  иметь силу;

  GradualTriggerPound - очень непонятный мувер. При тестировании он действовал
  так: при попадании игрока в радиус действия датчика первый раз, мувер
  открылся и затем закрылся. Когда игрок покинул радиус действия - мувер
проделал то же самое, т.е. открылся и затем закрылся.  о после этого он вдруг
  начал действовать как GradualTriggerOpenTimed мувер, описанный ниже.
Упоминаемый здесь датчик соответствует Trigger0 в примере ниже;

  GradualTriggerOpenTimed - это единственное значение InitialState, при котором
  мувер реально использует различные имена (Tags). Если мувер закрыт и при этом
  Tag[0] равен А, Tag[1] равен В, Tag[2] равен С, а соответствующие датчики
  имеют те же самые события (Events), то Датчик0 (Trigger0) переместит мувер в
  Key1. В этом положении он останется ждать активации Датчика1 (Trigger1).
  Затем мувер сдвинется в Key2. В этом примере это последний кадр-ключ, поэтому
  здесь мувер задержится на время, указанное в StayOpenTime, и вернется затем в
  Key0(base). Если Вы используете 6 кадров-ключей, у Вас будет мувер, который
  достигнет своего последнего кадра-ключа в случае предварительной активации 5
  датчиков в определенной последовательности (для последнего кадра-ключа датчик
  не понадобится). Плюс ко всему, Вы можете указать для каждого положения
  различные события (Event) мувера для активации чего-нибудь еще;
_______________________________________________________________________________
_______________________________________________________________________________

Группа возврата (ReturnGroup)
_____________________________

Группа возврата (ReturnGroup) - неизвестная большинству мапперов, но играющая
очень важную роль для муверов, настройка. Используется для разбиения муверов с
одинаковыми именами (Tags) на подгруппы.

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

соответствующей группы либо остановятся, либо вернуться, либо.... Во избежании
подобного поведения единственный выход распределить каждый мувер в отдельную
группу возврата (ReturnGroup). Теперь все муверы одной группы (т.е. с
одинаковыми Tags, активирующиеся одним общим датчиком, и.т.д) не будут при
блокировке одного из них реагировать на поведение своего "брата".

Предупреждение: когда Вы добавляете мувер, вне зависимости от их количества,
имя устанавливаемое по умолчанию будет Mover. Это означает, что все муверы
будут иметь один и тот же Tag (ну если Вы, конечно, не поменяли имя вручную), и
соответственно будут членами одной группы. Поэтому, если Вы очень удивлялись
странному поведению, скажем, дверей при блокировке лифта на одном уровне,
причина кроется именно в группе возврата.

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

При наличии нормальных муверов с различными именами (Tags), но имеющих
одинаковую группу возврата, они также будут останавливаться и возвращаться
вместе.
_______________________________________________________________________________
_______________________________________________________________________________

Еще некоторые свойства муверов
______________________________

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

  bDamageTriggered - мувер активируется при нанесении ему повреждения,
  количество которого устанавливается в поле DamageThreshold. Работает только
  при InitialState установленном TriggerOpenTimed или TriggerToggle. Чтобы
  узнать урон, наносимый оружием в Unreal Tournament, а также узнать больше об
  InitialState, веринесь к главе Муверы с датчиком (Triggered Movers);

  bSlave - делает текущий мувер "рабом" другого мувера. Еще один способ
  привязки муверов друг к другу. Эффект при этом тот же что и при использовании
  AttachTag мувера;

  bUseTriggered - скорее всего эта фишка была задумана для активации мувера
  путем нажатия кнопки на клавиатуре, как это сделано, например, в Half-Life.
  о в финальной версии Unreal, от ее реализации отказались;

  DamageThreshold - укажите здесь количество повреждения, необходимое для
  активации мувера (имеет смысл только при bDamageTriggered равном true);



_______________________________________________________________________________

Часть III
_______________________________________________________________________________
_______________________________________________________________________________

Дверь, открывающаяся при нажатии кнопки
_______________________________________

Это будет обычная дверь, которая открывается при нажатии кнопки. Кнопка, в свою

Секция 2 из 3 - Предыдущая - Следующая

Вернуться в раздел "Quake и подобные игры" - Обсудить эту статью на Форуме
Главная - Поиск по сайту - О проекте - Форум - Обратная связь

© faqs.org.ru