Маппинг и SDK

Создание карт в Killing Floor SDK

Всё ниже — пересказ общественного гайда по маппингу, написанного Holy Username Batman!: версия в Steam и её зеркало на mdBook. Знания, скриншоты и ругань — авторские, как и всё, за что автор благодарит других внутри текста. Эта страница нужна для того, чтобы материал пережил любые решения Steam и стал доступен русскоязычной части сообщества.

Вступление

KF1 SDK — это Unreal Editor 2.5 в шапке от Tripwire. Он медленный, он падает, половина его настроек врёт — и это по-прежнему единственный способ собрать карту для Killing Floor. Инструмент вы возненавидите, но останетесь, потому что игра того стоит.

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

И да, KF1 — старая игра с маленькой сценой. Если вы читаете гайд по её маппингу в двадцатых, значит, вы пришли сюда осознанно.

Патч на задержку выделения обязателен. metallicafan212 выпустил фикс печально известной 10-секундной паузы почти на каждое выделение актора: UE2SelectionFixes v0.3-Alpha-KF. Ставьте до всего остального: SDK превращается из неработоспособного просто в раздражающий.

Возьмите 4-гигабайтный редактор. Сообщество Siren Torturers поддерживает пропатченный KFEd, который снимает лимит памяти с 2 ГБ до 4 ГБ: KFEd-4gb.zip. В ST на нём сидят все, ведёт он себя прилично, и крупные карты перестают умирать от нехватки памяти. Если качать пропатченный исполняемый файл не хочется, ту же правку можно внести в KFEd.exe самостоятельно — об этом отдельный гайд.

Другие точки входа, смотря где вы находитесь:

  • Ни разу не открывали SDK: Getting started with the SDK объясняет, как его вообще запустить.
  • Любите видео: плейлист по Unreal Editor 2.5 неплох для полных новичков.
  • Хотите посмотреть, как маленькую карту собирают от начала до конца (без декора): видео автора гайда.
  • Интересует код, а не геометрия: начинать лучше с Lazy KF Wiki, а вопросы задавать в официальном Discord моддеров KF — там общая тусовка KF1 и KF2, так что ведите себя прилично.
  • Нужны собеседники-мапперы: в Discord Siren Torturers до сих пор есть несколько полуактивных мапперов KF1. Существует и неофициальный Discord моддеров KF1 (Bungalow), туда попадают по приглашениям.

Браузеры: три иконки, которые решают всё

Иконки браузера классов, текстур и статичных мешей на панели KF SDK

Шахматная пешка открывает Actor Class Browser, картина — Texture Browser, арка — Static Mesh Browser.

Actor Class Browser

Здесь живёт всё невидимое, что тем не менее влияет на игрока:

  • пикапы,
  • эмиттеры — дым, костры, туман,
  • проекторы — детальные тени, пятна крови, следы на стенах,
  • триггеры — двери и прочее взаимодействие игроков и специменов,
  • источники света,
  • звуковые эффекты.

Схема использования всегда одна: выделяете нужный класс, правый клик по вьюпорту, insert actor 'X'.

Texture Browser

Почти все «обои» поверхностей, которые используются в картах KF. Выбираете подходящую для пола, стены или потолка и применяете двойным кликом. Часть из них существует ещё и в виде материалов, натянутых на статичные меши. Про то, что движок вообще поддерживает — форматы, альфу и прочее — читайте UnrealTexturing.

Совет: для своих текстур поставьте что-нибудь вроде GIMP. Импорт и экспорт идут прямо через браузер текстур (.dds, размеры — степени двойки), и вы сможете фильтровать, комбинировать и обрезать сток куда свободнее, что особенно полезно для мешей. На форуме TWI есть приличная тема по текстурированию.

Второй совет: если работать вы всё равно будете в основном с текстурами, сначала выучите встроенные классы материалов — они работают, весят меньше и оптимизируются лучше. Самая простая точка входа — Material Modifier, и на UDN он расписан нормально.

Страница документации UDN по Material Modifier для UE2

Static Mesh Browser

Статичные меши — это готовые 3D-объекты, которые вы расставляете по миру: двери, трёхколёсные велосипеды, радиоактивные грибы, доши. Технически каждый из них — актор класса Object, и меши можно навешивать на другие акторы, придавая им физическую форму в игре.

Свои можно делать не выходя из редактора: собираете конструкцию из BSP, выделяете цветные контуры браша в 2D-вьюпортах (или каркас в 3D), затем правый клик → convert to static mesh. Наложенные текстуры уезжают вместе с мешем в выбранный пакет — myLevel или собственный.

Считайте меши переработанным сырьём. Собрали один раз, расставили сотню копий — рендерятся и отсекаются они заметно дешевле, чем эквивалентная геометрия.

Подробно об ассетах

Статичные меши

Конвертация BSP в статичные меши — приём удобный, но не хороший: сложная BSP-геометрия убивает производительность карты. Нормально оптимизированные меши делаются в настоящем 3D-софте вроде 3DS Max или Maya, а он стоит денег.

Альтернатива, на которой реально живут мапперы KF: берёте меши из стоковых карт, масштабируете (не больше трёх масштабных вариантов на объект — ради оптимизации), крутите и приспосабливаете под своё. Работает это исключительно на упрямой импровизации — вроде отрубленных голов, вклеенных в трупы, — но выходит в разы быстрее, чем моделить с нуля.

Есть общественная таблица статичных мешей с каталогом того, что существует и где лежит. Хотите её дополнить — спрашивайте в группе Siren Torturers.

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

Необязательное: 3D-моделирование для KF1

Blender бесплатен и всем знаком, но официально не умеет экспортировать .ase и .lwo, так что экспортёр придётся искать: io_export_ase. Ставится через Edit → Preferences → Install add-on, дальше ищете в списке «asci» и включаете галочку. После этого можно собирать простые меши и вывозить их в KF (текстуры — отдельно). Обратная дорога, из KF в Blender, требует дополнительных инструментов.

Другие варианты:

Когда файл .ase, .psk или .lwo готов, открываете браузер мешей и идёте в File → Import → ваш меш. Импортируйте в myLevel, если хотите, чтобы игроки скачивали меш вместе с картой; отдельный именованный пакет заводите только для действительно больших проектов, потому что каждый лишний пакет админам придётся раздавать.

Предупреждение: если у меша несколько материалов или UV-наборов, проверьте экспортёр заранее. Большинство из них на этом ломается, если у вас не волшебные руки.

Совет: Umodel отлично выгружает ассеты KF пачками, там же лежат плагины Un+ActorX для импорта-экспорта в 3DS Max. Есть и видео, которое спокойно смотрится на тройной скорости.

Где брать текстуры

Если умеете конвертировать в .dds и соблюдаете размеры-степени двойки, посмотрите сюда:

Как вписать свои текстуры в стиль игры

Выдержка из маппинг-гайда Tripwire о том, как попасть в визуальный стиль Killing Floor

Коротко: текстуры KF имитируют бамп-мэппинг за счёт наложения на саму себя копии текстуры, прогнанной через фильтр emboss и обесцвеченной. Если получилось слишком грубо — снизьте непрозрачность или размойте копию. Ещё текстуры KF контрастные, поверх базы у них лежат слои грязи и зернистости. Пригодится документация GIMP по emboss.

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

Есть ещё отличный подробный гайд, построенный вокруг одного примерного проекта — его стоит читать параллельно с этим.

Build и дыры в BSP

Кнопка build в правом верхнем углу каждый раз пересобирает всю карту целиком, из всех брашей, которые вы когда-либо добавляли или вычитали. Переключитесь в каркас (иконка полого куба над 3D-вьюпортом) — и увидите старые браши внутри стен, которые считали давно переделанными.

То есть браш — это не стена. Браш — это постоянная инструкция, которая продолжает действовать даже после того, как сквозь то же место прошли другие браши. Скелет под геометрией. Редактируя стену, вы двигаете невидимый примитив, который её создал.

Это фича, и её нужно эксплуатировать. В каркасном режиме можно:

  • перетащить браш, если стена стоит не там;
  • копировать коридоры и полы через Ctrl+C / Ctrl+V, а лучше дублировать через Shift+D;
  • удалить браш целиком и освободить объём;
  • повернуть браш инструментом поворота актора;
  • переключить браш между add и subtract в Properties → Brush.

Дальше жмёте build geometry (или build all) и смотрите, как все поверхности переливаются в новую форму.

Общий масштаб

Абсолютные минимумы по высоте:

  • игрок стоя — 108 юнитов,
  • игрок в приседе — 76 юнитов,
  • краулер — 56 юнитов.

Официальные размеры Killing Floor: двери, дверные коробки, оконные рамы, стены и полы в юнитах Unreal

Используйте это как линейку, а не как минимум. 216 юнитов — две высоты игрока, приличная высота потолка. Про минимальную ширину лучше не спрашивать: пути разваливаются задолго до геометрии, так что берите от 200.

Держите в голове: лайтмаппинг UE привязан к размеру BSP-браша. Один гигантский браш — не автоматически оптимальное решение.

