Гайд по картостроению в 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), туда попадают по приглашениям.
Браузеры: три иконки, которые решают всё
Когда вы вчерне выложили форму кубическим билдером и инструментами add/subtract слева, весь дальнейший рабочий процесс сводится к трём иконкам сверху:
![]()
Шахматная пешка открывает Actor Class Browser, картина — Texture Browser, арка — Static Mesh Browser.
Actor Class Browser
Здесь живёт всё невидимое, что тем не менее влияет на игрока:
- пикапы,
- эмиттеры — дым, костры, туман,
- проекторы — детальные тени, пятна крови, следы на стенах,
- триггеры — двери и прочее взаимодействие игроков и специменов,
- источники света,
- звуковые эффекты.
Схема использования всегда одна: выделяете нужный класс, правый клик по вьюпорту, insert actor ‘X’.
Texture Browser
Почти все «обои» поверхностей, которые используются в картах KF. Выбираете подходящую для пола, стены или потолка и применяете двойным кликом. Часть из них существует ещё и в виде материалов, натянутых на статичные меши. Про то, что движок вообще поддерживает — форматы, альфу и прочее — читайте UnrealTexturing.
Совет: для своих текстур поставьте что-нибудь вроде GIMP. Импорт и экспорт идут прямо через браузер текстур (.dds, размеры — степени двойки), и вы сможете фильтровать, комбинировать и обрезать сток куда свободнее, что особенно полезно для мешей. На форуме TWI есть приличная тема по текстурированию.
Второй совет: если работать вы всё равно будете в основном с текстурами, сначала выучите встроенные классы материалов — они работают, весят меньше и оптимизируются лучше. Самая простая точка входа — Material Modifier, и на UDN он расписан нормально.

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, требует дополнительных инструментов.
Другие варианты:
- Куча экспортёров и туториалов для Blender в архиве: страница Blender на BeyondUnreal.
- Milkshape — слабее Blender, зато встроенный экспорт в
.aseпросто работает. - Старые сборки 3DS Max, если вам так привычнее: инструкция по установке и Softimage Mod Tool.
Когда файл .ase, .psk или .lwo готов, открываете браузер мешей и идёте в File → Import → ваш меш. Импортируйте в myLevel, если хотите, чтобы игроки скачивали меш вместе с картой; отдельный именованный пакет заводите только для действительно больших проектов, потому что каждый лишний пакет админам придётся раздавать.
Предупреждение: если у меша несколько материалов или UV-наборов, проверьте экспортёр заранее. Большинство из них на этом ломается, если у вас не волшебные руки.
Совет: Umodel отлично выгружает ассеты KF пачками, там же лежат плагины Un+ActorX для импорта-экспорта в 3DS Max. Есть и видео, которое спокойно смотрится на тройной скорости.
Где брать текстуры
Если умеете конвертировать в .dds и соблюдаете размеры-степени двойки, посмотрите сюда:
- Poly Haven
- Textures.com
- AmbientCG
- Texture Ninja
- OpenGameArt
- Ассеты на itch.io
- Poliigon — скорее всего, перебор
- Sketchup Texture Club
Как вписать свои текстуры в стиль игры
Если тащите своё, следуйте советам из маппинг-гайда Tripwire по финальной обработке:

Коротко: текстуры 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 юнитов.
Другой человек намерил чуть другие и, вероятно, более точные цифры, включая официальные размеры, которые стоит переписать себе:

Используйте это как линейку, а не как минимум. 216 юнитов — две высоты игрока, приличная высота потолка. Про минимальную ширину лучше не спрашивать: пути разваливаются задолго до геометрии, так что берите от 200.
Держите в голове: лайтмаппинг UE привязан к размеру 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:

Допустим, браш слишком большой или слишком правильной формы, чтобы состыковаться с соседней комнатой или мешем. Тогда:
- выделяете браш;
- Ctrl + Alt — рамка выделения вершин (в 3D-вьюпорте не работает), Ctrl + клик — одна вершина;
- Ctrl + Alt + Shift — добавление к выделению;
- правите в 2D-вьюпорте, спрятав акторы ради видимости.
Никогда не выключайте vector snap и не увлекайтесь острыми углами, если только вам сознательно не нужны дыры в BSP и провалы в межпространство.
Известный баг с треугольным BSP:

Похоже на кривую коллизию примитива. Одно из решений — нарезать BSP горизонтально на части; в этом конкретном случае помогла переделка путей так, чтобы зеды прыгали наружу от каждой колонны, а не между ними.
Свет
Правый клик по карте ставит источник света. Расстановка — вопрос вкуса, но три настройки делают основную работу.
Малый радиус и высокая яркость читаются как яркий шар в темноте. Умеренная яркость с большим радиусом заливает комнату общим светом. Остальное — художественное решение. Хотите увидеть, на что движок способен, если постараться, — посмотрите 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
Для тумана сначала отключите сломанный оверрайд Tripwire. Настройка в Zone Info не делает ничего, поэтому используйте KFSPLevelInfo:

Побочный эффект: заодно перестают спавниться зеды в быстром запуске из редактора (соло и живые игры не затронуты). Если это мешает, верните спавн в Edit → Level Properties:

Дальше ставите актор Zone Info, огораживаете комнату брашами zone portal и выставляете:
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, поэтому крупные комнаты стоит сразу резать на примерно равные браши.
Наброски и грубые 2D-планы помогают огромно. Вот ранний план 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-Stronghold через SDK. А недостаток волюмов выглядит так:


Триггеры
В браузере акторов лежит целый набор триггеров, и надёжно в KF работают не все. Реально используют два:
- KFProxyTrigger — actor class browser → Trigger → Trigger
- KFUseTrigger — actor class browser → Trigger → Use Trigger
Схема:
- Ставите разумно. KFUseTrigger — по центру двери, прокси-триггер — на важном объекте или рядом с ним.
- Properties → Events: даёте event короткое и уникальное имя, например
Door1A. - Целевому актору или муверу прописываете Tag с тем же именем.
- Готово. Так же запускаются звуки, скриптовые триггеры, задачи и муверы.
Правый клик по рамке 3D-вьюпорта → Actor → Radii view покажет радиус срабатывания красной сферой — полезнее всего для KFProxyTrigger. Размер меняется в Properties → Collision → collision radius / collision height.
Множество других акторов порождают события просто в процессе работы, особенно муверы. Перечислять их все — удвоить объём гайда; работают они одинаково. Весь фокус в связывании тегов и событий, например сигнализация, срабатывающая от открытия двери.
Ещё два: shoot trigger работает (он есть в KFO-RE-Mansion и KFO-WestLondon), но капризен. И существует KFMusicTrigger — ни одна ванильная карта его не использует, так что скопируйте из пользовательской, чтобы увидеть, как он собран.
Муверы
Двери, лифты, всё движущееся — это муверы, и движение у них строго линейное. Что-то сложнее делается анимацией.
В теории просто: задаёте муверу пронумерованные ключевые позиции и указываете, что его запускает. Начинается всё с назначения меша мувером.
Собираем мувер

Выделяете нужный меш в браузере мешей и жмёте иконку прямоугольника с четырьмя стрелками. Правый клик по ней предлагает продвинутые типы муверов.
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, готово. На практике — нет.
По верхней рамке 3D-вьюпорта: правый клик → View → Paths, затем Build All или Build Paths. Получаете цветную схему маршрутов, по которым ходят зеды:

Цвет говорит о качестве маршрута:
| Цвет | Значение |
|---|---|
| Оранжевый | летающий путь, узкий |
| Светло-оранжевый | летающий путь, широкий |
| Светло-фиолетовый | требует высокого прыжка, выше обычного |
| Синий | узкий путь |
| Зелёный | нормальная ширина |
| Белый | широкий путь |
| Розовый | очень широкий путь |
| Жёлтый | принудительный путь |
| Красный | односторонний путь: A→B разрешён, B→A запрещён |
Таблица взята из документации UE3, потому что документации по UE2 почти нет, но она многократно сверена с сайтмапом UE2 и с самим редактором.
Если путь синий, перекраивайте геометрию или навигационные точки, пока он не станет зелёным. Держите расстановку узлов аккуратной, полосы широкими, ставьте узлы только там, где они нужны, и оставляйте место для толпы.
Если зеды сыплются с лестниц и платформ, подозревайте неудачно поставленные узлы, маршрут, который стоило запретить (proscribe), или слишком узкий участок. Ну или добавьте перила.
А иногда плохие пути — это фича. В KFO-BossArenaNerf зеды периодически падают с платформ, несмотря на чистый маршрут, — и смотреть, как Патриарх несётся на вас и сваливается с доски в паре сантиметров от лица, по-настоящему весело.
Точки спавна (зомби-волюмы)
Порядок тот же, что с BSP: сначала размер и положение активного билдер-браша, потом клик по инструменту волюма:

Если вы не делаете KFO-карту, Tag не трогайте, идите в Properties → ZombieVolume:

Что стоит настраивать
По умолчанию всё работает, но пять параметров знать полезно.
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не работает. - Дальше можно посмотреть в сторону принудительного пути.
- А когда отладка надоест — просто постройте новый волюм, это очень часто помогает.
Ландшафт
Как заставить его работать
Начинайте с официальной страницы про создание террейна.
Кратко: нужна «комната», отделённая 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 и падает раза в три чаще.
Чек-лист по багам ландшафта
TerrainZone в акторе ZoneInfo должен быть True:

А у TerrainInfo → Properties → TerrainInfo → Layers → Layer 0 обязаны быть текстура, AlphaTexture-хайтмап для этого слоя (SDK ведёт его автоматически) и положительные 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 — это «камера» скайбокса. Соберите, поставьте её внутрь комнаты скайбокса, и больше её свойства обычно не трогают. Учтите, что камера сильно приближена.
Туман. Включается через ZoneInfo → DistanceFog = True, затем настраивается:
DistanceFogStart
DistanceFogEnd
DistanceFogColor
Чем меньше разрыв между началом и концом, тем плотнее туман. Отрицательное начальное значение допустимо, если хочется поэкспериментировать. Цвет задаётся байтами 0–255 для оттенка, насыщенности и яркости.
KillZ — не надо. Если под ландшафтом образовалась гигантская пустота, ZoneInfo → KillZ формально убьёт всё, что упало ниже заданной координаты, но доверять этому не стоит. Используйте vertex-редактирование, KillVolume или и то и другое. KillZ — крайняя мера для отчаявшихся, наблюдающих, как зеды проваливаются в бездну и устраивают там рейв за счёт вашего фреймрейта.
Известная бяка: полупрозрачные меши способны перекрывать эмиттеры и другие полупрозрачные материалы в скайбоксе, если смотреть сквозь BSP, — особенно туман и облака. Лечения не найдено, так что проверяйте результат пораньше и почаще.
Objective-режим
Если вы дочитали до этого раздела, вас ждёт много боли. Вот как её уменьшить.
Сами задачи

Задачи обязаны быть названы, и первая всегда называется start. В View → Level Properties (или F4) объявляется ожидаемый порядок задач по именам. На этом простая часть заканчивается.
Главный актор — KFLevelRules_Story, лежит в Actor Browser → Info → LevelGameRules → KFSPLevelInfo. Он задаёт общие правила: стартовое снаряжение игрока, максимальное число зедов (по умолчанию 32), стартовые деньги и награду, а также магазин.
Objective-режим — это набор триггеров и событий, которые вы связываете сами, как в story-режиме, только чуть автоматизированнее, с полурабочим, но красивым HUD и своеобразной системой агро. Сначала придумайте, что должно происходить, потом разбирайтесь с проводкой: какой актор порождает событие, когда оно срабатывает, что делает.
Имеет смысл сделать маленький KFO-проект для тренировки, а потом переходить к story-карте с префиксом KF-: там доступно всё то же самое, кроме wave- и squad-дизайнеров, так что спавн зедов придётся делать вручную, если только не писать мутатор.
Проектирование задач

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:

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

Разное
Не разобрано выше: задачи можно триггерить, пока они не активны; условия задач могут зависеть от других условий внутри 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:
Оптимизация
Оптимизация здесь означает две вещи: меньше полигонов и эффектов на экране одновременно и меньше нагрузки на железо ради 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 — расстояние, дальше которого он перестаёт рисоваться. Меньше значение — быстрее игра. Игроки на слабых машинах могут переопределить это настройками; всё равно оптимизируйте под большинство.
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.

- Если окно свойств поверхности открывается со сдвинутым влево текстом и кнопками, лечится это так: открыть
User.ini, удалить целиком блок[WindowPositions], сохранить и перезапустить SDK:

- 4-гигабайтный SDK (KFEd): скачать, снимает лимит памяти.
Навигация и рабочий процесс
- Ctrl + Alt + M1 — рамка выделения, только в видах сверху, спереди и сбоку.
- Многое двигается и нажимается только с зажатым Ctrl. Если что-то отказывается реагировать, попробуйте.
- Информация о текстуре: правый клик по стене или поверхности → Properties. Вверху окна — имя текстуры и путь к пакету.
- Информация об акторе: Properties → Display → Mesh показывает имя и каталог выбранного статичного меша.
- Скины: Display → Mesh → Skins → Use накладывает новую текстуру поверх меша — например граффити поверх меша с грязью или разбитым стеклом. Для граффити и перекрашенных мешей не забудьте про этот булев параметр:

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


Также можно выделить все акторы одного типа, все add или subtract, все браши или всё содержимое группы через group browser.
- Показать скрытые акторы. Авторы официальных карт иногда прячут своё добро в редакторе. Этот инструмент всё равно его покажет:

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

