Inputs и Outputs
Одно из наиболее главных изменений для создания карт для движка Source были энтити I/O. Тогда как в старой версии движка полагались на ключевые поля target
и targetname
,которые отправляли простой импульс энтити, система I/O энтити позволяет более сложное взаимодействие между энтитями. Это делается с помощью input'ов и output'ов, между которыми есть связи. Используя этот простой метод, энтити могут легко переключать события, основанные на изменениях состояния, и работать в связке с другими энтитями в более крошечном, логическом и мощном пути, который ранее был невозможен.
Обзор
Энтити содержат два метода для связи: отправляя output другой энтити, или получая input из другой энтити. Одна энтити может отправить output, когда она убита другой энтити, input которой приведет к изменению цвета. Тот же output может использоваться для активации input'а создания(Spawning) другой энтити. Output'ы сопоставляются с input'ами через соединения, которые определяют, какие дополнительные данные пересылаются получателю, как долго они задерживаются до того как output получены, и должно ли быть позволено output отправлять запрос позже. Output'ы могут быть связаны с любыми input и наоборот. Это позволяет создавать сложные и мощные взаимодействия между энтитями.
Например, энтити logic_timer
может отправить OnTimer
output, которая сработает, когда временное событие сработает для энтити. Output может быть обработан input'ом Show
в энтитиenv_sprite
, что сделает её видимой, когда таймер достигнет его назначенного времени. Вы также можете обработать OnTimer
output того же таймера (logic_timer
), привязав к input'у SparkOnce
энтити env_spark
, что приведет к испусканию искр. Используя свойства соединения, вы также можете сделать, чтобы output срабатывал после двухсекундной задержки или только один раз.
Для пользователей, использовавших метод связи энтитей оригинального Half-Life , поля targetname
и target
теперь устарели, и I/O система энтитей обладает расширенной функциональностью. Вместо использования энтити trigger_multiple
, только срабатывающей для одной энтити назначения, теперь можно использовать любое кол-во его output'ов, чтобы делать то же, включая: OnStartTouch
, OnEndTouch
, OnTouch
и т.д. Эти output'ы могут быть подсоединены к произвольному числу энтитей, с уникальной задержкой на output, делающие мульти-менеджеры устарелыми. Также поле killtarget
теперь заменено соединением output'а Kill
к input'у другой энтити.
Output'ы
Output'ы - это события, которые срабатывают, когда изменяется состояние энтити. Это может быть таймер, достигнувший конечного значения, нажатая кнопка или дверь, которая закрылась. Любое кол-во output'ов может быть указано программистом внутри энтити, срабатываемых при любом кол-ве критериев. Output'ы указываются на вкладке Outputs свойств энтити. Вкладка Outputs диалога Свойства объекта отображает все output'ы, связывающие энтитю с другой энтитей.
- Имя срабатываемого output'а.
- Имя энтити получаемой output (щёлкните на этитю с помощью инструмента Eye Dropper, чтобы вставить его имя сюда).
- Введите в другой энтите, которая получит output. Вы должны выбрать, какое действие целевой энтити должно активировать output. К примеру, если вы хотите, чтобы солдат npc_combine_s спускался на верёвке, вы должны использовать Input BeginRappel.
- Используется перегрузка параметра, если данные приняты input'ом назначения. Чаще это число, используемое input функцией (смотрите секцию Input'ов ниже).
- Установите задержку отправки output'а (в секундах). 1/10 секунды записывается как "0.1" сек.
- Срабатывает ли output единожды.
Пример output'ов
- OnTrigger - Когда энтитя пересекается, она генерирует этот output.
- OnMapSpawn - Когда карта будет загружена, этот output срабатывает.
Input'ы
Input'ы присоединяются к output'ам любого типа. Здесь мы видим вкладку Inputs диалога Свойства объекта . Она отображает все output'ы, которые подсоединены из других энтитей к этой энтити.
Так как любой output может быть подсоединён к любому input'у, это множество комбинаций может быть использовано для создания сложных взаимодействий. Таймеры могут создавать последовательность обратного отсчёта, используя мигающие спрайты, звуки и специальные эффекты, - и всё это без дополнительных энтитей. Щёлкнув на кнопку Mark или два раза щёлкнув на записи в списке, пользователь может перейти к энтити, отправляющей output в данный input.
Если соединение отображается красным, оно неправильно. Это означает, что output не существует в исходной энтити или input не существует в энтити назначения. Неправильное соединение не смертельно, но должно быть устранено до компиляции карты, так как команда меню Check For Problems выдаст это как ошибку.
Output'ы со значениями
Очень мало output'ов, которые возвращают значения. К примеру math_counter 'а OutValue output. Эти output'ы привязаны к input'ам, которые требуют параметр и будут заполнять значение для этого параметра когда сработает. К примеру, для math_counter может быть следующий input: OutValue mover SetPosition <none>
где mover это func_movelinear . Позиция mover может быть изменена с помощью простых арифметических операций math_counter 'а.
Создание простого триггера
Вот пример, как создать простой триггер, используя input'ы и output'ы. Как только игрок войдёт в определённую зону, воспроизведётся звук.
Создайте карту и добавьте ambient_generic энтити. Назовите её "ambient_1". Зайдите в её свойства и выберите звуковой файл для воспроизведения. Убедитесь, что во флагах стоит "Starts Off". Выберите текстуру "toolstrigger" и создайте прямоугольный браш. Щёлкните правой кнопкой мыши и выберите в меню "Tie to Entity ". В свойствах выберите trigger_once
энтити. Во вкладке "Outputs" нажмите кнопку "Add..."
Выберите в "My output named" вариант "OnStartTouch
". Это создаст output (и это триггер) при соприкосновении игрока и браша в игре.
В "Targets entities named" напишите "ambient_1". Триггер будет ссылаться на энтити ambient_generic
, которую вы создали раньше.
Выберите "PlaySound
" в списке "Via this input". Это выберет действие для энтити ambient_generic
при создании output'а, и это действие вызовет воспроизведение звука.
Нажмите клавишу "Apply", чтобы сохранить изменения в триггере и закройте его. Теперь у нас есть триггер, настроенный на прикосновение игрока и вызывающий команду ambient_generic
, которая начинает воспроизводить звук.
Если вы откроете свойства ambient_generic
, вы можете увидеть, что Output триггера автоматически превратился в Input для ambient_generic
.
Перед проверкой вашего триггера в игре, убедитесь, что все основные энтити и браши(точка старта игрока, освещение и т.п.) установлены, и вы задали звук для ambient_generic
Отладка
Так как природа того, как энтити связаны, более сложная и мощная, поэтому в движке имеются возможности для отладки, чтобы помочь вам отследить проблемы. Если цепочка I/O логики не работает как ожидалось, инструменты, указанные ниже, вам сильно помогут устранить ошибку.
developer 0/1/2
- Установив консольную переменную в значение "2", вы получите подробный отчет о том, как энтити взаимодействуют с помощью системы I/O энтитей. Это полезно для определения, какое точно место занимает цепочка событий в сложных взаимодействиях.
ent_messages_draw 0/1
- При значении "1", в игре будет отображаться визуальная информация о том, как энтити взаимосвязаны между собой. Это очень похоже на использование консольной переменной developer, но иногда даёт более быстрый и интуитивный результат.
ent_fire <entity name> <input name> <input value>
- Эта консольная команда позволяет вам вручную вызывать input'ы энтити из консоли. Это бывает очень полезно для тестирования настроек энтитей в реальном времени. Чтобы вызвать input под названием "Open" для энтити с именем "testentity" с параметром input "3", вы должны ввести
ent_fire testentity open 3
ent_pause
- Эта команда приостанавливает энтити карты. Если мы введём снова, энтитям будет возвращено их обыкновенное поведение. Она наиболее полезна с использованием вместе с командой
ent_step
, описанной ниже. ent_step <number of steps>
- Когда используется вместе с консольной командой
ent_pause
, эта команда позволяет пользователю замедлить шаги, через которые цепочка энтитей исполняется для input'а и output'а. Любое кол-во шагов может быть выполнено в одно время, что указывается в значение введённым после команды (напримерent_step 3
исполнит 3 шага сразу же).