February 21, 2025

Расчлен на Unity.

Техническая часть.

Код не покажу, потому что это НДА и просто душно. Алгоритм расскажу, потому что это можно и круто. Всё это происходило давно, и все полезные на тот момент ссылки да ресурсы сейчас утеряны и/или неактуальны. Да и хуй с ними.

Для заголовка.

Однажды мы делали пострелушки киборгов. Одной из угарных фич была расчленёнка и сочленёнка обратно. То есть какому-то терпиле (в т.ч. из своей команды) можно отстрелить нахуй голову, затем видимо войдя в кураж оторвать голову себе тоже, и водрузить на своего фрешдекапитейтед персонажа свежий трофей. БЛЯТЬ, ДА Я БЫЛ РОЖДЁН ДЛЯ ЭТОЙ ЗАДАЧИ. Беглый гугл показал, что расчлен на юнити делается легко. Там нужно-то всего лишь заготовки моделек без конечностей, и заготовки конечностей. И во время расчлена, просто нормальную модель заменять на безрукую например, а рядом спавнить оторванную руку. Но вот для обратного сочлена с такой системой требуются заготовки всех перестановок всех конечностей между всеми персонажами, что слегка неприемлемо. И никаких других способов расчленять гуманоидов я в интернетах не нашёл, как и никаких вообще способов сочленять. Я попробовал просто детачить кость от скелета, но юнити мне сказал «runtime error» или что-то в этом духе, оказывается так делать нельзя. После этого в маршрутке начался пришлось закопаться в доку на пару дней и разбираться, как это всё говно там работает. И вот как:

  1. Есть иерархия костей, типа скелет. Хотя не типа ни хера, это и есть скелет. Это конкретные геймОбжекты в сцене с позишеном и ротейшеном. У них там есть параметр, какой меш на них забинден, этот параметр кайф, он мне пригодился.
  2. Есть аватар. Это уже абстракция, а не конкретный объект. Можно его рассматривать как конфиг, в котором записаны имена и должности костей. Его роль — обоссанная прокладка между скелетом и аниматором. Аватар может быть произвольного или гуманоидного типа, в случае с гуманоидом у него должности костей расписаны заранее: левая рука, средняя нога и т.д. Это мне однажды вставило небольшую палочку в колёсико.
  3. Есть аниматор. Это компонент на руте скелета, он собирает разную инфу со всей игры: какие кнопочки сейчас нажаты, кто персонаж по жизни и т.п., инфу отправляет в контроллер, анимации отправляет в аватар.
  4. Есть контроллер анимаций, это обычный стейт машин, во всех движках одинаковый. Аниматор выдаёт ему разные параметры и спрашивает, что в такой ситуации делать -> контроллер ему отвечает, что в такой ситуации нужно делать приседания -> аниматор отправляет присед в аватара -> аватар сажает кости.

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

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

Гуманитарная часть.

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

Это жожо референс?