Дыры в BSP

Вы их видели или ещё увидите. Это буквально дыры в карте.

Дыра в BSP: чёрный провал в геометрии пола

Ещё одна дыра в BSP, видимая в игре

Причина. Редактор путается на перекрывающихся брашах. Профилактика лучше любого лечения.

Правило первое: работайте на сетке 2 и выше. Grid 1 — чума.

Правило второе: неровные формы и лестницы в стиле transit делайте через 2D shape editor или редактирование вершин, а не стопкой брашей. Два полезных видео — раз, два — плюс туториал Hourences по BSP с самыми вкусными деталями.

Дыра появляется не при каждом пересечении. Это как сыр Шрёдингера: нельзя разрезать ту часть сыра, которую вы уже вырезали, и нельзя срастить обратно разные молекулы сыра. Дыры к тому же расползаются по плоскостям x, y и z с отклонениями, так что видимая дыра часто далеко от своей причины. Можно создать разрыв, год строить поверх него отличную карту и лишь потом набрести на место, где он вылезает.

«Но я не пересекаю браши». Пересекаете, на доли юнита. Редактор должен привязывать браши к сетке при включённой настройке, но прыжки в grid 1 и обратно с выделенным брашем ломают размеры или пивот. UE2 умеет привязывать к сетке только одну вершину браша за раз и упрямо выбирает не ту. Хитрые конструкции с острыми углами после vertex-редактирования и полигоны от руки дают тот же эффект.

Как искать. Через portal view. Дыры режут зоны на куски, поэтому вокруг них меняется раскраска зон. Дальше переключаетесь в каркас и ищете рядом пересекающийся браш по x, y или z.

Как чинить. Сначала спросите себя, надо ли: дыра существует, только если её видно. Дыры ещё и перемещаются по ходу починки, особенно если их у вас целый выводок, — поэтому храните версии файла карты, откатиться часто дешевле, чем отлаживать.

Если всё стоит на сетке, стыкуйте браши строго поверхность к поверхности либо масштабируйте один и удаляйте второй. Если браш сидит на половине клетки или хуже — конвертируйте его в статичный меш или через правый клик сделайте Brush → Type → SemiSolid / NonSolid.

Последнее средство — vertex editor. Правым кликом по вершинам вне сетки в 2D-вьюпортах возвращаете их на сетку (спасибо Broski). Последнее — потому что редактор в этот же момент радостно скидывает с сетки другую вершину, так что готовьтесь долбить одно и то же. Есть ещё actor align в командной строке и Edit → Reset → Brush → All, но надёжности от них не ждите.

Часто быстрее всего измерить расстояние через Ctrl + средняя кнопка мыши в 2D-вьюпорте и просто заменить браш целиком.

Привычки, которые снимают проблему заранее

Будьте занудой. Grid 1 — официально чума. Храните версии файлов. Пользуйтесь автосохранением. Когда всё-таки сломалось: сначала portal view, потом каркас, потом правка того места, где вы схалтурили.

  • Статичные меши — не BSP и дыр не создают в принципе; для декора они правильный ответ в 99% случаев.
  • Если меш не подходит, потому что важен свет именно на этом объекте, берите semi-solid или non-solid плюс блокирующий волюм, а настоящий BSP оставляйте на самый конец.
  • Если стену можно собрать из двух больших брашей вместо восьми — обычно так лучше, но лайтмаппинг зависит от размера BSP, поэтому куски держите примерно равными. Vertex-редактор и 2D shape editor тут по-прежнему лучшие инструменты.
  • Выберите один крупный размер сетки, покрывающий примерно 90% BSP на карте (обычно 32 или 64), и работайте кратно ему. На дверных проёмах, возможно, придётся его делить пополам — остальное не трогайте.

Vertex editor

Инструмент лучше своей репутации. Сначала включите vector snap:

Включение vector snap на панели KF SDK

Допустим, браш слишком большой или слишком правильной формы, чтобы состыковаться с соседней комнатой или мешем. Тогда:

  • выделяете браш;
  • Ctrl + Alt — рамка выделения вершин (в 3D-вьюпорте не работает), Ctrl + клик — одна вершина;
  • Ctrl + Alt + Shift — добавление к выделению;
  • правите в 2D-вьюпорте, спрятав акторы ради видимости.

Никогда не выключайте vector snap и не увлекайтесь острыми углами, если только вам сознательно не нужны дыры в BSP и провалы в межпространство.

Известный баг с треугольным BSP:

Баг путей и коллизии на треугольных BSP-колоннах

Похоже на кривую коллизию примитива. Одно из решений — нарезать BSP горизонтально на части; в этом конкретном случае помогла переделка путей так, чтобы зеды прыгали наружу от каждой колонны, а не между ними.

Свет

Правый клик по карте ставит источник света. Расстановка — вопрос вкуса, но три настройки делают основную работу.

Освещение в официальной карте Killing Floor Waterworks

Трассировка света в UE плохая. Очень плохая. Если после сборки освещения один из ваших источников схлопнулся в ничто — добавьте ещё. Многие мапперы ставят несколько ламп в одну точку с разным цветом, радиусом и яркостью. В официальных картах обычно раскидано много мелких источников: они подсвечивают нужные точки, имитируют более честное затухание от меша-светильника и создают атмосферу.

Ловушка в названии: свойство Display → ScaleGlow не имеет отношения к ambient glow. Оно масштабирует то, как свет взаимодействует со всей UV-развёрткой меша. Труба или меш скайбокса пересвечены на фоне соседнего BSP — уменьшайте ScaleGlow. Это сильно проще, чем модификаторы материалов, микроскопические радиусы света или Special Lit.

Ставьте RGB8 в настройках сборки света — выглядит лучше и оптимизировано лучше, чем DXT3. Доказательства.

SDK при запуске намертво задирает гамму. Добавьте -nogamma в Steam → свойства игры → параметры запуска либо запускайте KFEd.exe напрямую.

В свойствах света попадаются torchflicker, phase и им подобные. Не трогайте: Light Effect в игре никогда не работал, как бы убедительно ни выглядел превью в SDK. Нужен настоящий мигающий или пульсирующий свет — берите Trigger Light в браузере акторов и играйте с Light Type, Phase и Period.

Проблемы с лайтмапами: BeyondUnreal, ошибки лайтмапов.

Короны

Короны — это текстуры бликов, которые вешаются на свет, чтобы меш светильника выглядел живее. Их же чаще всего и переусердствуют, поэтому многие игроки отключают короны в настройках.

В браузере акторов есть пресеты, но ручной путь обычно лучше. Ставите обычный свет, дальше:

  • Properties → Light Color: яркость в 0, оттенок и насыщенность на ваш вкус.
  • Properties → Lighting: большой радиус, Corona = True.
  • Properties → Display → Skins: подходящая текстура — несколько есть в Departed_T.

Bloom

Bloom — дешёвое, но эффектное свечение, которое KF отдаёт как необязательную настройку графики, доставшуюся от кодовой базы Red Orchestra 2 у Tripwire. Спасибо jk за откопанную оригинальную тему про adaptive bloom на форуме TWI. Настройки задаются на уровень, в View → Level Properties → Bloom, и подкручиваются на лету консолью в practice-режиме.

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

Управляют эффектом пять параметров:

Contrast — postfxbloom_bpcontrast x. По умолчанию 1.0, минимум 0.0, максимум не ограничен (дальше ~3.0 лучше не уходить). Умножает изображение свечения до размытия, масштабируя картинку с предыдущего шага. Выше 1.0 — начинают светиться и более тёмные цвета.

BlurMult — по умолчанию 1.0, минимум 0.0, максимум не ограничен (практический потолок тот же ~3.0). Умножает изображение свечения уже после размытия, то есть отвечает за итоговую яркость bloom при наложении на кадр. Значения ниже 1.0 дают мягкое свечение и не дают ярким детализированным местам уходить в белое. (В исходной цитате для этого параметра указана та же команда postfxbloom_bpcontrast — почти наверняка опечатка автора темы.)

Ratio — postfxbloom_ratio x. По умолчанию 0.5, диапазон 0.0–1.0. Примерная доля экрана, которая должна светиться в каждый момент. Пересчитывается каждый кадр по накопленной средней освещённости кадра, затем ограничивается минимумом и максимумом ниже. 1.0 — светиться пытается каждый пиксель, 0.0 — ни один.

RatioMinimum — postfxbloom_ratiomin x. По умолчанию 0.0, диапазон 0.0–1.0, не выше RatioMaximum. Нижняя граница адаптированного Ratio. Поднимайте, если свечение пропадает, стоит игроку посмотреть на что-то яркое, что всё равно должно светиться. При 0.2 около 20% экрана продолжают светиться даже на полностью белой сцене.

RatioMaximum — postfxbloom_ratiomax x. По умолчанию 0.5, диапазон 0.0–1.0, не ниже RatioMinimum. Верхняя граница. Опускайте, когда светится то, что светиться не должно: например, контрастная галька на земле, где эффект иногда читается как блик, а иногда просто выглядит глупо.

