Играем в Source SDK, триггеры
Ознакомившись с нашим первым уроком по Source SDK, вы уже должны разобраться с основными функциями Hammer: уметь использовать блоки для создания помещений, менять текстуры и размещать модели на карте. Однако, ваш уровень всё ещё оставляет желать лучшего, так что начнём изучать триггеры, чтобы добавить интерактивности. Далее о том как создать триггер для запуска и остановки событий, а также для изменения свойств объектов.
- Базовые элементы, текстуры и компиляция
- Триггеры и двери
- Работа с освещением, cubemaps и HDR
- Собственные текстуры
Триггеры – это особенные невидимые блоки, которые «срабатывают» при соприкосновении с игроком или другим объектом, вызывая определённый эффект или посылая сигнал другому объекту. Начнём с самого простого – создадим триггер trigger_once. Сначала вам понадобится простая комната и коридор, можете использовать карту, оставшуюся с прошлого урока.
Создание триггера
Рядом с изображением текущей текстуры нажмите кнопку Browse и в фильтре наберите «tools». Вы получите перечень специальных материалов, нужных для различных эффектов. Большинство названий говорят сами за себя. Выберите материал toolstrigger. Теперь используйте Block Tool для создания блока из этого материала, перекрывающего проход в коридор. Пока что это статичный блок без эффектов. Чтобы наделить его функциями, нужно привязать блок к объекту. Проще всего это сделать, выделив его с помощью Selection Tool и нажав Ctrl+T, либо щёлкнуть на нём правой кнопкой мыши на 2D-виде и выбрать Tie To Entity.
Откроется окно Object Properties. «Блоковый объект», которым по умолчанию был ваш блок, изменится на func_detail, очень полезный объект, позволяющий наполнить карту мелкими деталями, не перекрывающими обзор, но об этом нам сейчас задумываться ни к чему. В выпадающем списке Class выберите trigger_once и нажмите Apply.
Давайте поближе познакомимся с этим окном. Первая вкладка, Class Info, содержит базовые настройки объекта. Будет неплохой идеей назначить объекту имя, по которому к нему будут обращаться другие объекты, но в нашем случае имя не пригодится. Filter Name – это удобный способ отсеивать объекты, ведущие к срабатыванию триггера. Например, когда игроку нужно найти физический объект, вроде шестерёнки или батарейки, триггер можно использовать для выявления моделей с необходимым именем. Переходим к двум следующим вкладкам: Outputs (исходящие сигналы) и Inputs (входящие сигналы). Сейчас в них пусто, но мы сюда ещё вернёмся, чтобы заставить триггер что-нибудь сделать. На вкладке Flags содержатся дополнительные опции объекта.
Теперь нужно назначить триггеру какое-то действие. В качестве примера включим проигрывание музыки, когда игрок проходит по коридору. Объект для проигрывания звука в Source называется ambient_generic, давайте его создадим. Объект нужно размещать там, откуда должен исходить звук. Двойным кликом на объекте на 3D-виде откроем окно Object Properties. Будет полезно назначить объекту соответствующее имя, вроде corridor_sound. Затем выберите поле Sound Name и нажмите Browse для выбора звука. Опять же, можно использовать фильтр, чтобы сузить количество вариантов. Будьте внимательны, некоторые звуки настроены на автоматическое повторение. Про остальные опции нам здесь беспокоиться не надо, но на вкладке Flags можно найти некоторые полезные настройки.
Входящие и исходящие сигналы
Теперь всё, что нам осталось сделать, это соединить триггер со звуком. Возвращаемся к свойствам trigger_once на вкладку Outputs и жмём Add. Тут придётся заполнить несколько полей, но не переживайте, всё достаточно очевидно. В первом поле указываем, что должно вызывать исходящий сигнал, в нашем случае выбираем OnTrigger. Target entity – это объект, на который направлен выход, у нас он называется corridor_sound. В выпадающем списке Via this input можно посмотреть всё, что способен сделать целевой объект. Нам требуется PlaySound. Поле Parameter override будет недоступно, потому что здесь нам не нужны дополнительные настройки. При желании в следующем поле можете добавить задержку между активацией триггера и срабатыванием эффекта. Нажимаем Apply и всё! Можете идти на вкладку Inputs свойств объекта ambient_generic и увидеть там входящий сигнал от своего триггера. Если вы скомпилируете карту и пройдёте по коридору, вы услышите заданный звук.
По такому принципу в Source создаются практически любые комплексные события. Все они управляются сочетанием объектов с триггерами и их исходящими сигналами. Применяя объекты logic_ и math_ можно создавать поочерёдно сменяющиеся события, счётчики, таймеры и многое другое. В Source любой объект управляется входящими и исходящими сигналами.
Другие примеры
Автоматическая дверь
В этом примере блоковый объект func_door управляется триггером trigger_multiple. Каждый раз, когда игрок касается триггера, дверь открывается. Когда игрок покидает зону действия триггера, включается исходящий сигнал OnEndTouch и дверь закрывается.
Завершение игры
Это простой способ должного завершения игры на карте. Когда вы «побеждаете босса» (убиваете хедкраба), его смерть включает logic_relay, объект, способный контролировать несколько исходящих сигналов. Это, в свою очередь, запускает исходящий сигнал к объекту env_fade, затемняющему экран. Также запускается game_text, отображающий сообщение о победе. И наконец, после задержки срабатывает объект point_clientcommand. Этот объект активирует команды консоли, в нашем случае команду disconnect, которая отправляет игрока в главное меню.