Вообщем попробую рассказать о подводных камнях.
Вообще изначально, не буду скрывать, идею скрипта я подглядел в unity answers. Скрипт был рабочий, но делал не совсем то, что нужно. В скрипте определялись сила столкновения и направление, затем с помощью "магии" изменялось положение вершин, причем при столкновении наш "меш" выгибался наружу. Магия заключалась в том - что коэффициент смещения точек рассчитывалось как 1-(расстояние от вершины до удара)/("сила удара") и это неплохо работало, после того, как подставил где-то минус вместо плюса, уже не помню где. Но замятия были слишком резкими, пришлось итоговое смещение домножать на Time.deltaTime. Так же добавил "силу сопротивления удару" и дополнительный коэффициент разрушения. Сила сопротивления удара нужна для оптимизации: твердые материалы не всегда разрушаются от легкого прикосновения, и чтобы не гонять скрипт после каждой легкой коллизии и рассчитывать мини-смещения. Все просто:
Используется csharp
if (collision.relativeVelocity.magnitude>resist_force)
. Коэффициент разрушения - что бы варьировать степень разрушения. И все бы было хорошо, если бы не коллайдер меша, который то тоже надо изменять. Сначала я использовал меш коллайдеры. С ними кстати связан подводный камень, о котором чуть дальше. На них можно получить самый красивый результат.
Первый же подводный камень меш коллайдеры не взаимодействуют друг с другом, если они не Convex. Проблема в том, что Convex коллайдер ограничен как я понял 255 треугольниками и Unity не всегда может создать его на сложных формах. Я нашел инструмент за 60$, который может создавать вроде продвинутые convex коллайдеры, но он только для Pro версии и не для реалтайма, собственно если бы я его использовал, то пришлось бы просчитывать повреждения и коллайдера тоже, но т.к. геометрия может в итоге не много не совпасть, возможно данный путь чреват багами. Так же дописал скрипт, чтобы при превышении определённой силы объект разрушался. И
ещё один подводный камень: разрушение делал просто: из исходного меша просто создавал новые объекты по одному треугольнику. И все бы было не чего, но процедура присваивания материала занимает
очень много времени, и юнити дико фризилась в момент разрушения, причем если убрать присвоение материала, то все было нормально, поэтому данную функциональность пришлось "заморозить". Так же пришлось столкнуться
с ещё одним подводным "камнем": некоторые меши не могут быть с меш коллайдером если они маленькие и плоские. Пока все хорошо, но как только к гейм объекту добавляем риджидбоди так не чего не работает.
А все потому, что поведение риджидбоди таково, что всю информацию с дочерних коллайдеров он забирает себе, ничего в них не оставляя. И пришлось вытягивать из объекта с риджидбоди инфу о том, какой из коллайдеров принял удар и соответственно именно связанную с ним меш повреждать, а не все объекты. Далее т.к. OnCollider и Ontigger функции
не хранят в отличии от OnCollision точки соприкосновения, а как ее найти что бы создать простейший коллайдер и поставить его туда я не придумал, с меш коллайдеров я перешёл на бокс коллайдеры.Проблемы бокс коллайдеров:
первая не такие реалистичные повреждения,
вторая их нормально не пересоздать - Destroy может не успеть отработать и коллайдеров наплодится. И вроде все хорошо, но теперь ставим скрипт
Combine Cildren, чтобы уменьшить дравколсы и наши повреждения выглядят очень не красиво, т.к теперь бокс коллайдеров пара штук и они перекрывают друг друга, допустим бьёмся мы мордой авто, повреждается основной остов, а например фары и поворотники остаются висеть на месте. Поэтому принял решения обойтись одним общим боксколлайдером на модель, информацию с которого применять ко всем объектам.
Вот такие дела.