Я один из тех староверов, который работает ещё с Unity 4. Не с 3 версии, но всё же. И как-то за 8 лет привыкаешь к Code-first разработке, к Built-in рендеру. Ведь всё такое понятное, ламповое родное. Это как меняют дизайн где-нибудь (Дуров верни стену). Во что-то новое бывает трудно вкатываться и вникать, менять привычки, переписывать и адаптировать старые инструменты)
Но вот сейчас, так как один проект переводится на HDRP компьют шейдеры там у меня отвалились. Я подумал, что повторить то, что я хочу на VFX Graph будет проще, чем разбираться, как завести Compute Shader. И что я могу по итогу сказать. Ощущения смешанные именно с точки зрения VFX графа. С одной стороны работая с визуалом графом во многом манипулировать удобнее и прикольнее, чем кодом. И в достаточно больших шейдерах немного быстрее + мне пришлось в компьюте написать свою логику LifeTime, а тут она из коробки. Но с другой стороны меня ждали несколько занимательных открытий про VFX граф и его некоторое неудобство)
Сделать эмит по форме нетривиальная задача
Либо я дурак, либо лыжи не едут. Я делаю для контекста — поток частиц из конуса. И тут есть довольно забавная особенность в VFX графе, которая как мне кажется просто моя неопытность работы с ним. Но на это ушло больше всего времени. Выровнять скорости по форме. В компьют шейдере всё просто, так как ты манипулируешь параметрами и т.п. А вот в VFX графе нужно было составить целый подграф, который выглядит вот так.
Данный подграф позволяет по конусу (или любой другой форме) сделать примерно такое распределение скоростей.
В данном случае на инициализации эмита нам нужно получить позицию Пивота (это можно сделать из позиции трансформа) Позицию партикла в VFX Graph это можно получить через Get Attribute: position (Current), вспомнить немного векторной математики и вычесть позицию партикла из позиции Пивота. Всё остальное что присутствует в графе — это уже для удобства. Нормализация, чтобы скорость частиц стартовая была одинаковой, логика вращения самого конуса исходя из трансформа, чтобы наш поток частиц правильно реагировал на вращение. И тут стоит перейти к следующему неудобству. Система координат.
Система координат
Всё вроде бы в порядке, систему координат можно менять с локальной на глобальную, и зачем я выше делал вращения вообще через матрицу трансформа, если можно было просто сделать локальную симуляцию и всё бы крутилось?
Ответ прост — мне нужна гравитация, а она по какой-то причине как вектор не в мировой системе координат (и назначить это нельзя), а в той в которой мы находимся. То есть если поставить систему координат на локальную, то вместе с вращением системы координат, я буду вращать и вектор гравитации.
Это не то, чтобы супер проблема (когда уже под рукой есть готовый подграф выше), но в создаёт некоторые неудобства. И я ещё разбираю простой пример — поток частиц с гравитацией по скорости. В целом на VFX могут действовать совершенно разные силы, он может быть привязан и игроку и т.п. И в отличии от шейдеров, где кодом легко манипулировать любой системой, тут я вижу некоторое неудобство. Так как система координат назначается глобально. Может есть какой-то модификатор или оператор перевода базирующийся на трансформе. Но всё, что я перепобовал типа:
Работало странно. Возможно надо разобраться, что к чему и станет удобно. Ну про неудобства я сказал, а теперь к плюсам.
Модульность
Очевидно, что любой инструмент подобного плана мотивирует делать "кастомные блоки". Допустим мне нужна была форма расчёта основания площади круга, чтобы менять на основе угла менять скорость и радиус распыления частиц. И вот подграф отвечающий за это.
И я понимаю, что со временем, можно создать коллекцию подобных кастомных нод и компонент, и просто ими пользоваться. Так же как и со сниппетами. Но в таких случаях всегда проще копипастить, модифицировать, редактировать.
Прототипирование
Любая визуальная система идеальна для прототипа. Очень быстро можно всё отредактировать, перебрасывать и т.п. Я даже шейдера привык писать в блокноте и сложную математику так действительно делать быстрее. Но в процессе творческого поиска визуальные инструменты очень удобны. Когда нужно быстро смотреть, редактировать и т.п. Плюс так как есть вывод по всем параметрам, как некоторый мониторинг — дебаг происходит в разы проще. Особенно в шейдерах или в VFX.
Конечно же для продакшена вопрос всегда в оптимизации и выходном коде генератора из визуала. Но если брать VFX граф — всё летает из того, что я пока собирал. Но это надо тестировать в крупных проектах, и думаю кодом можно написать быстрее. Потому что в VFX графе я не нашёл, как скажем сделать тип half, есть только float.
В заключение
В общем видимо пора менять привычки и учить новые инструменты. Так как за пару лет, что они существует Unity судя по всему превратило их во что-то приличное. Осталось только разобраться и поковырять, что там с визуализацией скриптинга и насколько удобно пользоваться ей. Этот год, будет годом переезда на новые лыжи, так как видимо их наконец-то привели в порядок. Инпут система, графы и т.п. стали в разы лучше, чем несколько лет назад.