Мутаторы и UnrealScript

Модели Killing Floor в 3ds Max: экспорт umodel, импорт ActorX, своя модель игрока и оружия

Серия статей Freddy (metalmedved.com), выложенная на форуме killingfloor.ru в 2011 году: как перегнать модели Killing Floor 1 в 3ds Max и обратно, сделать нового персонажа и новую модель оружия. Понадобятся 3ds Max, KF SDK (Unreal Editor), umodel и ActorX Importer с сайта gildor.org, а также плагин ActorX Exporter для 3ds Max.

Экспорт модели из игры в 3ds Max

  1. Меши и анимации. Модели игроков лежат в Animations\KF_Soldier_Trip.ukx. Положите файл рядом с umodel.exe и выполните:
umodel -export -all KF_Soldier_Trip.ukx

Меши (.psk) и анимации (.psa) появятся в подпапке KF_Soldier_Trip\SkeletalMesh.

  1. Текстуры экспортируются так же из Textures\*.utx, например KF_Soldier4_Trip_T.utx. Результат — в подпапке Texture.
  2. В 3ds Max запустите скрипт ActorXImporter.ms и нажмите Import PSK, выберите нужный меш.
  3. Наложите текстуру: в Material Editor, раздел Maps, нажмите None напротив Diffuse Color, в Map Browser выберите материал сцены, затем в Bitmap Parameters загрузите нужный .tga.

Импорт своей модели обратно в игру

  1. В плагине ActorX Exporter заполните поля, поставьте флажок all textured и нажмите save mesh: получится .psk.
  2. В Unreal Editor откройте Animation Browser и импортируйте .psk.
  3. Импортируйте стандартный набор анимаций (.psa, получен при экспорте).
  4. Сохраните пакет как .ukx, снова откройте его и заполните свойства меша. Проще всего открыть стандартный KF_Soldier_Trip, скопировать свойства стандартного меша и вставить их в свой: это задаёт правильную ориентацию в игре.
  5. Animation/DefaultAnimation заполните вручную в формате MeshAnimation'ИмяПакета.ИмяНабораАнимаций' или через Edit → Linkup anim and mesh. Сохраните.

Для корректной работы новому мешу нужны своя текстура и стандартный скелет.

Новая модель игрока

Пример — Данте из DMC.

  1. Подготовка. Наложите текстуры и уменьшите полигонаж: оптимум для модели игрока KF — около 7000 полигонов. Лишнее убирается модификатором ProOptimizer.
  2. Экспортируйте в сцену стандартную модель игрока (см. выше).
  3. Отмасштабируйте новую модель под стандартную и максимально совместите позы.
  4. Удалите меш стандартной модели, оставив её скелет, и удалите скелет новой. Только инструментом Rotate разверните кости стандартного скелета так, чтобы они проходили внутри соответствующих частей нового тела. Части тела модели масштабировать можно, кости — нельзя. Сохраните сцену.
  5. Примените к модели модификатор Skin.
  6. Проверьте привязку: в ActorXImporter на вкладке Tools нажмите Restore Bindpose. Если пальцы слиплись или конечности перекрутились, вернитесь к шагу 4 или поправьте влияние костей в Envelope.
  7. Снова экспортируйте простую стандартную модель, склейте её с новой и удалите из склейки части стандартной.
  8. Экспортируйте новую модель со скелетом через ActorX Exporter и импортируйте в игру, как описано выше. Останется запечь текстуру.

Одна текстура для новой модели (Unwrap UVW)

По статье Freddy «Импорт текстур для моделей в Unreal Engine» на форуме killingfloor.ru (пример — Зои из Left 4 Dead). Подготовьте модель по шагам выше; до модификатора Skin её лучше конвертировать из Mesh в Poly (в любой момент можно воспользоваться и модификатором Edit Poly).

  1. Выделите модель и примените поверх Skin модификатор Unwrap UVW. Он автоматически разрежет поверхность на зоны, каждая из которых соответствует элементу текстуры (руки, куртка, штаны).
  2. Нажмите Edit: откроется окно развёртки, где свалены в кучу проекции всех кусков модели. Инструментами Move, Rotate и Scale разместите все части в синем квадрате так, чтобы они не пересекались. Пункт Tools/Pack UVs сделает это автоматически, но даст всем деталям равный масштаб, что плохо скажется на качестве текстур: сохраняйте примерные пропорции, крупные части должны занимать в развёртке больше места.
  3. Через Tools/Render UVW Template создайте шаблон текстуры. Откройте его в Photoshop, залейте внутренности деталей одним цветом, скопируйте соответствующие текстуры из исходных файлов, выровняйте их по контуру развёртки и сохраните результат.
  4. Выделите все полигоны модели и на вкладке Polygon Material IDs задайте единый ID. В пустом слоте Material Editor выберите на вкладке Maps Diffuse Color, присвойте ему Bitmap с новой текстурой, выделите модель и нажмите Assign Material to Selection.
  5. Сделайте рендер и проверьте, не съехали ли фрагменты текстуры; ошибки исправляйте, возвращаясь к шагу 3.
  6. Импортируйте модель в KF Editor, как описано выше. На вкладке меша Material должен остаться всего один слот, в него и вставляется новая текстура.