Динамический свет

Свет по триггеру работает; его не увидят только игроки с отключёнными динамическими источниками.

Берёте TLight в браузере акторов, настраиваете, затем Properties → Object и включаете Trigger Toggles. Даёте свету тег, как муверу, и дёргаете соответствующим событием. Собираете свет — готово. Тени будут заметно слабее, чем у обычных источников.

Примеры в официальных картах: в KFO-Transit у первой двери с ключ-картой гаснет маленькая красная лампа и зажигается зелёная. В KFO-Foundry пошли дальше: скриптовый триггер спавнит актор-корону «фару» (готовый пресет короны), обычно после выполнения бонусной задачи.

Туман и сломанный оверрайд от TWI

Свойства KFSPLevelInfo с bUseVisionOverlay в False

Окно Level Properties в KF SDK

ZoneInfo Properties → ZoneInfo → DistanceFog = True

Цвет, начало и конец тумана — в ZoneInfo Properties → Distance Fog.

На улице туман в первую очередь инструмент оптимизации, но многие карты используют его ради настроения: подкрасить атмосферу, затемнить сцену (тёмно-серый в районе 1:24:24:24 — приличная отправная точка). Тестируйте тщательно, плохой туман уродует быстро. И учтите: границы тумана между комнатами сломаны — игра переключает его по позиции игрока, а не по линии обзора.

Ambient light лежит в ZoneInfo Properties → Lighting. Выглядит уродливо. Не трогайте.

Ещё две привычки. Без короны любой светильник выглядит чуть плоско, но корона на каждой лампе в маленькой комнате невыносима — решайте, какие источники несут сцену. И имитируйте отражённый свет мелкими дополнительными источниками, иначе тени получаются угольно-чёрными; Ferenos с этим перебарщивает, но поучиться у него стоит.

Левел-дизайн

Левел-дизайн — это искусство, и кривая обучения тут бесконечная. Если ваша первая карта выглядит мусором — так было у всех. Ощущение «всё ещё недостаточно хорошо» тоже никуда не денется, это классический синдром самозванца, поэтому главное — получать удовольствие.

Если хочется кликбейтной версии этого раздела, есть неплохой список советов по левел-дизайну.

Нужна тема

Листайте свою галерею, Pinterest, Getty Images, исторические эпохи и события, запомнившиеся места, фильмы, книги, другие игры. Выберите сеттинг и тему — зимний лабиринт, хоррор-подземелье, что угодно — и попробуйте привязать её к эмоции: любопытство, тревога, комизм. Затем соберите мудборд из референсов.

Два практических замечания: KF просит грязи и жести, а каталогизаторы сильно помогают. Allusion и PureRef бесплатны, есть короткое видео про работу с ними.

Планирование

Работает стандартное геймдев-правило: каждый ассет поддерживает тему, повествование или основную механику. Не лезет роскошная церковная галерея в карту А — запишите идею в блокнот и постройте под неё карту Б.

Как превратить план из прямоугольников в тему — вопрос к специалистам, посмотрите это и это, плюс ещё одно про objective-карты.

На этапе планирования помните про лайтмаппинг: он привязан к размеру BSP, поэтому крупные комнаты стоит сразу резать на примерно равные браши.

Ранний план KFO-карты от руки

Размеры

Планируйте как архитектор с чертежами, а не на глазок кубиками. Потом окупится.

Держите всё простым и широким: больше 200 юнитов для проходимых мешей, больше 256 для BSP. Это выручает и игрока, и до крайности тупые пути специменов.

Использование геометрии уровня как блокираторов обзора

Грейбокс

Соберите вайтбокс: базовая геометрия, проёмы, спавны, пути. Дальше думайте только о том, как в это играется.

Не наплодили ли вы десяток тупиков? Сыграйте роль человека, впервые попавшего на карту: что бесит? Меши и декор пока игнорируйте, всё равно, когда дойдёт до украшательства, вы будете в основном копипастить. Проверьте пути стрессом на волне 10+. Получится ли смешать интересные маршруты, не убив пути KF (нет, но попробуйте)? Можно ли пробить стену и найти компромисс?

Всегда недооценивайте пути в KF.

Свои ассеты и свет

Новичку или человеку с софтом 2010 года вряд ли светит делать собственные меши — ограничьтесь текстурами и звуками. Держите тестовую карту, чтобы комбинировать и масштабировать ассеты в изоляции.

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

Два исключения: если тема уже определена, можно поставить свет до текстур. А если нужны предсказуемые пикапы — KFSlot_Ammo_Pickup из Frightyard даёт 100% стабильный спавн патронов на любой сложности (спасибо braindawg).

Пасхалки

Пасхалка в KF-SawnOfTheDead, собранная из стокового декора

Она играет на общей нелюбви к сиренам, собрана только из стокового декора плюс проектор, замаскированный под столб света, хорошо оптимизирована и не требует дополнительных загрузок.

Ведите игрока. Интерактивные и важные части карты — в первую очередь проёмы — нужно подсвечивать: ярким светом или проекторами, пикапами как хлебными крошками, мешами вроде труб и заборов, характерными текстурами или линиями геометрии, уводящими взгляд. Звук тоже считается указателем. Игроки тупят; оставьте больше одной подсказки.

Коллизия

Столкновение с мешами и невидимыми стенами кажется мелочью. Это не мелочь: от неё зависит, ощущается карта цельной или сломанной.

Почти у каждого меша коллизия уже настроена. Properties → Collision позволяет уточнить, с чем он сталкивается:

  • NonZero Extent — живое: игроки и специмены.
  • Zero Extent — пули, удары топором, снаряды.
  • Projector — фонарики, пятна крови, проецируемые текстуры.
  • Actor — доши, эмиттеры и прочие объекты.
  • Плюс остальные, названия которых говорят сами за себя.

Ставите True/False по потребности. Эта часть действительно простая.

Сложнее — перекрыть зону игрокам, но не зедам, или починить меш, чья собственная коллизия не справляется. Поиск пути специменов в KF1 и без того плох, чтобы ещё игроки бегали по крышам и забредали в точки спавна, — здесь нужны волюмы коллизии.

Пользуйтесь ими осмысленно. Обычно ставится меш или платформа, которая визуально «закрывает» проход, а блокирующий волюм тянется заметно выше высоты прыжка. Иначе игрок подходит к нормальной на вид земле, упирается в невидимую стену, оказывается зажат зедами и умирает злым. Не ломайте погружение.

Blocking и ZedZone Volume

Если вы умеете лепить браши кубическим и цилиндрическим билдером, то и волюм слепите: делаете нужную форму, но вместо subtract берёте инструмент полупрозрачного синего куба и жмёте правый клик. Вариантов много, здесь важны два.

  • Blocking Volume — блокирует и игроков, и специменов (весь NonZero extent). Через Properties → Collision → Class Blocker можно блокировать конкретные классы, например KFMonster или акторы дошей.
  • ZedZone Volume — по умолчанию блокирует игроков, но не специменов. Полезно вокруг точек спавна.

Игрок стоит там, куда не должен был попасть

Ещё одно место за пределами карты из-за отсутствия блокирующего волюма

Триггеры

В браузере акторов лежит целый набор триггеров, и надёжно в KF работают не все. Реально используют два:

  • KFProxyTrigger — actor class browser → Trigger → Trigger
  • KFUseTrigger — actor class browser → Trigger → Use Trigger

Схема:

  1. Ставите разумно. KFUseTrigger — по центру двери, прокси-триггер — на важном объекте или рядом с ним.
  2. Properties → Events: даёте event короткое и уникальное имя, например Door1A.
  3. Целевому актору или муверу прописываете Tag с тем же именем.
  4. Готово. Так же запускаются звуки, скриптовые триггеры, задачи и муверы.

Правый клик по рамке 3D-вьюпорта → Actor → Radii view покажет радиус срабатывания красной сферой — полезнее всего для KFProxyTrigger. Размер меняется в Properties → Collision → collision radius / collision height.

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

Ещё два: shoot trigger работает (он есть в KFO-RE-Mansion и KFO-WestLondon), но капризен. И существует KFMusicTrigger — ни одна ванильная карта его не использует, так что скопируйте из пользовательской, чтобы увидеть, как он собран.

Муверы

Двери, лифты, всё движущееся — это муверы, и движение у них строго линейное. Что-то сложнее делается анимацией.

В теории просто: задаёте муверу пронумерованные ключевые позиции и указываете, что его запускает. Начинается всё с назначения меша мувером.

Собираем мувер

Инструмент мувера на панели KF SDK

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

SDK ставит обычный на вид меш рядом с активным красным брашем. Двигаете его в стартовую позицию, затем правый клик → Mover → Key 0. Это записанное начало. Снова правый клик, Key 1, и перемещаете или поворачиваете мувер туда, где он должен оказаться — SDK записывает переход линейно. Сложнее движение — Key 2, Key 3 и так далее.

