Inputs і Outputs - Valve Developer Community
Одне з найголовніших змін для створення карток для движка 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'и вказуються на вкладціOutputsвластивостей ентіті. ВкладкаOutputsдіалогу Властивості об'єкта відображає всі output'и, що пов'язують ентити з іншою ентітею.
- Ім'я output'а, що спрацьовується.
- Ім'я ентіті одержуваної output (клацніть на етиту за допомогою інструменту Eye Dropper, щоб вставити його ім'я сюди).
- Введіть в інший ентите, який отримає output. Ви повинні вибрати, яка дія цільової ентіті має активувати output. Наприклад, якщо ви хочете, щоб солдат npc_combine_s спускався на мотузці, ви повинні використовувати InputBeginRappel.
- Використовується перевантаження параметра, якщо дані прийняті input'ом призначення. Найчастіше це число, що використовується inputфункцією (дивіться секцію Input'ів нижче).
- Встановіть затримку надсилання output'а (в секундах). 1/10 секунд записується як "0.1" сек.
- Чи спрацьовує output один раз.
Приклад output'ів
- OnTrigger- Коли ентитя перетинається, вона генерує цей output.
- OnMapSpawn- Коли картка завантажена, цей output спрацьовує.
Input'и приєднуються до output'ів будь-якого типу. Тут ми бачимо вкладкуInputsдіалогу Властивості об'єкта. Вона відображає всі output'и, які під'єднані з інших ентіт до цієї ентіті.
Так як будь-який output може бути приєднаний до будь-якого input'у, це безліч комбінацій може бути використане для створення складних взаємодій. Таймери можуть створювати послідовність зворотного відліку, використовуючи миготливі спрайти, звуки та спеціальні ефекти, і все це без додаткових ентітій. Клацнувши на кнопкуMarkабо двічі клацнувши на записі у списку, користувач може перейти до ентіті, що надсилає output у цей input.
Якщо з'єднання з'являється червоним, воно неправильне. Це означає, що output не існує у вихідній ентіті або input не існує в ентіті призначення. Неправильне з'єднання не смертельно, але має бути усунене до компіляції карти, оскільки команда меню Check For Problems видасть це як помилку.
Output'и зі значеннями
Дуже мало output'ів, які повертають значення. Наприклад math_counter'аOutValueoutput. Ці output'и прив'язані до input'ів, які вимагають параметр і заповнювати значення для цього параметра коли спрацює. Наприклад, для math_counter може бути наступний input: OutValue mover SetPosition де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 Ця консольна команда дозволяє вам вручну викликати input'и ентіті з консолі. Це дуже корисно для тестування налаштувань ентітій в реальному часі. Щоб викликати input під назвою "Open" для ентіті з ім'ям "testentity" з параметром input "3", ви повинні ввести ent_fire testentity open 3 ent_pause Ця команда призупиняє ентіті карти. Якщо ми введемо знову, ентитям буде повернуто їхню звичайну поведінку. Вона найбільш корисна з використанням разом із командою ent_step , описаною нижче. ent_step Коли використовується разом з консольною командою ent_pause , ця команда дозволяє користувачеві уповільнити кроки, через які ланцюжок ентіт виконується для input'а і output'а. Будь-яка кількість кроків може бути виконано в один час, що вказується в значення введеним після команди (наприклад ent_step 3 виконає 3 кроки відразу ж).