Довелось на досуге поиграть во второй сталкер. Зацепил оттуда несколько фишек, которые захотел воссоздать на платформе Зова Припяти. Об одной их них и пойдет речь в этом гайде - создание двери, открыть которую можно посредством разбития замка. 1. Создаем модель двери.
Моделируем обычную динамическую дверь, в любом удобном 3D-редакторе, в моем случае это 3DsMAX. Углубляться в детали по созданию двери в данном гайде смысла не вижу, так как такие уроки уже есть (Пример). У меня получилось следующее:
2. Создаем модель замка
Этап моделирования и текстурирования пропускаю, так как не сомневаюсь в ваших навыках. Для тех, кто работает с 3Ds MAX - в Command Panel переходим в вкладку Create -> Systems -> Bones. Размещаем кость, даем ей названием link, подгоняем под размер нашей модели. Выделяем наш замок, применяем к нему модификатор Skin. В модификаторе Skin, свиток Parameters, ищем кнопку Bones: Add, в открывшемся листе выбираем нашу кость, все автоматически привязалось. Скриптами ден стеша экспортируем получившуюся модельку.
2.1. Создание обломков замка
Тут, опять же, каждый может действовать в рамках своей фантазии и навыков. Я поступил следующим образом. Взял модель замка, создал кривую линию, с помощью булевых операций разрубил модельку замка на два куска. Детачнул один кусок от другого, получил два объекта. К каждому из объектов делаем и привязываем link кость, как расписал выше. После чего экспортируем каждый кусок как отдельный объект. У меня получилось как-то так:
3. Настраиваем модель в Actor Editor
Подгружаем дверь, настраиваем по уроку Андрея Непряхина, экспортируем. Подгружаем объект цельного замка. Раскрываем Bones, выбираем кость link, выставляем параметры Shape -> Type -> Box ; Joint -> Type -> Rigid. Затем делаем Generate Shape All. Раскрываем Surfaces, и к текстурам применяем параметры shader: models\model ; compile: default ; game mtl: default_object. Раскрываем Object -> Game Options -> User data вписываем #include "models\objects\door_locker_01.ltx" и экспортируем в .ogf нашу настроенную модельку замка. Таким же образом подгружаем два обломка замка, настраиваем их как цельный замок, но без инклюда в юзер дата, эспортируем в OGF по пути dynamics\door\part\ c названием door_locker_01_part_1 и door_locker_01_part_2.
4. Создаем конфиг для замка
В юзер дате мы указали путь models\objects\, по которому лежит специальный файл с настройками нашего замка. Создаем по этому пути файл door_locker_01.ltx и впишем в него следующие параметры:
[disable]
linear_factor = 0.5
angular_factor = 0.5
;----------------
[collide]
ignore_static
ignore_small_objects
ignore_ragdoll
;not_collide_parts // наличие это строки определяет колидится ли объект;----------------
[destroyed]
dynamics\door\part\door_locker_01_part_1
dynamics\door\part\door_locker_01_part_2
[autoremove_parts]
time = 60
;----------------
[collision_damage]
link = 0.004
;----------------
[particles]
destroy_particles = destroy_fx\destroy_wood_00
;----------------
[particle_bones]
link = 0.0, 0.15, 0.0
;----------------
[sound]
break_sound = material\metal_box\collide\big_metal_1
default = 1.0, -1, 0.0
[immunities]
burn_immunity = 0.05 ;коэффициенты иммунитета
strike_immunity = 0.5
shock_immunity = 0.0
wound_immunity = 0.5
radiation_immunity = 0.0
telepatic_immunity = 0.0
chemical_burn_immunity = 0.0
explosion_immunity = 1.0
fire_wound_immunity = 0.5
[impulse_transition_to_parts]
random_min = 5.0 ; величина случайно направленного импульса пропорционально массе нового объекта
random_hit_imp = 2.0 ; величина случайно направленного импульса пропорционально разрушающему хиту
;ref_bone ; кость из по которой определяется скорость для частей у который связь не задана, по умолчанию рут
imp_transition_factor = 1.0 ; фактор с которым прикладывается хит по исходному объекту ко всем частям
lv_transition_factor = 0.5 ; коэффициент передачи линейной скорости
av_transition_factor = 0.5 ; коэффициент передачи угловой скорости 5. Размещаем дверь и замок на локации
Дело за малым. Остается разместить все это на локации. Итак, ставим в нужном месте physic_door, назначаем ему визуал нашей двери, ставим в fixed bones: link, в custom data пишем
[logic]
cfg = scripts\location\physics\locked_door_01.ltx
[collide]
ignore_static
В игре создаем файл scripts\location\physics\locked_door_01.ltx в нем пишем:
[logic]
active = ph_door@locked
[ph_door@close]
locked = false
closed = true
snd_open_start = wood_small_open
snd_close_start = wood_small_close_start
snd_close_stop = wood_small_close_stop
on_use = ph_door@open
[ph_door@open]
locked = false
closed = false
snd_open_start = wood_small_open
snd_close_start = wood_small_close_start
snd_close_stop = wood_small_close_stop
on_use = ph_door@close
[ph_door@locked]
locked = true
closed = true
snd_open_start = wood_small_open
snd_close_start = wood_small_close_start
snd_close_stop = wood_small_close_stop
on_info = {+locker_destroyed} ph_door@close
Дверь установили, ставим замок. Размещаем physics -> object, даем ему визуал замка, устанавливаем fixed bones: link, в custom data пишем:
[collide]
ignore_static
[logic]
active = ph_on_death
[ph_on_death]
on_info = %+locker_destroyed%
У меня получилось следующим образом:
Компилируем спавн, закидываем в игру и проверяем итоговый результат: