27 апреля 2005
Обновлено 17.05.2023

Редактор Half-Life 2, часть 3. Средства управления NPC

Редактор Half-Life 2, часть 3. Средства управления NPC - изображение обложка

В предыдущей статье мы научились создавать функциональные объекты и примитивные триггеры. Мы уже можем делать сколь угодно сложные карты для мультиплеера, но если вы вдруг решили разрабатывать модификацию для одиночного режима, то вам не обойтись без использования NPC и триггеров для управления ими. Сегодня мы разберем несколько простых способов управления NPC. Можно теоретизировать по этому поводу, исписать несколько страниц текста, но лучше всего будет разобрать все на практике. Не Характерные ПерсонажиСоздайте карту и сохраните ее под именем npccs_pc. Сделайте комнату размером 384x384 юнитов. Разместите в ней источник света и место появления для игрока. Теперь создайте точечный объект path_corner и дайте ему имя cutscene_pc1. Объект path_corner используется для задания точек в пространстве, которые впоследствии используются в качестве пути для движения объектов. Создав несколько path_corner’ов, ссылающихся друг на друга последовательно, вы задаете линию, по которой может двигаться некий объект. Соответственно, чем больше точек — тем плавнее полученная линия. Разместите полученный вами объект в левом нижнем углу комнаты так, чтобы он касался пола и находился на расстоянии от стены (используйте привязку к сетке). Для того чтобы создаваемый объект гарантированно находился на полу, следует кликать инструментом создания прямо на плоскость в окне камеры. Теперь зажмите кнопку Shift и перетащите path_corner в правый нижний угол комнаты, затем в правый верхний и левый верхний. Заметьте, что ссылки между объектами устанавливаются автоматически при копировании. Выделите последний созданный объект ( cutscene_pc4 ) и укажите значение cutscene_pc1 у параметра Next stop target (Следующая точка остановки). Таким образом будет получен зацикленный круг. Следующее, что нужно сделать, — создать NPC. Выберите из списка объектов любого дружественного персонажа, например npc_alyx или npc_barney , и поставьте его рядом с первой точкой движения. Далее зайдите в свойства NPC и задайте значение cutscene_pc1 у параметра Target path_corner. Все готово. Результат работы показан на рис. 1. Откомпилируйте карту и запустите уровень в игре. Вы заметите, как NPC будет ходить по кругу. Работает это следующим образом: после появления персонажа он идет к первой точке, она пересылает его ко второй, вторая к третьей, третья к четвертой, четвертая снова к первой, и так далее. Единственное условие: линию связи NPC с path_corner не должен пересекать никакой объект. Давайте это проверим на нашей следующей карте. Сохраните предыдущую открытую карту под именем npccs_pc2 и удалите все path_corner’ы, кроме первого. Скопируйте стену и разделите ею комнату пополам, при этом оставьте проход 128 юнитов слева. С одной стороны перегородки поставьте NPC, а с другой path_corner. Убедитесь, что ссылки указаны правильно. Результат работы показан на рис. 2. Запустив карту в игре, вы обнаружите, что NPC будет просто стоять на месте. В чем же дело? А дело в том, что линию связи нарушает стена. Вернемся к этому моменту чуть позже, после рассмотрения следующего сценария.

Редактор Half-Life 2, часть 3. Средства управления NPC - фото 1
Редактор Half-Life 2, часть 3. Средства управления NPC - фото 2
Редактор Half-Life 2, часть 3. Средства управления NPC - фото 3

Ссылки объектов между собой отображаются в редакторе в виде линий связи. Стена разбивает связь NPC с точкой перемещения. Схема показывает, как будет передвигаться NPC на карте.
Основы действийСохраните текущую карту под именем npccs_ss и удалите все ненужные объекты, оставив только комнату, источник света и место появления игрока. Создайте объект npc_alyx и укажите ему имя cutscene_alyx. Далее создайте объект scripted_sequence и сделайте следующие настройки:

Редактор Half-Life 2, часть 3. Средства управления NPC - фото 4

Объекты info_node служат для NPC как опорные точки при движении.
Name = “cutscene_ss(Wave)” — имя объекта; Target NPC = “cutscene_alyx” — используемый NPC; Action animation = “Wave” — анимация действия; Move to position = “No” — двигаться к позиции — нет. Теперь создайте браш вокруг персонажа с запасом в 64 юнита, определите ему текстуру toolstrigger и превратите в объект класса trigger_once. Откройте свойства недавно созданного объекта и перейдите на закладку Outputs. Создайте новое событие и заполните нижеприведенные поля следующим образом: My output named = “OnTrigger” — при пересечении игроком зоны триггера; Targets Entities named = “cutscene_ss(Wave)” — наш scripted_sequence; Via this input = “Begin sequence” — начать действие. Закройте окно, откомпилируйте карту и запустите в игре. Как только вы подойдете к персонажу, он помашет рукой и вернется в исходную позицию. Давайте рассмотрим, как это работает. При пересечении зоны триггера задействуется объект scripted_sequence , который побуждает прикрепленного NPC, в данном случае npc_alyx , воспроизвести анимацию без перемещения по карте. Все довольно просто. Создайте еще один scripted_sequence и разместите его у противоположной стены. В его настройках укажите ссылку на NPC, задайте имя cutscene_ss01 и установите тип перемещения в Walk. Скопируйте полученный объект и установите его в другом конце комнаты. В его настройках измените имя на cutscene_ss02 , а тип перемещения на Run. На панели Outputs в настройках объекта cutscene_ss(Wave) создайте новое действие со следующими значениями:

Редактор Half-Life 2, часть 3. Средства управления NPC - фото 5