Объясняем, когда двигаться

Окно свойств мувера

Важны три группы свойств:

  • Events — тег мувера, связывающий его с тем, что его дёргает.
  • Mover — время прохода между ключами и задержки.
  • Object — что именно приводит его в движение и как.

Ключевые моменты:

  • KFUseTrigger работает исключительно с KFDoorMover.
  • Encroach решает, что делать муверу, если на пути игрок или специмен. Вариант «ignore when encroach» умеет протаскивать объекты и игроков сквозь друг друга.
  • StayOpenTime (в Properties → Mover) задаёт, сколько мувер держит конечную позицию; отдельно в Properties → Object есть готовая настройка, которая доводит мувер до последнего ключа и через заданное время возвращает к Key 0.
  • Trigger Toggle прогоняет все ключи одним движением до последнего, а обратно к Key 0 идёт только по второму срабатыванию.

Остальное перечислять утомительно — все настройки разобраны в туториале по муверам UE2 и в гайде Lode.

Пути

В теории: правый клик по углам и вдоль коридоров, insert path node, готово. На практике — нет.

Точки путей и цвета маршрутов во вьюпорте SDK

Цвет говорит о качестве маршрута:

ЦветЗначение
Оранжевыйлетающий путь, узкий
Светло-оранжевыйлетающий путь, широкий
Светло-фиолетовыйтребует высокого прыжка, выше обычного
Синийузкий путь
Зелёныйнормальная ширина
Белыйширокий путь
Розовыйочень широкий путь
Жёлтыйпринудительный путь
Красныйодносторонний путь: A→B разрешён, B→A запрещён

Таблица взята из документации UE3, потому что документации по UE2 почти нет, но она многократно сверена с сайтмапом UE2 и с самим редактором.

Если путь синий, перекраивайте геометрию или навигационные точки, пока он не станет зелёным. Держите расстановку узлов аккуратной, полосы широкими, ставьте узлы только там, где они нужны, и оставляйте место для толпы.

Если зеды сыплются с лестниц и платформ, подозревайте неудачно поставленные узлы, маршрут, который стоило запретить (proscribe), или слишком узкий участок. Ну или добавьте перила.

А иногда плохие пути — это фича. В KFO-BossArenaNerf зеды периодически падают с платформ, несмотря на чистый маршрут, — и смотреть, как Патриарх несётся на вас и сваливается с доски в паре сантиметров от лица, по-настоящему весело.

Точки спавна (зомби-волюмы)

Инструмент волюма, которым создаётся зомби-волюм

Свойства ZombieVolume в KF SDK

Что стоит настраивать

По умолчанию всё работает, но пять параметров знать полезно.

1. AllowPlainSightSpawns. Уверенности в том, что код отрабатывает как заявлено, процентов на 80, но на этапе настройки и тестов включать не вредно. В релизе оставлять имеет смысл, когда спавн и так гарантированно вне поля зрения: волюмы отвратительно распознают статичные меши как блокираторы обзора.

2. MinDistanceToPlayer. Прямая дистанция по x, y, z, ниже которой близость игрока отключает этот спавн.

3. NoZAxisDistancePenalty. Исключает высоту из этой дистанции. Включайте, когда зеды падают откуда-то сильно сверху.

4. SpawnDesireability. KF сам решает, какому спавну отдать приоритет, преимущественно по дистанции; параметр смещает это решение. По умолчанию около 3000. Поднять забытый спавн до 4000 на тестах — нормально, опускать ниже дефолта почти никогда не нужно. Баланс важен.

5. OnlyAllowedZeds. Ровно то, что написано, и оно действительно работает. Полезно для маленьких волюмов — влезет Сталкер, но не всё подряд — или чтобы запретить Блоатов там, где пути на грани синего.

Ещё две привычки: маршруты из зомби-волюма должны быть зелёными, потому что сразу после спавна специмены хрупки и им нужны широкие полосы. И частичный туман считается блокиратором линии обзора, даже будучи неплотным; блокирующие волюмы — тоже.

Если спавн не работает

  • Правый клик по шапке вьюпорта → View → Paths и убедитесь, что путь не удалился сам. Такое бывает.
  • Поднимите CanRespawnTime — 3.0 разумный абсолютный минимум.
  • Верните остальные настройки, включая SpawnDesireability, к значениям по умолчанию.
  • Расширьте волюм (и комнату вокруг) через vertex-редактирование.
  • Добавьте блокираторы обзора или сожмите волюм, исходя из того, что bAllowPlainSightSpawns не работает.
  • Дальше можно посмотреть в сторону принудительного пути.
  • А когда отладка надоест — просто постройте новый волюм, это очень часто помогает.
  • Проверьте Pivot волюма (по ответу K-2 в теме «Вопросы, вопросы и еще раз вопросы.» на форуме killingfloor.ru). Если браш ZombieVolume (или сам Volume) меняли через Vertex Editing или выравнивали по сетке правым кликом, Pivot может оказаться на границе или вовсе за пределами волюма. Сбросить его можно через ПКМ > Reset > Pivot; главное, чтобы он был внутри волюма, желательно в центре. Какие именно ZombieVolume не работают и почему, пишется в логе при запуске теста через Play Map.

Ландшафт

Как заставить его работать

Начинайте с официальной страницы про создание террейна.

Кратко: нужна «комната», отделённая zone portal (или просто отдельная), а внутри — актор ZoneInfo. В ZoneInfo → Properties выставляете TerrainZone = True. Без этого шага ландшафт не заработает никогда.

Дальше выбираете нужную текстуру, выделяете её, открываете инструмент террейна слева и жмёте make new terrain (иконка новой страницы). Называете текстуру-хайтмап и кладёте её в myLevel. В точке камеры появится актор TerrainInfo.

Оставаясь в инструменте террейна, переходите на вкладку Layers и создаёте новый слой (иконка новой страницы справа). Документация советует оставить свойства нового слоя по умолчанию — но KF обожает ставить U Scale и V Scale в 0. Это масштаб тайлинга текстуры, так что 0 означает: ландшафт есть, работает и абсолютно невидим.

Лепка

Когда всё отображается, за инструменты берётся страница редактирования террейна.

На практике удобнее всего кисть с последующим сглаживанием, сила чуть меньше 50:

  • Ctrl + левый клик поднимает холмы и горы,
  • Ctrl + правый клик вырезает низины.

Если холм получился хороший, но мелкий, выделите его через vertex-редактирование (Ctrl + M1, затем Ctrl + M1 + M2) и потяните мышь вверх — поднимутся все выделенные узлы, после чего переходы придётся выравнивать сглаживанием и кистью.

Готовьтесь страдать: редактор террейна лагает примерно в 10 раз сильнее остального SDK и падает раза в три чаще.

Чек-лист по багам ландшафта

Актор ZoneInfo с TerrainZone в значении True

Свойства слоя террейна с положительными U Scale и V Scale

Если ландшафт собран, всё вышеперечисленное верно, а он всё равно невидим: откройте инструмент террейна, выберите слой во вкладке Layers, режим «paint» и нанесите текстуру слоя на ландшафт через Ctrl + M1.

Слои

Когда форма устраивает, смешивайте несколько текстурных слоёв по странице про слои террейна. Там же стоит почитать про deco-слои. Сайтмап UDK Two обычно точен для KF SDK — поэтому он и мелькает в гайде так часто.

Скриптовые триггеры

На вид страшные, на практике простые. Ищите в браузере акторов: Keypoint → AI_Script → Scripted Sequence → Scripted Triggers.

Правый клик открывает свойства, дальше AI Script → Add. Выпадающий список показывает всё, что скриптовый триггер умеет. Цепочка из нескольких действий уже похожа на блюпринты — этого хватает, чтобы вытянуть story- и objective-карты.

Команды, которые стоит освоить первыми:

КомандаЧто делает
Wait_For_EventС неё начинается 99% цепочек. Любой триггер порождает событие; эта команда его ловит и запускает дальнейшие действия.
Display_MessageВыводит белое сообщение, как в story-картах. Отлично для отладки. bBroadcast = True и importance = Critical покажут его всем игрокам.
Spawn_ActorСпавнит акторов в точке триггера — так story-карты выпускают специменов по таймингу. В списке выбирайте kfmod.Gorefast_STANDARD и подобные: без _STANDARD работать не будет.
Go_to_ActionОбычно возвращает цепочку к действию 0. Годится для циклов, но бесконечный цикл без таймеров и задержек уронит KF.
Trigger_EventПорождает новое событие, позволяя связывать скриптовые триггеры друг с другом или запускать что-то по таймеру, например выдачу награды за коллекционный предмет.
Play_SoundПроигрывает звуковой файл (взрывы и прочее) в нужный момент и в нужном месте.
Play_Local_SoundТо же, но клиент играет звук локально с фиксированной громкостью.
IfConditionВаш if. В Triggers → triggeredCondition лежит актор, который переключает условие при срабатывании. Если условие с этим тегом выключено, скрипт прыгает к следующему EndSection. Работает только пока все настройки Condition равны True (изначально включено).
IfRandomPctПринимает значение от 0 до 1 — вероятность выполнения следующих действий. При «нет» скрипт уходит к следующему EndSection. По ощущениям срабатывает чаще, чем обещает число, так что проверяйте.
EndSectionОтмечает место, куда возвращается ветка «If», если условие не выполнилось.

