Когда я спрашивал, гнется ли у вас геометрия, я подразумевал, конечно, скиннинг, вследствии которого меняется положение вертексов в меше друг относительно друга. Повороты и вращение колеса, к примеру, если это колесо сделано отдельным мешом, конечно не относятся к моему вопросу. Обычные повороты и смещения покрываются моим предложением выше. Соответственно из всего названного только сжимающиеся пружины, возможно, относятся к "гнущейся" геометрии, про которую я спрашивал. И то не факт. Возможно, они у вас обычным скейлом кости сжимаются/разжимаются.
По поводу ассета - я не использовал, но по описанию он крутой. Насколько он эффективно выполняет свою работу, я, конечно, не знаю. Это надо купить и посмотреть код, если он доступен.
Ну, если у вас геометрия не гнётся, могу посоветовать переизобрести скиннинг на шейдерах. Так мы тоже делали для взрывающихся домиков в вертолетных миссиях LeftToSurvive (можно в ютубе посмотреть), ну и для того самого автомобильного прототипа :D
Логика простая. Все меши опять же объединяются в один, каждому кусочку при этом в атрибуты вертекса пишется индекс кости, которому этот кусочек соответствует (мы писали в uv.z). Далее проходимся по иерархии и пишем все localToWorld матрицы значимой иерархии автомобиля (ну т.е. те трансформы, которые как-то влияют на отображение) в массив, который передаем в шейдер как float4x4[]. Для нормалей, возможно, потребуется и worldToLocal, но это не точно.
А в шейдере вместо UnityObjectToClipPos() тогда нужно использовать mul(UNITY_MATRIX_VP, mul(skin[v.texcoord.z], v.vertex)).
Это всё, естественно, надо делать per-material. Но я сомневаюсь, что у вас 46 материалов ) Скорее всего 2-4, да?
Почему нет? Мы делали прототип с автомобилями, у которых были отпадающие элементы, да и собирались они тоже из кусочков - это всё тоже рисовалось одним мешом. С автомобилями в этом смысле даже проще, потому что там исходная геометрия не скинованная, не приходится париться весами костей, бинд-позами и прочим.
Нашим автомобилям, правда, атласы были не нужны от слова совсем )
Правильнее говорить не про GameObject'ы, а про Renderer'ы. Несколько SkinnedMeshRenderer'ов (висящих на разных GameObject'ах) превращаются в один SkinnedMeshRenderer, у которого в качестве меша используется подготовленный в рантайме меш. Этот меш представляет собой комбинацию всех исходных мешей, которые использовались в изначальных рендерерах. Для такого объединения мешей можно найти общее решение на просторах ассет стора, а может быть и остального интернета.
На выходе мы получаем один SkinnedMeshRenderer с одним комбинированным мешом, одним материалом и одним набором текстур (диффузка + нормалка). Иерархия GameObject'ов при этом остается, потому что они - суть кости скелета, к которому привязан скин. Но за счет того, что рендерер один, материал один, набор текстур один, то и рисуется всё в один drawcall.
Дежа вю )
Для разных платформ у нас используются разные форматы исходных текстур. Для iOS - PVRTC, для Android - ETC/ASTC. Логика у построителя атласов одинаковая, за тем лишь исключением, что для PVRTC надо к сжатым блокам иначе адресоваться, т.е. они в особенном порядке складываются в памяти.
Про меши и тут отвечу. Да, сшивали просто копированием содержимого нескольких мешей в один с правкой индексов и UV.
Ну, если честно, то объему в 10Мб для 4к текстуры мы должны быть благодарны разработчикам из Imagination Technologies, авторам алгоритма PVRTC сжатия. Статья про то, как получить такую 4к текстуру в рантайме из нескольких меньшего размера.
Ну так надо хотя бы видео-инструкции посмотреть)) Там прям в первой инструкции на сайте ассет стора "Mesh Baker Basics" сказано, что, чтобы заработала анимация и физика, нужно выбрать Skinned Mesh Renderer в настройках.