Боже, это сделано. Три дня возился и вот оно вроде готово.
В общем я последнее время работал над выстрелами и всем, что с ними связано. Один из способов моделирования выстрела из оружия, это создание некоего невидимого луча - raycast. Получается так, что в руках у персонажа модель оружия и мы скриптом задаем начало невидимого луча (конец ствола оружия) и конец луча (заданная дальность стрельбы конкретного оружия). Дальше на это налепляются всякие эффекты, но действующей физической силой является именно raycast. Вот как это примерно происходит:
1. мы жмем на кнопку, которая у нас отвечает за выстрел из оружия
2. появляется луч (он невидимый)
3. одновременно срабатывает вспышка из ствола и мы слышим звук выстрела.
4. если луч не встречается с какой либо поверхностью на всем своем протяжении... то и бог с ним, ничего интересного не происходит. Ну а если попадается поверхность... о-о-о.. короче тут простор для любителей спецэффектов.
В движке мы можем управлять параметрами эффекта и делать его таким, каким нам нравится, настроек очень много и это исходными силами Unity-движка, а можно еще докачать всякого. Еще мы можем задавать, какие эффекты когда срабатывают и на каких поверхностях.
Скажем, пуля попадает по толстой металлической поверхности: при попадании у нас иногда вылетает сноп искр (иногда нет, рандом мы тоже задаем), звучит один из нескольких выбранных звуков (скажем, звон металла, или звук рикошета), ну и у нас остается след на поверхности (вмятина там или скол краски, как хотим).
Звук в данном случае привязан к появлению эффекта искр (но это не обязательно, можно привязать к появлению , например, следа от пули).
И так с любой поверхностью, которую мы захотим наделить способностью реагировать на выстрелы, путем не особо хитрых манипуляций: сначала создаем кучку эффектов для нужной поверхности, а потом даем поверхности свойства материала.
А, кстати, стрельба из огнестрельного оружия сопровождается выбросом гильз. Гильзы в игре - это отдельные объекты, которые так же появляются пи нажатии на кнопку стрельбы и напрямую связаны с количеством выстрелов (ясное дело). Автоматический огонь генерит много гильз, ну а стрельба из какого-нибудь роторного стационарного пулемета.. ну вы поняли. Потому, для оптимизации игры (чтобы не тормозила), пулевые отверстия и гильзы лучше сделать исчезающими со временем. На постоянку они часто и не нужны, игрок бежит себе дальше, обстрелянную часть локации не видит, значит можно оттянуть ресурсы оперативной памяти и направить их в более актуальное русло.
Отдельно можно выделить стрельбу снарядами. Например, когда мы стреляем из гранатомета, ракетницы или из лука. Во всех этих случаях, при нажатии кнопки выстрела мы инициируем появление объекта с заданными характеристиками. Как он будет реагировать на те или иные поверхности при столкновении (и отдельно - как они будут реагировать), сколько по времени летит снаряд, насколько далеко, когда он таки исчезнет, как на объект влияет физика и окружающее пространство - все это задается снаряду вручную нами.
Звук тоже, появляется снаряд - срабатывает звук выстрела.
В игре, которую я сейчас делаю используются оба эти способа. Враги у меня пока стреляют объектами, полет их снарядов виден, у моего персонажа же есть гранатомет (запускает объект) и возможность брать управление стационарными турелями (которые могут стрелять по врагам обеими способами).
Ну и вот еще интересное. Скажем, у нас есть модель автомобиля, сделанная в программе Blender. Модель состоит из кучи других отдельных моделей (кузов, стекла, диски, шин) Нам можно (и нужно) расстрелять эту вещь.
Чтобы это было не скучно делать, мы наделяем модели, составляющие наше авто свойствами соответствующих материалов.
Теперь все звучит сочно и по-разному - бьются стекла, тело кузова принимает попадания калибра 5.56, диски дают рикошет, шины покорно всасывают кусочки свинца.
А теперь добавляем то, о чем я говорил в одном из предыдущих постов - заменяемость объектов на разрушаемые по триггеру.
И мы получаем разбивающиеся стекла, перекашивающийся кузов, слетающие покрышки, треснувшие диски...
Вдумайтесь, как приятно будет теперь уничтожать авто!