Важно: все скрытые акторы уничтожаются хостом на старте игры — то есть хост считывает и сохраняет скрипты скриптовых триггеров ещё до начала матча. Поэтому уничтожение самого актора по ходу игры ничего не даёт. Цикл через GoTo либо крутится вечно, либо должен быть осознанно остановлен командами «If» или отключением скрипта.

Разобранный пример — KFO-BossArenaNerf: откройте в SDK и разберитесь, что там происходит. Официальные story-карты тоже прекрасное чтение.

KFUseTrigger работает только с KFDoorMover. Скриптовые триггеры игнорируют его события, как и всё остальное. Название вроде KFDoorTrigger сэкономило бы людям много времени. Обходной путь: если нужно, чтобы клавиша использования запускала скриптовый триггер, ставьте обычный актор Trigger и включайте у него bUseTrigger = True во вкладке Object.

Zone Info: небо, ландшафт, туман

Новичкам безопаснее всего вообще не трогать ZoneInfo — большая часть неприятностей от него на совести Tripwire, а не вашей, но неприятности от этого не исчезают. Актор лежит в Info → ZoneInfo.

Зона — это любое пространство, отрезанное от остальных порталами (скрытыми акторами, а не телепортами, хотя технически они могут сработать и так, и выглядит это ужасно). ZoneInfo позволяет менять свойства этой зоны. Без него игра применяет умолчания.

Поводов использовать его хватает — общая яркость, несколько скайбоксов, единая дистанция отсечения мешей, — но UE2 капризен, поэтому на практике берите его для трёх вещей: ландшафт, скайбоксы, туман.

Ландшафт. Если террейн не появляется в зоне, ставьте ZoneInfo → TerrainZone = True. С этим ландшафт, проходящий через другие зоны (пещера, проём), отрисуется и там. Без — невидимый и несплошной.

Скайбоксы. Скайбокс — изолированная комната, дающая живую панораму неба вокруг карты. Вставьте дочерний актор SkyZoneInfo — это «камера» скайбокса. Соберите, поставьте её внутрь комнаты скайбокса, и больше её свойства обычно не трогают. Учтите, что камера сильно приближена.

DistanceFogStart
DistanceFogEnd
DistanceFogColor

Чем меньше разрыв между началом и концом, тем плотнее туман. Отрицательное начальное значение допустимо, если хочется поэкспериментировать. Цвет задаётся байтами 0–255 для оттенка, насыщенности и яркости.

KillZ — не надо. Если под ландшафтом образовалась гигантская пустота, ZoneInfo → KillZ формально убьёт всё, что упало ниже заданной координаты, но доверять этому не стоит. Используйте vertex-редактирование, KillVolume или и то и другое. KillZ — крайняя мера для отчаявшихся, наблюдающих, как зеды проваливаются в бездну и устраивают там рейв за счёт вашего фреймрейта.

Известная бяка: полупрозрачные меши способны перекрывать эмиттеры и другие полупрозрачные материалы в скайбоксе, если смотреть сквозь BSP, — особенно туман и облака. Лечения не найдено, так что проверяйте результат пораньше и почаще.

Objective-режим

Если вы дочитали до этого раздела, вас ждёт много боли. Вот как её уменьшить.

Сами задачи

Акторы задач в браузере акторов KF SDK

Задачи обязаны быть названы, и первая всегда называется start. В View → Level Properties (или F4) объявляется ожидаемый порядок задач по именам. На этом простая часть заканчивается.

Главный актор — KFLevelRules_Story, лежит в Actor Browser → Info → LevelGameRules → KFSPLevelInfo. Он задаёт общие правила: стартовое снаряжение игрока, максимальное число зедов (по умолчанию 32), стартовые деньги и награду, а также магазин.

Objective-режим — это набор триггеров и событий, которые вы связываете сами, как в story-режиме, только чуть автоматизированнее, с полурабочим, но красивым HUD и своеобразной системой агро. Сначала придумайте, что должно происходить, потом разбирайтесь с проводкой: какой актор порождает событие, когда оно срабатывает, что делает.

Имеет смысл сделать маленький KFO-проект для тренировки, а потом переходить к story-карте с префиксом KF-: там доступно всё то же самое, кроме wave- и squad-дизайнеров, так что спавн зедов придётся делать вручную, если только не писать мутатор.

Проектирование задач

Свойства KFStoryObjective

KFStoryObjective — мать всего KFO. Важны три группы свойств.

Objective Conditions — обычно то, что игрок должен сделать или чего должен избежать, но необязательно: HUD можно отключить и использовать скрытые триггеры событий. Когда выполнены все success conditions с progress importance normal, задача считается выигранной; когда выполнены failure-условия — проигранной.

Значение progress importance: critical означает, что выполнение этого условия в любой момент переводит карту к следующей задаче независимо от остальных. Отдельно стоит помнить: вайп команды — всегда поражение, это зашито в движок, добавлять его в failure-условия не нужно, что оставляет пространство для альтернативных маршрутов.

Objective Actions — что происходит при победе или поражении:

  • Win Game
  • Lose Game
  • Go To Last Objective
  • Go To Next Objective
  • Go To Objective "(имя)"
  • Reset Current Objective
  • Restart From Checkpoint
  • Random

Objective Events — события, которые можно запускать при активации, завершении, деактивации или провале задачи. Взрывы, двери, звуки, волны зедов, скриптовые триггеры — что угодно.

Trigger ObjCondition

Condition — по-настоящему мощный скриптовый инструмент. Для тех, кто пишет код, это ваш IfCondition: можно делать «не-задачи» вовсе без HUD и использовать их как обычную логику.

Подсказки в мире (World Hint)

В любой карте, похожей на story, игроки теряются. World hint — это текст, текстура или и то и другое, висящие в пространстве как подсказка; канонический пример — указатели золотых слитков в KFO-Steamland.

Настройка, которую все пропускают, — IgnoreWorldLocHidden. Подсказки держите короткими. На выделенных серверах они работают нестабильно, так что либо тестируйте на настоящем сервере, либо используйте вместо них статичный меш-мувер (по принципу граффити).

Подсказку видно из любой точки карты, поэтому включайте её отдельным не-объективным условием по событию: хорошо работает событие ProgressPct из области objective condition с выключенным требованием полной команды.

Актор диалогов

Копируйте из официальной карты. Что важно знать:

  • длительность показа зависит от количества символов,
  • длительность звукового файла её перекрывает,
  • между окончанием одной реплики и запуском следующей закладывайте около 1,5 секунды; штука чувствительная, а таймеры проще делать скриптовым триггером.

Катсцены

Смотрите концовки официальных карт или Mansion.

KFSceneManager:

Свойства KFSceneManager

Кинематографическая камера:

Свойства KFCinematicCamera

Разное

Не разобрано выше: задачи можно триггерить, пока они не активны; условия задач могут зависеть от других условий внутри KFStoryObj; wave- и squad-дизайнеры определяют, какие зеды идут из каких зомби-волюмов.

Для задач со сваркой копируйте актор KFStoryObj из официальных карт. Там сложная связка — уникальные акторы, два и более условия на каждый сварочный узел, обвязка HUD — и повторять это руками не стоит нервов.

Для задач, которым нужен волюм, подойдёт любой волюм, если вписать его имя (Properties → Object → Name) в условие задачи. Берите обычный Volume: у специального объективного волюма есть лишний код, который спамит в чат «Forbidden!!!», если зайти внутрь до активации задачи.

Дальше по теме: гайд по wave- и squad-дизайнерам, страница objective-режима на вики Tripwire про progress events и туториал по story-карте Containment.

Баги

  • Wave-дизайнер поддерживает одну волну на актор. Выглядеть будет так, будто тянет больше, и срабатывать это будет процентов на 10–30. Ставьте несколько wave-дизайнеров.
  • Зеды умирают на спавне? Отключите killStragglers в акторе правил уровня. Если помогло — отлично; если нет, у вас проблема с путями.
  • HUD в KFO (название задачи и детали в углу) удаляет сам себя примерно через 30–60 минут аптайма без внятной причины. Стабильно воспроизводится на KFO-30WaveChallenges. Не выносите туда информацию, критичную для прохождения.
  • World hint к тому же конфликтуют между картами. На клиенте подсказка пользовательской карты может замениться подсказкой официальной KFO-карты или той, в которую вы играли до этого. Требование подобрать несуществующий золотой слиток — обычное дело.

Портирование карт в UE3

У UE3 есть лимит полигонов при импорте карты: 65535. То есть — партиями.

Подробности в теме на форуме TWI.

Сколько работы займёт портирование, сильно зависит от исходной игры, и лучше всего идёт там, где есть нормальный набор инструментов — SDK, Hammer и подобное.

