Патчи
Патч — это поведение, которое вы рисуете. Он аккуратно встаёт между событиями, которые просты, но не умеют хранить значение и считать, и скриптами, которые умеют всё, но требуют писать код.
Тянитесь к патчу в первый же раз, когда поймаете себя на «…но только если счёт больше десяти» или «…сдвинуть чуть дальше каждый раз».
Патчи компилируются, а не интерпретируются, поэтому работают ровно так же быстро, как написанный руками код. Сгенерированный скрипт можно прочитать в любой момент в панели кода — и это же самый быстрый способ проверить, что граф делает то, что вы задумали.
Каждая нода со своими портами: справочник нод патчей — 203 ноды в 24 категориях.
Четыре вида нод
| Вид | Как узнать | Что это |
|---|---|---|
| Event | только выходы, один из них — пульс | откуда граф начинается: при запуске, по нажатию, каждый кадр |
| Effect | пульс на входе и пульс на выходе | что-то делает, по порядку |
| Control | разветвляет или повторяет пульс | ветвление, вентиль, повтор, for-each, once, задержка |
| Data | пульсов нет вообще | значение — число, сумма, поле компонента |
Провод пульса — это порядок, в котором всё происходит. Идите по нему от ноды события — и вы читаете последовательность. Провода данных просто несут значения; порядка у них нет.
Порты и провода
Порты типизированы (число, логическое, строка, вектор, цвет, объект), и несовпадающие типы не соединяются — это ловит немало ошибок ещё до запуска.
Порт вектора раскрывается в x, y и z, так что можно подключить один и вписать два
остальных.
Неподключённый вход использует то значение, которое вы вписали в ноду. Обычно это то, что нужно: подключайте только то, что меняется.
Как сказать ноде, с каким объектом работать
Ноды компонентов («получить transform», «задать материал») должны знать, у какого объекта.
Оставьте привязку пустой — это означает этот объект, тот, к которому прикреплён патч. Заполните — и нода будет работать с указанным.
Два удобства, о которых стоит знать:
- Get-ноды снисходительны. Чтение компонента, которого у объекта нет, даёт ничего, а не ломает граф.
- Set-ноды пишут только то, что вы заполнили. Всё, чего вы не трогали, остаётся как было.
Как и всё остальное, что вы видите. Просто помните об этом, передавая значения между патчем и скриптом, где поворот в радианах.
Что есть в каталоге
| Категория | Что там найдёте |
|---|---|
| events | 30 отправных точек — запуск, кадр, нажатие, клавиши, столкновения, трекинг |
| components | чтение и запись любого компонента |
| math · vector · logic · string | арифметика, сравнения, векторы, текст |
| flow | ветвление, вентиль, повтор, for-each, once, задержка, последовательность |
| state | счётчик, переключатель, таймер, сглаживание |
| entities · lifecycle | найти объекты, создать, породить, уничтожить |
| physics | импульсы, силы, скорость, raycast |
| net | мультиплеер — отправить, принять, общее состояние, породить |
| globals · variables · messaging | значения, общие с другими патчами и скриптами |
| ui | чтение и запись переменных карточки интерфейса |
| functions | вызвать другой патч или скрипт |
Переиспользование патча
Сохраните граф как ресурс — и его можно бросать на другие канвасы. Как он себя поведёт, зависит от того, как вы его собрали:
| Вы собрали | Получите |
|---|---|
| ни входных, ни выходных нод | поведение — бросили, и оно работает, провода не нужны |
| входы, выходы и вход-пульс | шаг — выполняется, когда приходит пульс, после чего выходы готовы |
| входы и выходы, без пульса | функцию — её выходы вычисляются там, где их читают |
Его сокеты берутся из входных и выходных нод, которые вы положили внутрь: добавили одну — она появилась у всех вызывающих. Правите патч — всё, что его вызывает, обновляется на лету.
Внутри чистой функции нет «этого объекта», так что ноды объектов и компонентов там не к месту. Держите в функциях данные, математику и логику, а работу со сценой делайте у вызывающего.
Патчи умеют вызывать и скрипты — это обычный способ дотянуться до того, чего нет в каталоге.
Значения, переживающие граф
Три способа что-то сохранить, отличающиеся дальностью:
| Хранилище | Общее с |
|---|---|
| variables | нодами этого одного патча |
| globals | всеми патчами, скриптами и событиями проекта |
| messages | всеми, кто слушает, — разовым уведомлением по имени |
У globals две области: на весь проект (переживают переход между spaces) и только на space (начинаются с чистого листа). Имена вписываются, а не подключаются проводом, что делает маршрутизацию предсказуемой.
Аварийный люк
Две ноды принимают JavaScript напрямую: expression возвращает значение, action выполняет инструкции. Внутри доступно всё, до чего дотягивается скрипт.
Они существуют ради той одной мелочи, которой не хватает в каталоге, а не как образ жизни. Если вы замечаете, что пишете в них много, — напишите скрипт и вызовите его из графа.
Когда что-то не так
Откройте панель кода. Граф, который не компилируется (петля в проводах данных, сломанный JavaScript в ноде action), скажет вам об этом там.
И сломанный патч никогда не утаскивает сцену за собой: остальные продолжают работать.
Дальше: Игровые контролы — дайте людям ходить.