Unity Visual Scripting: как собрать поведение в графе и чем оно отличается от Visual Studio
Запрос «Unity visual» может вести к двум разным инструментам. Visual Studio — среда для написания и отладки C#. Visual Scripting — пакет Unity, позволяющий строить логику из узлов. Если хотите соединять события и действия на схеме, нужен второй вариант.
Соберём простой граф вращения объекта и разберём, как читать связи, хранить настройки и искать ошибку. Пример ориентирован на Unity 6 с совместимым Visual Scripting 1.9.
ТОП-5 курсов обучения Unity:
Граф тоже является программой
Узлы выполняют операции: читают значение, вызывают метод, проверяют условие или обрабатывают событие. Control connections задают порядок действий, value connections передают данные. Эти связи нельзя считать взаимозаменяемыми.
Например, событие Update запускает вращение. Величина вращения вычисляется из скорости и времени кадра. Вызов зависит от control flow, а параметры получает по value connections.
Граф не отменяет типы, ссылки и жизненный цикл. Пустая ссылка может привести к ошибке так же, как в C#. Хороший граф должен позволять понять, какие данные он получает и когда изменяет состояние.
Подготовьте объект и Script Machine
- Установите или проверьте Visual Scripting в Package Manager. Дождитесь завершения настройки и генерации доступных узлов.
- Создайте Cube и разместите камеру так, чтобы куб был виден.
- Добавьте на Cube компонент Script Machine.
- Выберите Source: Graph, нажмите New и сохраните Script Graph asset как RotateCube.
- Откройте граф через компонент.
Использование отдельного graph asset позволяет хранить описание поведения отдельно от экземпляра сцены. Embedded-граф имеет другой способ хранения. Официальный процесс описан в инструкции создания графа на Machine.
Соберите вращение с учётом времени
Названия отображения могут немного отличаться в зависимости от настройки узлов. Ищите операцию и нужную сигнатуру метода, а не первый результат со словом Rotate.
- Добавьте событие On Update.
- Получите Transform текущего GameObject: используйте Self как объект и его свойство Transform.
- Добавьте чтение Time.deltaTime.
- Создайте значение Vector3 (0, 90, 0) — скорость поворота в градусах за секунду.
- Умножьте этот Vector3 на deltaTime.
- Добавьте вызов Transform.Rotate(Vector3 eulers, Space relativeTo). Target — Transform куба, Eulers — результат умножения, Relative To — Self.
- Соедините control output On Update с control input Rotate.
Здесь Self у значения Space означает локальные оси, а Self при получении объекта — текущий GameObject графа. Это разные типы данных с похожим отображаемым названием.
В Play куб должен вращаться вокруг собственной оси Y примерно на 90 градусов в секунду. Без умножения на deltaTime он получил бы 90 градусов за каждый кадр. Смысл overload можно сверить с API Transform.Rotate.
Превратите скорость в настройку
Вместо фиксированного числа используйте Object Variable с именем RotationSpeed и типом float. Задайте 90 у объекта через Variables, затем получите значение узлом Get Object Variable и подайте в Y создаваемого Vector3.
Теперь два объекта с одним графом смогут вращаться с разной скоростью. Данные настройки принадлежат экземпляру, описание поведения остаётся общим.
Graph Variables доступны в соответствующем графе, Object Variables принадлежат GameObject, а Scene/Application/Saved scopes решают другие задачи. Выбор широкой области без необходимости создаёт скрытые зависимости. Различия описаны в документации переменных.
Как искать ошибку в графе
Если куб не вращается, проверьте активность объекта и Script Machine, назначение graph asset, событие Update и наличие control connection. Соединённые только value ports могут вычислять данные, но не запускают вызов Rotate сами по себе.
Если возникает ошибка target, проверьте, передаёте ли Transform, а не пустую ссылку. Если скорость огромная, найдите место умножения на время. Если оба экземпляра получают одно значение вопреки ожиданию, проверьте scope переменной.
В Play наблюдайте подсветку выполнения и значения ports. Делайте граф небольшими частями: сначала постоянный поворот, затем настройка скорости, затем условия. Такой порядок локализует неверную связь.
Когда выбирать Script Graph и State Graph
Script Graph описывает поток операций и событий. State Graph помогает представить поведение через состояния и переходы. Например, закрытая, открывающаяся и открытая дверь имеют разные состояния, а взаимодействие запускает переход.
Необязательно использовать State Graph для одного простого действия. Но когда длинный граф постоянно проверяет десятки флагов, явно выделенные состояния могут сделать поведение понятнее.
Связь с C# также возможна: графы используют доступные типы и методы, а для повторяемых операций можно создавать собственные узлы. Следите за сборкой и доступностью типов на целевой платформе.
Как не превратить граф в запутанную схему
Давайте переменным смысловые имена, группируйте связанные действия и выносите повторяемые части. Проверяйте зависимости между объектами и не храните глобально то, что нужно одному экземпляру.
Visual Scripting подходит для обучения, прототипов и определённых командных процессов. Для сложной системы сравнивайте удобство графа и C#, включая проверку изменений и сопровождение. Язык и общий путь обучения разобраны в статье о языке Unity.