Для Dungeon Defenders подход такой: в DDDK собираете все ассеты, относящиеся к карте, и перемещаете их в новый пользовательский пакет. Именно перемещение, а не копирование, автоматически перепривязывает ссылки на материалы к новому пакету. Изменения в стандартные UPK игры сохранять нельзя. DD построена на более старой UDK (UE3), поэтому материалы, текстуры и пакеты вытаскиваются сравнительно легко — но раскладывайте всё по категориям сразу, иначе быстро потеряете нить.

KF2 — это более новая и сильно переделанная UE3, поэтому очевидная идея загрузить пакеты как есть не работает. KF2 SDK выдаст стену ошибок: несовпадение структуры UPK, битые рендеры мешей, падения на партиклах.

Основной виновник — старые рендеры мешей. Нужно распаковать UPK в сыром виде, взять PSKX, импортировать в 3DS Max плагином ActorX и экспортировать в FBX (2014/2015). Версия принципиальна: ошибётесь — KF2 SDK упадёт.

Когда пакеты готовы, собирайте карту медленно. Выделенные меши экспортируйте из DDDK в .t3d, тогда они сами встанут по местам в KF2 SDK. Падение при импорте означает, что один из мешей битый, — именно поэтому импортируют небольшими порциями, а не смотрят, как SDK умирает на выделении памяти. Дальше пересобирается всё: свет, пути, волюмы.

Есть чуть более эффективный путь, описанный Steven; поддержку можно получить в Discord моддеров KF:

Перенос BSP из KF1 в KF2 через UT3Converter

Способ с форума killingfloor.ru (parollpasse, 2015, по теме на форуме TWI) переносит только BSP-геометрию (браши), без мешей и текстур:

  1. Распакуйте UT3Converter в папку без кириллицы в пути.
  2. В редакторе KF1 откройте карту. В одной из 2D-проекций щёлкните правой кнопкой по брашу: Select → NonSolids и удалите их клавишей Delete.
  3. Снова правой кнопкой: Select → All Brush, скопируйте Ctrl+C.
  4. File → New, затем Edit → Paste.
  5. File → Export в формат .t3d.
  6. В UT3Converter: T3D File → T3D Level → Scale Map. Масштаб 1 переносит карту 1:1, но в KF2 она покажется игроку маленькой; рекомендуют 1.5-2.
  7. В редакторе KF2 создайте огромный браш, нажмите Ctrl+A, импортируйте сконвертированную карту и сделайте Build All.

Оптимизация

Оптимизация здесь означает две вещи: меньше полигонов и эффектов на экране одновременно и меньше нагрузки на железо ради FPS игроков.

До всех умных приёмов: держите количество разных экземпляров статичных мешей низким, а это в основном значит не плодить копии одного меша в разных масштабах. Масштабирование прекрасно для творческого переиспользования ассетов и одновременно означает больше вычислений, меньше производительности и больший размер файла.

Меньше полигонов

Один путь — превращать аддитивные браши в semisolid через special brush builder или правый клик → Type. Когда это уместно, объясняет туториал Hourences про semisolids.

Второй путь — отрисовывать меньшую часть карты за раз: грамотный левел-дизайн плюс порталы и антипорталы.

Порталы

Откройте любую стоковую карту KF в SDK — увидите текстурированные «простыни» поперёк проёмов, арок, окон и стыков комнат, которых в игре нет. Это порталы.

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

Как сделать:

  • постройте лист инструментом Sheet Builder (рядом с кубическим билдером),
  • поставьте его на место, в идеале точно по проёму или окну,
  • примените пресет Portal инструментом Special Brush.

Либо включите флаг Portal в свойствах поверхности плоского браша — оба способа рабочие.

Подогнать размер точно мешает то, что UE не показывает габариты выделенного браша. Ctrl + средняя кнопка мыши рисует линейку; помимо этого, заранее выписанные в блокнот типовые размеры дверей и окон экономят часы.

Антипорталы

Ещё один пресет Special Brush и концептуальная противоположность. Порталы описывают, что видно; антипорталы — что не видно, и отсекают только объекты, закрытые полностью.

Ставьте их внутрь ландшафта, стен или крупных мешей. Всё, что они закрывают целиком, перестаёт рендериться.

Никогда не помещайте антипортал внутрь аддитивного BSP или сплошного объёма.

Эмиттеры

Системы частиц — крупнейший пожиратель производительности в картах KF. Используйте их экономно и не увлекайтесь настройками. Можно попробовать привязать их видимость к ZoneX → Object → Name — работает наполовину, в KF-Wyre это как-то удалось.

Коллизия

(Спасибо гайду Fel.) Статичные меши с коллизией, особенно nonZeroExtent, стоят удивительно дорого. Если мешу коллизия не нужна — выключайте.

Перебирать по одному невыносимо, поэтому выделяйте пачками:

  • люстрам коллизия не нужна → правый клик → выделить все меши этого типа → коллизию выключить;
  • мешам в перекрытых зонах коллизия не нужна → выделить все меши зоны → коллизию выключить.

Дистанция отсечения

У каждого меша есть Display → CullDistance — расстояние, дальше которого он перестаёт рисоваться. Меньше значение — быстрее игра. Игроки на слабых машинах могут переопределить это настройками; всё равно оптимизируйте под большинство. Как связать CullDistance с туманом, чтобы пропы не «выныривали», — в статье CullDistance и туман расстояния.

Shift + средняя кнопка мыши рисует линейку в 2D-вьюпортах для замера этих расстояний. В неудобных случаях растяните билдер-браш на нужный промежуток и посмотрите его размер.

Смотрите лог

Часть лагов приходит от того, чего не видно:

  • неактивные условия KFO, продолжающие рисовать HUD,
  • циклы destroy actor,
  • циклы скриптовых триггеров и муверов,
  • декорации на физике Karma.

Крайние меры

  • Накладывайте текстуру Engine.Black на BSP-поверхности, которых игрок никогда не увидит: внутренности спавнов, крыши, изнанку проёмов за меш-косяками.
  • Используйте Display → LOD Bias (переопределение масштабирования LOD по дистанции) на массовых и невыразительных мешах.
  • STAT RENDER в консоли показывает текущее число полигонов на экране.

Трюк с фреймрейтом, которого быть не должно

Иногда не помогает ничего, а потом помогает абсурд: вырезать все меши, сохранить карту, перезапустить редактор, вставить обратно, пересобрать. Наблюдался прирост фреймрейта примерно вдвое.

До:

Фреймрейт до трюка с вырезанием и вставкой мешей

После:

Фреймрейт после повторной вставки всех мешей

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

Дополнительно: как оптимизировать карту.

Мысль напоследок: в террейне UE5 компоненты дублируют смежные вершины, увеличивая объём данных и стоимость. Скорее всего, для UE2 это тоже верно, то есть крупные секторы террейна оптимальнее, но могут ухудшить коллизию — компромисс, который стоит проверять, а не принимать на веру. Похожие настройки есть у kfFluidActors. Опыт показывает: если вы не готовы копать всерьёз, лучше не начинать.

Тестирование

Непротестированная карта — мусорная карта. Без исключений.

Иконка геймпада наверху SDK даёт быстрый запуск, и для точечных проверок это отлично. Для всего важного тестируйте в Killing Floor → Solo, по двум причинам: можно накинуть мутаторы вроде fakedplus и проверить масштабирование спавнов и баланс, и вы играете на привычных уровнях перков.

Ведите записи и меняйте манеру игры — вы тестируете, а не катаете Biolabs. Меняйте перки, пробуйте разные точки удержания, смотрите, что происходит. Ближе к релизу делайте bump-тесты: проходите вдоль всех стен и перил, ищите места, где застреваешь, и закрывайте их блокирующими волюмами.

Тестирование на сервере

Если тест в игре вдвое полезнее теста в SDK, то тест на сервере полезнее в разы. Поднимите локальный выделенный сервер, разберитесь с пробросом портов, затащите друзей.

Почему это важно:

  • часть багов вылезает только на выделенных серверах,
  • если карта зайдёт, 90% игроков увидят её именно на выделенном сервере,
  • всплывают проблемы совместимости с ходовыми мутаторами,
  • вы проходите карту командой,
  • а тестеры будут долбить вас коллизией, спавнами и путями, пока всё не будет вычищено.

Полезное: гайд по настройке сервера, бесплатный 48-часовой сервер на PingPerfect, дешёвый VPS на Contabo.

Тестирование с ботами

Для соло полезен мутатор KF Bots. Распаковывается в папку System игры. Эти боты заметно менее тупые, чем официальные.

Консольные команды

Стандартные, для соло или админа сервера:

КомандаДействие
enablecheatsпомечает игру и открывает команды ниже
loadedбесконечные патроны
godнеуязвимость (той же командой выключается)
flyполёт
ghostполёт со сквозным проходом через всё
walkвыход из fly или ghost
slomo 2скорость игры 2× (число меняется)
causeevent 123вызвать любое событие по имени