Точечные фиксы
- Для по-настоящему упрямых дыр в BSP: правый клик по проблемному брашу → Type → перевести в semi-solid или non-solid (плюс блокирующий волюм). Затем попробуйте Build Options → Lower BSP Cuts.
- Проверяйте детали регулярно. Большинство проблем с первого взгляда не видно.
- Скользкий пол: совет с форума.
- Осторожнее с масштабированием статичных мешей — каждый масштабный вариант сохраняется в
myLevelотдельным мешем. Свои меши тоже держите там:myLevelскачивается вместе с картой. - KFUseTrigger работает только с дверями — подтверждение. Используйте Trigger, ProxyTrigger или Mover → MoverEvent.
- Катапульты и отбрасывание: гайд на форуме.
- Своя камера лобби для карты: туториал на форуме TWI.
- На число акторов вроде источников света и навигационных точек есть жёсткий лимит, значения большие и невнятные. Сверяйтесь с чем-то вроде KF-Hive, чтобы понимать запас. Дальше остаётся резать карту на несколько и связывать их командой смены карты в скриптовых триггерах.
Просчёт Tripwire с цветокоррекцией
Это раскопал Broski из Siren Torturers:
В стандартном
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). - Конфиг, отвечающий за сохранение настроек сборки, сломан, а правка
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. Возможно, это касается только установок, где язык меняли после скачивания; в любом случае удачи.
- В Workshop, по слухам, лимит загрузки 100 МБ. Ваша карта до этого доходить не должна, да и большинство раздаёт прямые ссылки.
- SDK умеет выесть виртуальную память. Успевайте нажать сохранение до закрытия всплывающего окна — после него программа падает сама. Переключение видимости хоткеями и сниженные настройки графики уменьшают частоту таких случаев.
Публикация в Workshop
Tools → Upload files to Steam Workshop.

Поскольку структура папок Killing Floor у всех одинаковая, Workshop загружает то, что лежит внутри вашей папки игры, и устанавливает это другим игрокам ровно туда же. То есть если вы забыли .rom в папке Textures, у них он окажется там же.
Совет: у поля описания в окне загрузки жёсткий лимит символов. Но после публикации описание правится прямо на странице Workshop и форматируется как угодно.
Теги
Если вы проставляете все теги подряд на чём-то простом — проблема в вас. Теги существуют, чтобы по Workshop можно было ориентироваться; ложные никто не модерирует, поэтому по тегам никто и не ищет, а просмотров вам это всё равно не добавит.

Справка: вики Tripwire — Killing Floor Steam Workshop.
Есть и видео о полном релизе карты KF — что стоит продумать до и после публикации.
Шаблон описания
Оформление — главная реклама вашей карты. Возьмите этот шаблон или вариант ниже (автор: NikC-):
[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-карте Containment | Objective-режим | Конкретно про настройку 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 | Теория левел-дизайна | Для дальнейшего копания. |
История правок оригинала
Сохранена для ориентира: по ней видно, какие разделы автор переписывал и когда.
- 02/21 — добавлен раздел про ландшафт.
- 07/23 — совет 16, супер-совет 2, небольшое дополнение в Objective-режим.
- 01/24 — заметка про KFMusicTrigger в раздел триггеров; совет про 4-гигабайтный SDK продублирован во вступление, потому что его слишком часто пропускали.
- 03/24 — часть про дыры в BSP сильно устарела и была во многом переписана. Создан раздел про точки спавна. В vertex-редактирование добавлено визуальное напоминание. Расширены супер-советы благодаря Broski. Новые примечания в разделах BSP и света. Перезалиты картинки, ранее жившие только на Imgur (заметнее всего в Objective-режиме и разделе про браузеры). В публикацию в Workshop добавлен шаблон описания. Добавлены советы 5, 6 и 18, совет по браузеру текстур, почищен раздел ошибок. Отредактирован левел-дизайн. В известные ошибки добавлена ссылка про сломанные меню сборки и террейна.
- 04/24 — обновлён Objective-режим. Добавлена «бяка» про SkyZoneInfo. Раздел про дыры в BSP переписан снова. В скриптовые триггеры добавлен актор TriggeredCondition после того, как он заработал на живом проекте.
- 05/24 — крупное дополнение в портирование карт в UE3, включая видео. Советы и супер-советы объединены, чтобы уменьшить плавающее оглавление Steam.
- 10/24 — обновлены первые два абзаца левел-дизайна; к разделу про BSP прикреплено обсуждение масштаба юнитов Unreal.
- 12/24 — обновлён раздел про ассеты после очередных экспериментов с 3DS Max.
- 01/25 — в справочники добавлены тема про SDK и туториал по погодным эффектам.
- 07/25 — в оптимизацию добавлен трюк с удвоением фреймрейта (спасибо jk); в левел-дизайн — обходной путь для стабильного спавна патронов (спасибо braindawg).
- 09/25 — во вступление добавлен гайд jk, где разбирается правка
KFEd.exeпод больший объём памяти.
Благодарности
Оригинальный гайд написал Holy Username Batman!, он же его и поддерживает — KF SDK Tips & Mapper’s guide в Steam и зеркало на mdBook, куда переехали разделы, не влезшие в лимит страницы Steam.