Новая модель оружия (на примере сварки)

  1. Экспортируйте анимации и текстуры оригинала от первого лица: KF_Weapons_Trip.Welder_Trip, KF_Weapons_Trip_T.equipment.Welder_D и текстуру рук KF_Weapons_Trip_T.hands.hands_1stP_military_diff.
  2. Добавьте в сцену новую модель без костей, все её текстуры собраны в одном файле.
  3. Инструментами Move / Rotate / Scale совместите её со старой так, чтобы она естественно лежала в руке. У оружия особенно важно совпадение центра прицела и привязка подвижных частей (магазин, затвор, гильза) к своим костям.
  4. Удалите старую модель, присвойте материалу новой ID старого, совместите точку спецэффекта (у сварки — сопло). Проиграйте анимацию и проверьте.
  5. Экспортируйте обратно в игру.
  6. Повторите для модели от третьего лица (KF_Weapons3rd_Trip.Welder_3rd). Если оружие можно выбросить, нужна ещё статическая модель для пикапа.
  7. Сделайте мутатор-замену из трёх классов:
class NewWelder extends Welder
    dependson(KFVoicePack);
#exec OBJ LOAD FILE=NewWelder_T.utx
#exec OBJ LOAD FILE=NewWelder_A.ukx
defaultproperties
{
    AttachmentClass=Class'NewWelder.NewWelderAttachment'
    ItemName="New Welder"
    Mesh=SkeletalMesh'NewWelder_A.NewWelderMesh'
    Skins(0)=Texture'NewWelder_T.NewWelder'
}
class NewWelderAttachment extends WelderAttachment;
defaultproperties
{
    Skins(0)=Texture'NewWelder_T.NewWelder'
    Mesh=SkeletalMesh'NewWelder_A.NewWelder3rd'
}
class NewWelderMut extends Mutator;

function PreBeginPlay()
{
    AddToPackageMap("NewWelder_A");
    AddToPackageMap("NewWelder_T");
}

function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
{
    if (Other.IsA('KFHumanPawn'))
        KFHumanPawn(Other).RequiredEquipment[4] = "NewWelder.NewWelder";
    return true;
}

defaultproperties
{
    GroupName="KF_NewWelder"
}

Скомпилируйте и подключите как NewWelder.NewWelderMut.

Свои анимации через ActorX Exporter

Дополнение 3xzet: чтобы Unreal понял анимированную модель, анимации экспортируются так:

  1. Animation file name — имя пака анимаций, например shotgun_anim.
  2. Animation sequence name — имя анимации, например reload.
  3. Animation range — диапазон кадров через дефис, например 0-29 (30 кадров).
  4. Digest animation, затем Animation manager: перенесите анимацию в пак кнопкой --> и нажмите save.
  5. Повторите для каждой анимации (Idle и т.д.).
  6. В редакторе импортируйте меш, сохраните пакет (например superpuperweap_A.ukx), импортируйте анимации и в свойстве меша Default animation укажите MeshAnimation'superpuperweap_A.shotgun_anim'.

Вспышка, звуки анимаций, прицеливание и перекраска

Дополнения из тем форума killingfloor.ru «Jackhammer», «Помогите со звуками и позициями вспышки» и «Вопрос по текстурам.»:

  • Кость вспышки. Вспышка выстрела рисуется на кости, указанной в коде оружия; обычно это Tip. Кость можно разместить где угодно, главное привязать её к стволу; обычно её выравнивают по ROOTBONE и ставят на конец дула. Если вспышка появляется посреди ствола, а модель использует стандартные анимации (например, от AK47), то позицию кости, скорее всего, меняет сама анимация: импортируйте стандартные анимации и поправьте в них позицию кости или переопределите в классах-предках метод, вызывающий вспышку, со смещением эмиттера.
  • Положение при прицеливании задаётся в 3D-редакторе относительно начала координат.
  • Не только 3ds Max. Для модели оружия подходит и Milkshape 3D: в нём есть экспорт в psk.
  • Звук на кадре анимации. В браузере анимаций выберите анимацию (например, Fire), справа вкладка Notify → [+]Notify → Add → в настройке Create выберите AnimNotify_Sound → Create, затем укажите звуки. NotifyFrame — номер кадра анимации: при значении 6 звук прозвучит на шестом кадре. Для звука перезарядки оружия в теме «Добавления звука к перезарядке» (3xzet, форум killingfloor.ru) делали так: поставить ползунок анимации на нужный момент, во вкладке Notify нажать Добавить (момент запишется в NotifyFrame), выбрать из списка KFWeaponSoundNotify и нажать Создать; затем на вкладке Sounds выбрать нужный звук, вернуться на Notify и в строке Sound нажать Использовать (появится путь к звуку). После этого сохранить пакет анимаций .ukx.
  • Материалы без Ref. На кастомном оружии Ref-ссылки, по словам 3xzet, работают ненадёжно, поэтому меш и скины лучше прописать напрямую:
Mesh=SkeletalMesh'Имя_Меши'
Skins(0)=Combiner'Имя_комбинированной_текстуры'
Skins(1)=Shader'Имя_шейдера'
Skins(2)=Texture'Имя_текстуры'
  • Перекраска чужого оружия (пример Flame: катана из WTF в золотой катане) требует правки трёх классов: оружия (Skins(0)=Combiner'KF_Weapons_Gold_T.Weapons.Gold_Katana_cmb', BloodyMaterial, иконки HUD и магазина, AttachmentClass=Class'WTF.WTFKatanaAttachment'), аттачмента (вид от третьего лица) и пикапа:
class WTFKatanaAttachment extends KatanaAttachment;
defaultproperties
{
 Skins(0)=Combiner'KF_Weapons3rd_Gold_T.Weapons.Gold_3rdP_Katana_cmb'
}
defaultproperties
{
 Skins(0)=Texture'KF_Weapons3rd_Gold_T.Weapons.Gold_Katana_3rd'
}

В аттачменте разумно использовать комбайнер, а в пикапе — простую текстуру.