Пользовательские:

КомандаДействие
HugeGnomeколлекционные предметы становятся примерно в 20 раз больше
MopUpубивает зедов и печатает их количество в консоль
Arsenalвыдаёт всё оружие
FreeCameraсвободная камера, но, похоже, сломана
ViewSelfкак из этой свободной камеры выйти
Backupспавнит ботов
Hordeспавнит случайных зедов — удобно проверять пути из волюмов, не дожидаясь поздней волны и не рисуя волны KFO заранее

Советы и горячие клавиши

Стабильность и настройка

  • Сохраняйте копии часто. Программа упадёт. SDK рисует куда больше, чем сама игра, и потому прожорливее Killing Floor. Ловите вылеты по памяти — снизьте настройки графики в игре, редактор наследует их.
  • Просмотр лога: View → Log. Пишет ошибки и предупреждения SDK по мере появления, незаменим при отладке и моддинге.
  • Автосохранение: SDK держит десять файлов за последние два часа в папке карт, с именами от auto0 до auto9.
  • Гамма: SDK при запуске насовсем задирает гамму. Добавьте -nogamma в Steam → свойства игры → параметры запуска либо открывайте KFEd.exe напрямую.
  • Режим совместимости: правый клик по KFEd.exe → Свойства → совместимость. Больше всего помогают Windows XP (Service Pack 3) и Windows 8.
  • Обрезанные окна: многие окна свойств обрезаются и не растягиваются. Попробуйте разрешение 800×600.

Настройки совместимости для KFEd.exe

Тема в Steam с описанием фикса через User.ini и WindowPositions

  • 4-гигабайтный SDK (KFEd): скачать, снимает лимит памяти.

Навигация и рабочий процесс

  • Ctrl + Alt + M1 — рамка выделения, только в видах сверху, спереди и сбоку.
  • Многое двигается и нажимается только с зажатым Ctrl. Если что-то отказывается реагировать, попробуйте.
  • Информация о текстуре: правый клик по стене или поверхности → Properties. Вверху окна — имя текстуры и путь к пакету.
  • Информация об акторе: Properties → Display → Mesh показывает имя и каталог выбранного статичного меша.

Булев параметр, который нужно включить при наложении своих скинов на меш

  • Большие карты тормозят редактор. Ортографические виды (сверху, сбоку, спереди) переносят это гораздо лучше, чем 3D. В 3D-вьюпорте приближайтесь так, чтобы рисовалось как можно меньше.
  • Линейка: Shift + средняя кнопка мыши. Иначе годы уходят на пересчёт клеточек. Ещё приёмы — в этой теме.
  • Shift + D (дублировать) почти всегда лучше копипаста.

Варианты массового выделения в контекстном меню KF SDK

Инверсия выделения в KF SDK

Также можно выделить все акторы одного типа, все add или subtract, все браши или всё содержимое группы через group browser.

Инструмент показа всех акторов на панели KF SDK

Меню настройки видимости во вьюпорте

Точечные фиксы

  • Для по-настоящему упрямых дыр в BSP: правый клик по проблемному брашу → Type → перевести в semi-solid или non-solid (плюс блокирующий волюм). Затем попробуйте Build Options → Lower BSP Cuts.
  • Проверяйте детали регулярно. Большинство проблем с первого взгляда не видно.
  • Скользкий пол: совет с форума.
  • Осторожнее с масштабированием статичных мешей — каждый масштабный вариант сохраняется в myLevel отдельным мешем. Свои меши тоже держите там: myLevel скачивается вместе с картой.
  • KFUseTrigger работает только с дверями — подтверждение. Используйте Trigger, ProxyTrigger или Mover → MoverEvent.
  • Катапульты и отбрасывание: гайд на форуме.
  • Своя камера лобби для карты: туториал на форуме TWI.
  • На число акторов вроде источников света и навигационных точек есть жёсткий лимит, значения большие и невнятные. Сверяйтесь с чем-то вроде KF-Hive, чтобы понимать запас. Дальше остаётся резать карту на несколько и связывать их командой смены карты в скриптовых триггерах.

Просчёт Tripwire с цветокоррекцией

В стандартном KFLevelRules есть код, отключающий цветокоррекцию KF, но из-за опечатки (KFLevelRule.) и упущения в самом KFLevelRules — там просто нет нужного булева параметра — воспользоваться им нельзя. Настройки цветокоррекции в ZoneInfo тоже не делают ничего: код там ровно тот же.

Рабочий код остался ровно в одном месте — в акторе story-режима. И он работает, и влияет на внешний вид карт колоссально. Разные световые темы становятся точнее.

Чтобы увидеть разницу, положите KFSPLevelInfo в обычную карту и поставьте levelInfo->bUseVisionOverlay в false.

Это тот же актор и та же настройка, что и в разделе про туман выше.

Советы сообщества

Запрос на сохранение myLevel, на который всегда отвечают отказом

  • Соглашения по именованию ассетов, которыми пользовались приличные создатели KF-контента: version mismatches and you.
  • Изучайте официальные карты. Там уже знают, что стабильно и что оптимизировано.
  • Дополнительная функциональность SDK через настроенный список акторов — описано здесь; unrealed.ini чувствителен, будьте аккуратны.
  • Не садитесь за этот проклятый SDK без музыки или подкаста.
  • Святой Грааль основ BSP — видео про 2D shape editor, особенно отрезок примерно с 2:02 до 5:00.

Горячие клавиши

КлавишаДействие
Qпоказать/скрыть BSP
Wпоказать/скрыть статичные меши
Oпоказать/скрыть волюмы
Fпоказать/скрыть туман
Hпоказать/скрыть акторы
Bпоказать/скрыть билдер-браш
Ctrl + Wвыровнять текстуры BSP
Ctrl + Sинструмент subtract
Ctrl + Aинструмент add
Shift + Lприменить текстуру ко всем выделенным поверхностям
F8параметры сборки — свет всегда ставьте в RGB8

Расширенный список: UnrealEd keys.

Известные ошибки

  • Удаление KF SDK стирает все ваши мутаторы и бинды Killing Floor. Так что не надо.
  • Задержка выделения — проблема UE2 на современных видеокартах, обсуждение. Практический ответ — патч из вступления.
  • Выделение поверхностей тормозит ещё сильнее. Приближайтесь так, чтобы редактор рисовал как можно меньше.
  • KF ненавидит пробелы в именах импортируемых файлов. Никогда их не используйте, особенно в звуках (.uax).
  • Если импорт текстуры молча ничего не делает: уберите из пути к файлу пробелы и кириллицу, берите .dds, .tga или .bmp со сторонами степени двойки (256, 512, 1024) и ищите результат в том пакете, который указали в окне импорта (по теме «Проблемы с SDK» с форума killingfloor.ru).
  • Конфиг, отвечающий за сохранение настроек сборки, сломан, а правка UnrealEd.ini руками ломает редактор капитально. Не надо.
  • Лимит статичных мешей: импортированные меши больше 22 000 треугольников деформируются. См. static mesh import errors.
  • Современный 3DS Max и Blender 2.81+ ни разу не экспортировали в KF1 меш с несколькими UV или материалами — это известная проблема, а не невезение.
  • Сломанные меню сборки или террейна: тема с решением.
  • Если отправить карту на тест с ресурсами из Workshop или модов, не приложив сами ресурсы, карта вообще не появится в списке у тестера. Попросите открыть файл карты в SDK — там будет подробный отчёт о недостающих ресурсах.
  • Если карта не появляется в списке карт Killing Floor, обычная причина — недопустимый символ в имени (например, точка) или отсутствие префикса KF/KFO. Ещё бывают недостающие зависимости, поэтому смотрите лог в реальном времени при открытии файла в SDK.
  • Отмена (Ctrl+Z) урезана и способна уронить редактор при откате перемещения проекторов. Если всё равно пользуетесь — сохраняйтесь чаще.
  • Текстуры проекторов на каждой сборке умножают свою альфу примерно на 1–10%, из-за чего постепенно уходят в полную прозрачность. Лечения нет, только держать в голове; проверять их положение и масштаб зачастую надёжнее прямо в игре.
  • Анимированные декорации иногда работают, в том числе на серверах, а иногда не дают игрокам загрузить карту вообще (и роняют SDK). Похоже, где-то не хватает зависимости — в KF-Foundry они живут нормально.
  • Операции масштабирования карты или браша роняют SDK. Пользуйтесь vertex-редактором.
  • Привязка к сетке ломается, если постоянно использовать размеры BSP, не кратные степеням двойки, особенно свыше 1000, и ещё вернее — при переключении между grid 1 и 2, когда что-то остаётся выделенным. После этого браши садятся между линиями сетки или получают фантомную ширину в ортографических видах. Работаете с grid 1 ради мешей — заведите религиозную привычку снимать выделение перед возвратом на grid 2+.
  • Время задержки у KFDoorMover нормально не редактируется. DoorMoverPlus из Fall Trigger Pack это, судя по всему, не чинит.
  • Обычные муверы и маршруты их движения ломают пути специменов. KFDoorMover — нет, вероятнее всего потому, что коллизия путей включена в Properties → Collision по умолчанию; так что если вам нужны большие муверы, ставьте её в False.
  • На эффективное число порталов и навигационных точек есть жёсткий лимит.
  • Переключение SDK на другой язык (например, русский) ломает булевы значения в интерфейсе свойств, вроде True/False. Возможно, это касается только установок, где язык меняли после скачивания; в любом случае удачи.
    • Решение из тем «Не работает true/false в SDK» и «Вопросы по картостроению» на форуме killingfloor.ru: если в свойствах вместо True/False стоят «Истина»/«Ложь» и значения не переключаются, откройте KillingFloor.ini в папке System и в разделе [Engine.Engine] замените Language=rus на Language=int. У одного из пользователей правка помогла только один раз: после входа в игру «Истина»/«Ложь» вернулись, так что строку, возможно, придётся проверять снова.
  • Ошибка Can't find edit package 'ServerPerksV5' (или другого пакета) при запуске редактора. По словам K-2, обычно эта ошибка возникает при открытии карты, которая использует объекты из пакета .u (например, предмет со своим скриптом из Actor Classes), которого нет в папке System или который был изменён. Если же она появляется при запуске редактора, самый простой выход — найти в KillingFloor.ini строку EditPackages= с этим пакетом (здесь EditPackages=ServerPerksV5) и удалить её (совет Freddy из темы «KF SDK» на форуме killingfloor.ru; автору вопроса помогло).
  • Если кнопки редактора ландшафта «слиплись», в теме «Помогите с редактированием поверхности(террейна)» на форуме killingfloor.ru помогла смена разрешения экрана; krestps связывал такие сбои с русским языком в настройках и со сменой размеров дисплея, из-за которой окна редактора оказывались за пределами экрана.
  • В Workshop, по слухам, лимит загрузки 100 МБ. Ваша карта до этого доходить не должна, да и большинство раздаёт прямые ссылки.
  • SDK умеет выесть виртуальную память. Успевайте нажать сохранение до закрытия всплывающего окна — после него программа падает сама. Переключение видимости хоткеями и сниженные настройки графики уменьшают частоту таких случаев.

