Сделал анимации деревьям через шейдер в Unity
Подготовка модели
Модели пальм взял отсюда, но перекрасил под свой атлас под стиль игры (спасибо YadroGames):
Сделал через VertexColor маски в Blender, чтобы по красному каналу двигать все дерево, а по зеленому двигать дополнительно вертексы листьев:
Использовал Blender Vertex Color Master аддон v0.8.4 под Blender 3.1.1 (в новых версиях не работает нормально покраска VertexColor по каналам).
Выбираем отображение VertexColor у моделей (сверху справа):
Заходим в Vertex Paint через Ctrl+Tab:
Нажимаем V клавишу и выбираем Isolate channel (нужны будут R и G соотв по порядку):
Далее в красном канале снова V нажимаем и выбираем Linear Gradient, рисуем его, получится что-то такое, если градиент получился наоборот (внизу белый), то там есть Invert в Basic operations:
Ну и в конце снова V и в Isolated 'Col R' выбираем Apply Changes - так мы применим изменения по красному каналу.
По листьям: в Edit Mode выбираем их (курсор + L кнопку) все полигоны
В VertexPaint режим заходим, выбираем режим маски (сверху слева):
Нажимаем V клавишу и выбираем Isolate channel G (зеленый канал), ещё раз V и Circular Gradient, рисуем от центра кроны по радиусу кроны с вида сверху:
Применяем изменения по каналу.
Затем можно экспортировать в Unity. Рекомендую ознакомиться с Super Batch Export аддоном для блендера (очень удобно экспортировать объекты в 1 клик).
Шейдер через ShaderGraph
В конце есть ссылка на шейдерграф базу, текстуру шума и Custom Function в виде файла hlsl, но тут вкратце расскажу как делал:
Необходим порт Vertex Position в ShaderGraph, чтобы изменить позицию вершин модели.
Создаем в проводнике в проекте PalmWindAnimation.hlsl файл, в него добавляем следующий код:
В шейдер графе добавляем Custom Function и указываем тип файл и ссылку на тот, что выше сделали. В Name пишем PalmWindAnimation (название функции), добавляем все параметры как на картинке:
И выход Position подключаем в блок Vertex - Position.
Создал материал и оставил такие значения (текстуру можно шума прикрепил в конце):
Текстура шума, лит шейдер с настроенными нодами в ShaderGraph можно взять отсюда:
Конечно, можно улучшить функцию hlsl, чтобы учитывалось направление ветра и его сила (добавить глобальную переменную ветра в Shader классе через C# и потом считывать её в шейдере, но для моей игры это не нужно).
Делаю это все для моей игры Wheel Balance в Steam. Демо версия уже доступна, также заходите на мой ТГ, если хотите следить за разработкой.
Надеюсь этот материал будет кому-то полезен!