Основа вашей финальной сцены.
My output named = “OnEndSequence” — после завершения анимации; Targets Entities named = “cutscene_ss01” — второй scripted_sequence; Via this input = “Begin sequence” — начать действие. Аналогично в настройках cutscene_ss01 задайте событие на cutscene_ss02. Результат работы показан на рис. 3. Запустите карту в игре. После воспроизведения анимации Алекс пойдет ко второй точке, затем побежит к третьей. Как это работает: первый объект после своей работы передает управление над NPC второму, который подзывает первого к себе, затем второй передает управление третьему. Важно понять, что scripted_sequence не отправляет NPC в какую-нибудь точку, а просто подзывает персонажа к себе. На круги свояТеперь пришло время вернуться к примеру с перегородкой, описанной в начале статьи. Загрузите карту npccs_pc2 , сохраните ее под именем npccs_ss2. Замените path_corner на scripted_sequence и добавьте объект logic_auto. В настройках scripted_sequence укажите ссылку на NPC, заранее задав ему имя. Тип перемещения установите в Walk и дайте ему имя cutscene_ss01. Для объекта logic_auto задайте событие OnMapSpawn (при инициализации карты) с ссылкой на cutscene_ss01. Это нужно для того, чтобы задействовать объект сразу после появления игрока. Запустив карту в игре, вы обнаружите, что проблему мы не решили. То есть NPC так и будет стоять на месте. Неужели придется добавить еще две точки, чтобы обогнуть стену? Необязательно. Существует объект info_node , который задает независимые точки для навигации NPC. При прокладке маршрута по карте движок использует info_node в том случае, если невозможно установить прямую связь. Также данный объект служит монстрам для перемещения во время боя. В законченной карте рекомендуется устанавливать все дорожки для монстров таким образом. Создайте объект info_node и разместите по горизонтали в центре прохода, а по вертикали на уровне с NPC. Скопируйте node и аналогично разместите его чуть выше. Результат работы показан на рис. 4. Запустив карту в игре, вы убедитесь, что NPC отлично ориентируется на уровне. Сумма знанийОбъединим полученные знания в следующем сценарии. Создайте новую карту и сохраните ее под именем ThirdMap. Карта будет построена по следующему сценарию. Игрок появляется в замкнутой комнате с запертой двойной дверью. Через несколько секунд дверь открывается, за ней стоит Алекс и делает жест — “пойдем со мной”. Она бежит дальше по коридору и останавливается у развилки. От того, куда пойдет игрок, зависит, куда пойдет Алекс. Нам понадобится квадратная комната, соединенная с коридором двойной дверью. Коридор будет разветвляться на два. Полученная геометрия показана на рис. 5. Убедитесь, что обе двери открываются внутрь комнаты. Для того чтобы изменить направление вращения двери, следует поставить минус перед значением параметра deg (например, -90 ). Где требуется, расставьте источники света. Место появления игрока разместите в квадратной комнате напротив дверей у дальней стены. npc_alyx поставьте с другой стороны дверей, но не слишком близко. Создайте три scripted_sequence. Одному дайте имя cutscene_ss01 и разместите непосредственно перед дверью, но не касаясь ее. Второй поставьте рядом, дайте ему имя cutscene_ss(Wave) , задайте ему анимацию Wave и уберите перемещение. Третий поставьте перед разветвлением, дайте ему имя cutscene_ss02 и укажите тип перемещения Run. Не забудьте у всех этих объектов указать ссылку на NPC и задайте имя для персонажа. Также не забудьте определить угол поворота для всех точек. Используйте logic_auto , чтобы запустить объект cutscene_ss01 , которому добавьте три действия: для отпирания двери, для открытия двери и ссылку на cutscene_ss(Wave). У cutscene_ss(Wave) создайте действие с ссылкой на cutscene_ss02. В двух ответвляющихся коридорах разместите зону trigger_once в середине и scripted_sequence в тупике. Двум зонам дайте одинаковые имена cutscene_to’es , а scripted_sequence’ы назовите cutscene_ss03a и cutscene_ss03b соответственно. Также следует установить параметр Start Disable = “Yes” для обеих зон, чтобы они не были активными с самого начала. У каждой зоны создайте события с ссылкой на соответствующие точки перемещения, а также событие для деактивации зоны (значение Disable ). Вернемся к объекту cutscene_ss02. Добавьте для него новое событие активации зон триггера (значение Enable для объекта cutscene_to’es ). Зоны активируются только после того, как Алекс подошла к разветвлению. Если игрок пересечет хотя бы одну из зон, то все зоны автоматически выключаются, и игрок уже не сможет активировать другую, а Алекс, соответственно, пойдет в один из тупиков. Создайте два объекта: logic_autosave и player_loadsaved. У объекта logic_auto добавьте новое действие ( OnMapSpawn ) и укажите ссылку на объект logic_autosave , предварительно дав ему имя. Аналогично у объектов cutscene_alyx_ss03a и cutscene_alyx_ss03b добавьте ссылку на player_loadsaved (действие reload ) и укажите After a delay in seconds of = 2.00 (время ожидания перед загрузкой карты). В настройках же самого объекта укажите reload_delay = 2 , что даст время на эффект затухания перед загрузкой. Как это работает: при появлении игрока происходит автосохранение, а в конце карты игра загружается. Зайдите в меню Map/Map properties и укажите значение Level Fade In = ”yes” — это добавит эффект просветления при появлении игрока. Откомпилировав и запустив карту в игре, вы можете убедиться, что все работает, как и было описано в начале параграфа.
*** * ***Этой статьей мы завершаем публикацию цикла материалов по редактору Half-Life 2. Вы уже имеете навыки создания достаточно сложных мультиплеерных карт и простых однопользовательских модификаций. Совершенствовать свое картостроительное мастерство дальше можно самостоятельно на основе уже имеющихся данных. Но, конечно, не забывайте, что существуют еще тематические форумы и официальный форум Valve , на котором иногда попадается полезная для мододела информация.

Комментарии
Чтобы оставить комментарий,Войдите или Зарегистрируйтесь