KF SDK: Муверы

Тема в разделе "Маппинг", создана пользователем K-2, 26 окт 2011.

  1. K-2

    K-2 Главный маппер форума

    В этой статье:
    - Создание муверов.
    - Триггеры и Event > Tag система.
    - Свойства муверов.
    - Примеры различных муверов.


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

    Создание

    Начнем с самого простого. Выберем в Static Mesh браузере меш (дверь например) для будущего мувера.
    Можно также сделать его с помощью Solid брашей, конвертировав их в статик.
    [​IMG]
    Теперь следует нажать ПКМ на кнопку Add Mover Brush [​IMG], выберем обычный Mover.
    Он появится внутри браша-билдера, так что их Pivotы будут совпадать.
    [​IMG]
    На 2D экранах мувер имеет розовые контуры.
    Созданная дверь имеет закрытое положение, переместим её в нужное место и настроим размер с помощью DrawScale3D.
    [​IMG]
    Закрытая дверь имеет ключ 0, начальное положение. Что бы дверь могла открыватся требуется утановить положение 1, в котором она будет открыта. Для этого следует щелкнуть по двери ПКМ и выбрать Mover > Key 1, после чего передвинуть/повернуть её в положение, в котором она будет открыта.
    [​IMG]
    Если все сделано правильно, то щелкнув по двери снова и выбрав Mover > Key 0, она вернется в начальное положение.
    Информация о движении выглядит в виде разницы координат, поэтому передвигая дверь в начальном положении, с ней передвинется и её закрытый вариант.
    Если мы испытаем такую дверь в игре, то она будет открываться при непосредственном контакте с игроком и закрываться спустя определенное время.

    Тип активации

    Настроить тип активации муверов можно в свойствах во вкладке Object, здесь основным параметром является InitialState.
    [​IMG]
    Из них актуальные:
    ConstantLoop – Объект движется постоянно и не требует активации.
    TriggerToggle – Мувер меняет положение, только если был активирован Eventoм (используется по умолчанию для всех дверей в Killing Floor).
    TriggerOpenTimed – Мувер “открывается” Eventoм, по прошествии определенного времени возвращается в исходное положение.
    BumpOpenTimed – Мувер “открывается” при контакте с ним, “закрывается” по прошествии определенного времени (используется по умолчанию для Mover).
    StandOpenTimed - Мувер активируется, если на него станут, “закрывается” по прошествии определенного времени.

    Триггеры

    Триггеры - это активаторы, работают они по простой системе Event > Tag (событие > метка). Это по сути “кнопки” которые могут создавать событие (Event), активирующее что – либо с определенной меткой (Tag). Иными словами это устройство для запуска, и не только муверов.

    У триггеров и муверов в свойствах есть вкладка Events. В свойствах триггера в поле Event пишется название события (можно придумать любое), а в свойствах мувера в поле Tag – метка.
    Например:
    [​IMG]
    Триггеры можно найти в Actor Class браузере, во вкладке Triggers.
    Для дверей подойдут 2 типа триггеров. Это KFUseTrigger (есть также KFElevatorTrigger для лифтов) во вкладке UseTrigger и KFProxyTrigger во вкладке Trigger.
    [​IMG]
    KFUseTrigger используется для стандартных дверей в KF (KFDoorMover), у которых тип активации TriggerToggle. С помощью него двери открываются и закрываются по нажатии кнопки использовать. Выглядит такой триггер как птичья голова и помещается в центр дверей, где будет индикатор заварки.
    Рассмотрим свойства такого триггера.
    [​IMG]
    Как видно из свойств, за сварку отвечает именно триггер, также двери могут быть закрыты на ключ.
    Основными параметрами здесь являются:
    MaxWeldStrength – Количество очков сварки необходимых для заварки двери на 100%.
    ReFireDelay – Задержка в секундах до повторной активации триггера.
    Message (во вкладке Use Trigger) – Сообщение на экране, когда игрок находится возле триггера и может его активировать. Если ввести “Press USE key”, то будет выдаваться стандартное сообщение, которое также будет переведено на русский язык при русской локализации.

    KFProxyTrigger активируется при каком – либо взаимодействии с ним, имеет больше типов активации но не годится для завариваемых дверей.
    Свойства:
    [​IMG]
    bInitiallyActive – активен ли триггер изначально.
    bTriggerOnceOnly – если True, то триггер может быть активирован только один раз.
    ClassProximityType – взаимодействие с определенным классом при TT_ClassProximity.
    DamageThereshold – урон необходимый для активации (только если активируется выстрелом)
    Message – сообщение в углу экрана при взаимодействии игрока с триггером.
    RepeatTriggerTime – время через которое действие триггера повторяется, не актуально для данного триггера.
    ReTriggerDelay – задержка в секундах от активации до возможности повторной активации.
    TriggerType – тип активации триггера, существуют несколько типов:
    TT_PlayerProximity (активация при контакте с игроком);
    TT_PawnProximity (активация при контакте с игроками, зомби и ботами);
    TT_ClassProximity (активация при контакте с определенным классом, указанном в ClassProximityType);
    TT_AnyProximity (активация при контакте с любым материальным объектом);
    TT_Shoot (активация выстрелом, триггер при этом становится осязаемым для пуль);
    TT_HumanPlayerProximity & TT_LivePlayerProximity (активация при контакте с игроком-человеком и живым игроком, что собственно одно и то же).

    Свойства муверов

    Муверы имеют довольно гибкие настройки, кроме того, они могут функционировать как триггеры создавая события. Рассмотрим основные свойства характерные для всех муверов.
    Вкладка Mover:
    [​IMG]
    bDamageTriggered – если True, то триггер (который содержит событие для данного мувера) будет активироваться выстрелом/ударом по муверу.
    bTriggerOnceOnly – при True мувер может быть активирован только один раз.
    BumpEvent – мувер может создать Event (подобно триггеру) при соприкосновении с ним.
    BumpType – тип прикосновения, на который отреагирует мувер (Player – игрок; Pawn – игрок или AI; Any – любой объект)
    DamageThereshold – минимальный урон, который необходимо нанести муверу чтобы активировать триггер, при bDamageTriggered = True.
    DelayTime – задержка перед началом движения.
    EncroachDammage – урон наносимый мувером при столкновении с чем-то, игроку наносится урон вдвое меньше указанного.
    KeyNum – текущее положение, также переключается в выпадающем меню. В отличии от выпадающего меню, с помощью этого параметра можно установить больше 8 положений.
    MoveEncroachType – реакция мувера на столкновение с игроком или зомби. Имеет 4 типа:
    ME_Stop_WhenEncroach (движение останавливается);
    ME_Return_WhenEncroach (мувер возвращается в предыдущее положение);
    ME_Crush_WhenEncroach (мувер в буквальном смысле убивает препятствие);
    ME_ Ignore_WhenEncroach (мувер продолжает движение).
    MoverGlideType – тип ускорения. GlideByTime: мувер постепенно ускоряется; MoveByTime: скорость движения постоянная.
    MoveTime – время за которое мувер проходит расстояние от одного ключа к другому.
    NumKeys – количество ключей-положений. По умолчанию 2, но может быть установлено множество. Каждый отрезок пути проходится за MoveTime.
    PlayerBumpEvent - аналогично BumpEvent создает Event, но только при контакте исключительно с игроком.
    StayOpenTime – время, которое дверь остается открытой при типе активации OpenTimed.

    Вкладки MoverEvents и MoverSounds:
    [​IMG]
    Во вкладке MoverEvents можно задать события которые будут активированы на различных стадиях движения мувера.
    Во вкладке MoverSounds соответственно задаются сопровождающее движение звуки.

    Двери в KF создаются как KFDoorMover, они могут быть заварены и в них могут ломится зомби, для таких муверов есть дополнительные свойства.
    [​IMG]
    bBlockDamagingOfWeld – если True, то сварка будет неразрушима и дверь можно будет открыть только при помощи сварочного аппарата.
    bDisallowWeld – при True дверь нельзя будет заваривать.
    bElevOuterDoorTop/Bottom – являются ли двери верхними/нижними дверьми лифта.
    bKeyLocked – закрыта ли дверь на ключ.
    bSmallArmsDamage - при True двери можно будет нанести урон не только гранатами.
    bStartSealed – будет ли дверь заваренной в начале каждой волны.
    bZombiesIgnore – будут ли зомби игнорировать эту дверь, если она заварена.
    StartSealedWeldPrc – на сколько процентов будет заварена дверь при bStartSealed.
    ZombieDamageReductionFactor – Получение урона от зомби. Чем больше значение, тем быстрее зомби её сломают.
    Также здесь задаются звуки разрушения двери.

    Примеры муверов

    С первого взгляда все выглядит очень сложно, но это не так.
    Я создал небольшую тестовую карту KF-MoversExample с простыми примерами различных муверов. Вы можете скачать её здесь и получше изучить или протестировать их в редакторе.
    Ниже приведены описания присутствующих на карте муверов.

    Обычная завариваемая дверь
    [​IMG]
    Тип мувера: KFDoorMover
    Тип триггера: KFUseTrigger


    Все значения стандартные, двери задано 2 ключа-положения (0 и 1). Для данной двери за основу был взят Static Mesh двери из KF-Offices и были заданны те же самые звуки открытия и закрытия. Event триггера и Tag двери = Door1. В свойствах триггера MaxWeldStrength установлен на 200.

    Двойная дверь, завариваемая в начале каждой волны.
    [​IMG]
    Тип муверов: 2x KFDoorMover
    Тип триггера: KFUseTrigger


    С двойными дверьми все точно так же, но для них нужно по 2 отдельных мувера, каждый со своими ключами. Они должны иметь одинаковые свойства, одинаковый тэг и один KFUseTrigger. Для данной двери за основу взята двойная дверь из KF-BioticsLab.
    Что бы дверь заваривалась в начале каждой волны для обоих муверов установлен bStartSealed = True. MaxWeldStrength здесь = 500.

    Дверь закрытая на ключ

    [​IMG]

    Тип мувера: KFDoorMover
    Тип триггера: KFUseTrigger


    От обычной двери отличается только двумя параметрами и наличием специального ключа. В свойствах двери необходимо установить bKeyLocked и bDisallowWeld на True.
    Tag двери и Event триггера необходимо сделать одинаковыми. Ключ для двери можно найти в ActorClassBrowser, Actor > Pickup > KFKeyPickUp. Ключу необходимо ввести Tag (такой же как и у двери) в свойствах во вкладке Event.
    К сожалению существует баг из за которого такую дверь можно взорвать обычными гранатами.

    Дверь торговца
    [​IMG]
    Тип мувера: KFTraderDoor
    Тип триггера: нет (активируется с помощью ShopVolume)


    Муверы данного типа не могут быть разбиты, заварены или взорваны. Они открываются и закрываются так же как и все муверы, в KF их зачастую используют в магазинах. Случайно выбранная зона магазина (Shop Volume) на карте по уничтожению волны создает Event подобно триггеру, по прошествии времени закупки Event создается повторно, закрывая дверь.

    Двойная автоматическая дверь

    [​IMG]

    Тип муверов: 2x Mover
    Тип активации муверов: TriggerOpenTimed
    Тип триггеров: 2x KFProxyTrigger
    Тип активации триггеров: TT_PlayerProximity


    Создается как обычная двойная дверь, но активируется с помощью Proxy триггеров, установленных по обе стороны двери. Когда игрок “наступает” на триггер, Event открывает двери. Благодаря типу активации, мувер не может быть повторно активирован, пока не “закроется”. Несмотря на TT_PlayerProximity, зомби тоже могут пользоватся такой дверью, но чтобы такая дверь не блокировала их пути необходимо в свойствах муверов во вкладке Collision установить bPathColliding = False.

    Дверь открывающаяся выстрелом по кнопке

    [​IMG]

    Тип муверов: 2x Mover
    Тип активации муверов: TriggerToggle
    Тип триггера: KFProxyTrigger
    Тип активации триггера: TT_Shoot


    Выстрел по триггеру активирует мувер – кнопку (Event = bt). Кнопка (Tag = bt) в свою очередь будучи нажатой открывает дверь. В свойствах кнопки во вкладке MoverEvents, OpenedEvent = Tag мувера – двери (ShootDoor). Event активируется, когда кнопка “откроется”. Чтобы триггер можно было активировать только один раз, в его свойствах установлено bTriggerOnceOnly = True.
    bPathColliding двери = False.

    Секретная дверь открывающаяся при получении урона

    [​IMG]

    Тип мувера: Mover
    Тип активации мувера: TriggerOpenTimed
    Тип триггера: KFProxyTrigger
    Тип активации триггера: TT_PlayerProximity (в данном случае не имеет значения)


    Данный мувер был создан с помощью Solid браша, конвертированного в статик. В свойствах мувера bDamageTriggered = True. Данный мувер имеет 3 ключа (0-2), в свойствах мувера NumKeys = 3. После выстрела по такой двери, она сначала немного задвигается внутрь, потом открывается. Закрытие происходит по прошествии определенного времени.

    Скейт прыгающий через трамплин

    [​IMG]

    Тип мувера: Mover
    Тип активации мувера: TriggerToggle
    Тип триггера: нет (мувер сам себя активирует при контакте с игроком)


    Данный мувер имеет 9 ключей. За одинаковый промежуток времени он проходит одинаковое расстояние (не считая подъем и спуск). Мувер активируется, когда до него дотрагивается игрок, PlayerBumpEvent = Tag. Что бы во время переключения от одного ключа к другому не наблюдалось торможение MoverGlideType установлен на MoveByTime. Со стороны выглядит немного кривовато, но это все таки обычный мувер.

    Раздатчик

    [​IMG]

    Тип муверов: 4x Mover
    Тип активации мувера: TriggerOpenTimed
    Тип триггера: KFProxyTrigger
    Тип активации триггера: TT_ClassProximity


    Очень простой механизм, внутри “приемника” расположен триггер который реагирует на брошенные деньги (Class’KFMod.CashPickup’). Дверцы приемника закрываются, в то время как открываются другие, за которыми появляется броня.

    Подъемник – платформа
    [​IMG]
    Тип мувера: Mover
    Тип активации мувера: StandOpenTimed (активируется, когда на него наступают)


    Лифты можно делать как и двери, которые открываются вертикально, но в таком случае ими смогут пользоваться только игроки, с чем связано много багов.
    Лифты – платформы являются простейшими работоспособными лифтами и часто использовались в UT2004. От обычного мувера такой лифт отличается только наличием специальных точек – выходов(LiftExit) и точки – центра(LiftCenter), они находятся в Actor Class браузере во вкладке NavigationPoint.
    LiftCenter помещается, как несложно догадатся в “центр” лифта – мувера, находящегося в позиции 0 и двигается вместе с ним, на этой точке AI будут стоять во время перемещения лифта. В свойствах LiftCenter, в одноименной вкладке указывается Tag лифта.
    Точки LiftExit – это условные выходы, через которые боты будут проходить после окончания движения мувера. В их свойствах задается Tag лифта и SuggestedKeyFrame (при каком ключе – положении будет активен этот выход)

    Обычный лифт (2 этажа)

    [​IMG]

    Тип муверов: KFElevator, 2x KFElevatorDoorMover, 4x KFTraderDoor
    Тип активации муверов: Elevator (лифт), TriggerToggle (Двери)
    Тип триггеров: 3x KFElevatorTrigger


    Разработчики ранее задумывали лифт в KF как таковой, в результате чего существует специальные муверы и триггеры. К сожалению с лифтами было связано много багов и ни на одной из официальных карт нет лифтов.
    Такой лифт можно вызывать и он имеет двери, которые открываются/закрываются в зависимости от положения лифта.
    Во первых нужно создать мувер – KFElevator и задать ему Tag и ключи – положения. В свойствах лифта, во вкладке KFElevator > ElevatorFloorTags нужно задать тэги для каждого ключа (Например BottomFloor для нижнего этажа и TopFloor для верхнего).
    Далее нужно добавить триггеры для лифта (KFElevatorTrigger). Один помещается внутрь лифта (в начальном положении), ему задается Tag (например ElevatorLiftTrigger), который также нужно ввести в свойствах лифта (вкладка KFElevator, поле ElevatorCenterTrigger), этим триггером можно будет запускать лифт изнутри.
    На каждый этаж также помещается KFElevatorTrigger. В зависимости от этажа на котором они расположены им задается Tag введенный ранее в ElevatorFloorTags (в свойствах лифта), с помощью этих триггеров лифт можно будет вызывать.
    Добавляются точки LiftExit и LiftCenter, здесь все так же как и с подъемником – платформой, но в свойствах точки LiftCenter кроме тега лифта, к которому он принадлежит вводится еще тэг центрального триррега (KFElevatorTrigger помещенный внутрь).
    Осталось сделать двери. Муверы типа KFElevatorDoorMover имеют недостатки, они могут быть поломаны или взорваны, так что лучшим вариантом является двери торговца, которые активируются KFElevatorDoorMoverами.
    Создаются верхняя и нижняя условные двери лифта, как FElevatorDoorMover и помещаются куда-нибудь за карту, где они будут скрыты от глаз игроков.
    Нижней двери в свойствах (вкладка KFDoorMover) задается ElevOuterDoorBottom = True. Верхней двери - ElevOuterDoorTop = True.
    Во вкладке MoverEvents для каждой двери задается Closing и Opening события, которые будут приводить в действие нижние или вверхние двери лифта, сделанные в качестве KFTraderDoor (например BottomDoors для нижней условной двери лифта и TopDoors для верхней).
    Делается по паре дверей торговца на нижний и верхний этаж, у каждой пары задан Tag, введенный в MoverEvents условных дверей.

    Таким лифтом могут пользоватся и вызывать его не только игроки.

    Уничтожитель

    [​IMG]

    Тип муверов: 11x Mover
    Тип активации муверов: 10x TriggerOpenTimed, BumpOpenTimed (рычаг)
    Тип триггера: нет (активируется мувером - рычагом)


    Нетрудно догадаться, для чего такая конструкция предназначена. На серьезных картах претендующих в белый лист конечно это будет лишним, но с такой штукой можно повеселится, к тому же она довольно легко делается и результат получается очень зрелищным.
    В конструкцию входят:
    - 3 пары крушителей;
    - 2 циркулярных пилы;
    - 2 держателя для пилы;
    - 1 рычаг.
    В свойствах пил и крушителей MoverEncroachType = ME_Crush_WhenEncroach, а также установлен большой EncroachDamage.
    Рычаг имеет Event, приводящий в движение пилы с их держателями и первую пару крушителей. OpenedEvent первой пары крушителей запускает вторую пару, а та в свою очередь третью, в результате чего получается небольшая цепная реакция.
    Что бы пилы вращались независимо от их активации, в их свойствах, во вкладке Movement был задан RotationRate по оси Yaw и установлен bFixedRotationDir = True.
    По прошествии определенного времени все муверы возвращаются в исходное положение и могут быть активированы снова.


    Вот собственно и все. Муверы - тема довольно интересная и при наличии фантазии можно создать уникальные вещи. Учитывая что игра разнообразием таковых не балует, ваша необычная идея обязательно запомнится игрокам. Удачи :thumbsup:

    В этой теме можете выкладывать свои варианты [​IMG]

    Upd (Flame). По возможности поправил картинки (взял из статьи МеталМедведа). Если автору будет не влом - пусть поправит оставшиеся. Ну или я попозже сам заскриню типы Mover'ов
     
    Последнее редактирование модератором: 25 окт 2016
    Stein, Denkul999, DukeNukem4ever и 19 другим нравится это.
  2. ЛОХМАТЫЙ

    ЛОХМАТЫЙ •*´¨`*•.,¸¸,.•*´¨`*•.,¸¸,.•*´¨`*•

    Мега-мануал ! :thumbsup:

    Это точно. Без дверей создать хорошую карту - это надо много знать другого, и фантазию.
    А так как двери+заварка - это одна из характерных особенностей КФ, то без дверей вообще никуда.
    А с таким мануалом двери будут работать, как надо :rolleyes:
    Плюс тут не только про двери как таковые.
     
  3. Greatfox

    Greatfox Слава великой богине Phyrnna

    Жжошь!

    Как все гайды допишешь, запилю сборник в виде .chm книги.
     
  4. Папка01

    Папка01 ۞ Всевидящее око форума ۞

    И сразу, можно сказать, в твой собственный подфорум. :wink:

    Титаническая штуковина.
    А ведь и правда, этими муверами-триггерами можно такой чумачечий мехаанизм замутить...Странно, сложнее лифтов, скейтиков, воротиков автомойки ничего не видел. Может только Аретефатто какой-нибудь. То ли картостроителли не прошерены по этой части, толи ленятся.
     
  5. zxzvenomzxz

    zxzvenomzxz Новенький

    Помогите с дверями магазина. При окончании волны дверь не открывается(Выбрал вид двери, выбрал traderdoor, установил дверь там где надо, установил начальное и конечное положение). Из-за чего это может быть?
     
  6. K-2

    K-2 Главный маппер форума

    Магазин - это ShopVolume. Во вкладке Events магазина должен быть задан Event совпадающий с тэгом двери. Для разных магазинов они должны быть разными. В крайнем случае можно открыть любую карту с нормальным магазином в редакторе, посмотреть все свойства и сделать точно так же.
     
    Папка01 и ЛОХМАТЫЙ нравится это.
  7. zxzvenomzxz

    zxzvenomzxz Новенький

    Спасибо, оказывается я не прописывал event в shopvolume.
     
  8. G-гурда

    G-гурда Солдат

    можно выложить карту что на скриншотах?
    мне на практике удобнее будет все это изучать)
     
  9. Freddy

    Freddy Капо

    Здесь это не там?
     
  10. CBAPLLLuK

    CBAPLLLuK Бандит

    Огромное тебе спасибо за все эти Гайды...

    Столько и сразу выучить за несколько дней... это было бы невозможным. Но с такими подсказками - проще простого!))

    :happy:
     
  11. UltraKill

    UltraKill Мододел "UM"

    уже второй месяц ищу такой мануал... спасибо огроменное.
     
  12. AHrEJl

    AHrEJl Новенький

    У меня вопрос, можно ли как-то настроить раздатчик, что бы бронижилет выдавалось за определенное количество денюжки, допустим 300?
    Деньгу выбрасывать все таки круто, но огромными частями не всегда хочется выбрасывать, возможно для этого нужно сделать какой-то мутатор, хз...
     
  13. K-2

    K-2 Главный маппер форума

    Трудный вопрос, наверное без мутатора не выйдет, поскольку триггер реагирует на само "касание" с определенным классом, а не на его свойства. Но можно к примеру создать "пункт обмена", установив в "приемник" несколько триггеров, реагирующих на определенное брошенное оружие.
     
    Папка01 нравится это.
  14. AHrEJl

    AHrEJl Новенький

    Тогда по другому поставлю вопрос. Можно ли поставить тригер на место, откуда будешь сбрасывать деньги, что бы сбрасывалось именно определенная сумма, допустим 300? Если можно то как?

    Другая проблема, беру статик меш по гайду - диван пкм, создать мувер, внутри дивана создается мувер но в виде пистолета, как решить?
     
  15. K-2

    K-2 Главный маппер форума

    Ни один триггер из стандартного набора(даже Scripted Trigger) к сожалению никак не может повлиять на сбрасываемую сумму или же на неё отреагировать. Я понял, что ты хочешь реализовать, но к сожалению у меня нет идей на этот счет :confused: Я не говорю, что это невозможно, но скорее всего единственное решение - создать новый actor класс и написать для него скрипт.

    Если появляется пистолет, то значит статик не выбран(он берется по умолчанию). А почему он появляется внутри дивана и что именно должно быть мувером? То есть диван уже создан(а следовательно уже предварительно был выбан)?
    Я просто не совсем понял...
     
    Папка01 нравится это.
  16. AHrEJl

    AHrEJl Новенький

    Создал диван, кликнул по нему(он подсветился как выбраный обьект), нажал создать мувер = пистолет.
     
  17. K-2

    K-2 Главный маппер форума

    Понятно, не надо было создавать диван как статик. Нужно было сразу выбрать его модель(в браузере мешей) и создать с помощью кнопки Mover, а не "превращать".
     
    Папка01 нравится это.
  18. camelot115

    camelot115 Новенький

    Как сделать отверстие для двери??))
     
  19. krestps

    krestps Капо

    самое простое взять "куб", установить у куба высоту, длину, ширину равную дверной.
     
  20. Ecstasyept

    Ecstasyept Соучастник

    K-2, красавчик! Все расписал что-как, спасибо!)