Публикация в Workshop

Tools → Upload files to Steam Workshop.

Окно загрузки в Steam Workshop из KF SDK

Поскольку структура папок Killing Floor у всех одинаковая, Workshop загружает то, что лежит внутри вашей папки игры, и устанавливает это другим игрокам ровно туда же. То есть если вы забыли .rom в папке Textures, у них он окажется там же.

Совет: у поля описания в окне загрузки жёсткий лимит символов. Но после публикации описание правится прямо на странице Workshop и форматируется как угодно.

Теги

Если вы проставляете все теги подряд на чём-то простом — проблема в вас. Теги существуют, чтобы по Workshop можно было ориентироваться; ложные никто не модерирует, поэтому по тегам никто и не ищет, а просмотров вам это всё равно не добавит.

Выбор тегов при загрузке в Workshop

Справка: вики Tripwire — Killing Floor Steam Workshop.

Есть и видео о полном релизе карты KF — что стоит продумать до и после публикации.

Шаблон описания

[h1][b]General Information[/b][/h1]
This remake fixes some nasty original map [b][i]features[/i][/b].
[spoiler]for more info spam comments section[/spoiler]
[list]
[*] Patriarch's spawn in tested, delayed intervals (usually as pairs).
[*] Built-in voteable Hard Mode.
[*] Amounts of dosh given feels more balanced.
[*] There's a second level, with planks, cover and all your wildest dreams.
[*] Additional armour and high tier weapon pickups (with consistent spawn % for all difficulties).
[*] Scripted pipe bombs near blocked off Patty spawns.
[*] Addressed zed pathing issues.
[*] And more fun additions such as a replacement for the siren wave.
[/list]

[h1][b]Whitelist Status[/b][/h1]
[list]
[*] Dedicated server: all clients will level up, get achievs.
[*] Listened server: all clients will level up, get achievs.
[*] Solo: (and you guessed it) Still whitelisted.
[/list]

[h1][b]Technical Information[/b][/h1]
1. This is simply a map, no embedded mutators or whatever. To edit/remove pipe bombs
   search for the tag "PipeSpawner" in the actor class browser and delete, or navigate
   to the scripted triggers -> AI Script.
2. 'SkipWave' event command will skip to next trader (but use at own risk on normal mode).
3. The optional Hard Mode features pat spawns without timed intervals.
4. Pat spawns are storymap style, so if the probability works out you could have all of
   the patriarchs spawn in the same room.

[h3][b]Game Mode[/b][/h3]
[code]
Objective
[/code]

[h3][b]Download Link[/b][/h3]
https://example.com/your-mirror

[h3][b]Credits[/b][/h3]
Pathing, debugging - [url=steamcommunity.com/id/NikC-]NikC-[/url]

Как это выглядит в итоге — пример страницы в Workshop.

Словарь терминов

Активный браш — красный каркас браша, которым создаются новые BSP и волюмы. Официально — builder brush.

Браш — строительный блок, он же чертёж, всего BSP на карте.

BSP — binary space partitioning. Либо вырезает пространство для игрока, либо добавляет сплошную геометрию.

Иконка — мелкие кнопки сверху и снизу вьюпортов.

Ключевой кадр — позиция или поворот мувера, задающие шаг его маршрута: Key 0, Key 1 и так далее.

LOS — line of sight, линия обзора.

Навигационная точка — всё, что работает как узел пути для зедов и ботов.

Запрещённый путь (proscribed) — маршрут из точки A в точку B, отключённый явным образом.

SM — статичный меш.

ST — scripted trigger, скриптовый триггер. Иногда, что путает, ещё и сообщество Siren Torturers.

.t3d — текстовый формат для переноса геометрии и акторов между редакторами карт.

Инструмент (tool) — крупные иконки слева в SDK, меняющие поведение кликов мыши либо форму и функцию активного браша.

UE — Unreal Editor или Unreal Engine.

.upk — формат пакетов Unreal с игровыми ассетами. Актуален только при портировании в UE3.

Вьюпорт — окна, через которые вы смотрите на карту: top, front, side и 3D.

ZVol — актор ZombieVolume, точка спавна специменов.

Справочники

Официальная документация и движок

СсылкаТемаПримечания
Сайтмап UE2Документация UE2Хороший общий справочник по движкам UE2. Неточности есть, но в закладки стоит.
Консольные командыКонсоль KFКоманды для отладки и тестов в игре.
Вики TWI по моддингуМоддингСсылки в основном живые, годится и для маппинга, и для моддинга без кода.
Creating terrainНастройка террейнаОбязательное чтение для раздела про ландшафт.
Editing terrain mapsЛепка террейнаОбязательное чтение для раздела про ландшафт.
Editing terrain layersСлои террейнаСмешивание текстур.

Гайды и техники маппинга

СсылкаТемаПримечания
Быстрый старт по UT2004ОсновыБазовые вещи по BSP, которых здесь нет.
Mapping Crystal LakeРазборПроектирование карты на базе официальной.
Туториал по story-карте ContainmentObjective-режимКонкретно про настройку KFO.
Как оптимизировать картуОптимизацияПлюс дополнительные ссылки в теме.
XWeatherEffectПогодаСложные погодные эффекты — снег, дождь.
Ассеты и туториалы по левел-дизайнуАссетыСсылки на туториалы и бесплатные источники текстур, звуков, моделей, SFX.

Акторы и компоненты

СсылкаТемаПримечания
Гайд Lode по муверамМуверыПодробно, хотя раздел про лифт к этому редактору применим не полностью.
Туториал по муверам UE2МуверыВсе настройки в деталях.
Using waypointsПутиНавигационные точки и сборка путей.
Настройка камеры лоббиКамера лоббиСвоя камера для карты.
Semi-solidsОптимизацияАльтернатива аддитивному BSP.
Скользкие полыПоверхностиСвойства материалов.

Видео и сообщество

СсылкаТемаПримечания
Видео по KF SDK от Lethal VortexВидеоурокиПожалуй, единственный человек, снявший больше двух видео по SDK именно для KF1.
Видеоуроки по UE2ВидеоурокиОколо сотни роликов по UE2, ~95% применимы к этой версии редактора.
Таймлапс сборки карты KFТаймлапсСпидмаппер собирает карту от начала до конца.
Справочник по монстрамСправочникПерезалитый справочник для редакторов UT2004/KF.
BeyondUnreal wikiСправочникАльтернативный перезалив того же материала.
InsultingPros на GitHubИнструментыАрхив story-карт KF, redirect-инструмент и прочее.
Ресурсы Ross WildingТеория левел-дизайнаДля дальнейшего копания.

Благодарности

Оригинальный гайд написал Holy Username Batman!, он же его и поддерживает — KF SDK Tips & Mapper's guide в Steam и зеркало на mdBook, куда переехали разделы, не влезшие в лимит страницы Steam.