Стандартный метод зажигания огней световой сигнализации – ActivateNode, когда нужный узел отображается мгновенно. При плавном загорании, нужно нечто, что меняет свой вид со временем. Я попытался использовать схему с UV-анимацией текстуры.
Теория:
Для огня каждой лампы нужно создать три узла c условными именами:
fire изображает постоянно горящий огонь
fire01 изображает загорающийся огонь
fire10 изображает гаснущий огонь
Сетка узлов - круг или «сегмент сферы» («сегмент сферы» я получил удалением у стандартного примитива «бочка» всего, кроме торца) с большим числом граней. Круг (сегмент) разделен на сектора.
![Изображение](http://s44.radikal.ru/i103/1206/d5/40dd8897a0b6t.jpg)
На fire01 и fire10 накладывается «длинная» текстура, от нижнего левого края которой к верхнему правому проходит граница черного цвета и цвета соответствующего огня.
Все сектора имеют одинаковые текстурные координаты, расположенные с краю текстуры и ориентированные так, чтобы радиусы, образующие сектор были ориентированы вдоль короткой стороны текстуры, а его «дуга» занимала незначительную часть длины текстуры. Для fire01 координаты секторы располагаются слева текстуры. Для fire10 – справа.
![Изображение](http://s48.radikal.ru/i120/1206/1b/2c7e1c27696ft.jpg)
С применением UV-анимации вдоль длины текстуры в нужном направлении (знак «+» или «-» в настройках UV-scroll относительно текстуры для fire01 получается эффект плавного увеличения области яркого цвета от центра лампы к ее краям, а для fire10 – плавного уменьшения яркой области. Шейдер – Tex.
При зажигании каждого огня скриптом требовалось реализовать следующее:
1. Процесс включения каждого огня:
1а. Включить fire01 на определенное время, за которое UV-координаты переползут с левого края текстуры на правый.
1б. Выключить fire01 и включить fire
2. Процесс выключения каждого:
2а. Выключить fire и включить fire10
2б. выключить fire10 после определенного времени, за которое UV-координаты переползут с правого края текстуры на левый.
3. При переключении огней сначала должен погаснуть один огонь, затем загореться другой.
4. Если одновременно загораются более двух огней (например ЖЖ), то процессы их загорания должны быть одновременными.
Практика:
Тестовый светофор сделан, скрипт написан (причем всего с одной ошибкой, что для меня редкость), проверка работоспособности произведена, и в итоге получены следующие результаты:
Во-первых...
Узлы, изображающие свет лампы, расположены над линзой.
Линзы реальных ламповых светофоров имеют характерные концентрические «уступы», и горящий огонь светофора имеет характерный вид с более темными кольцами, соответствующими этим уступам. Для того, чтобы в модели эти элементы линзы и «световой картины на ней» совпадали, саму линзу светофора я тоже сделал с большим количеством секторов. Из фото линзы светофора выделил сектор с короткой дугой, спрямил и «растянул» на все сектора линзы, чтобы уступы на линзе четко соответствовали затенениям на горящем огне.
![Изображение](http://s019.radikal.ru/i609/1206/c5/8f9f77bd2332.jpg)
Во-вторых…
Как я понял, если текстура имеет UV-scroll, то математически скроллинг идет постоянно, и не зависит от того, показывается узел или нет. Другими словами, когда активируется узел, то скроллинг не начинается с тех значений координат, которые были указаны в модели в Unwrap UVW. Поэтому требуется синхронизация времени включения узла и момента, когда UV-координаты сектора находятся в соответствующей начальной позиции. Скриптом через GetSimulationTime я пытался переключать огни только в моменты времени, кратные целому числу секунд. Однако, визуально показания часов на HUD-е игры с количеством временем не были синхронными. При отображении HUD-a скорость UV-анимации визуально замедлялась.
Я сломал себе голову, но так и не понял, в каких единицах измеряется скорость UV-scroll rate в свойствах материала.
![Изображение](http://s019.radikal.ru/i638/1206/a9/981238bf7ba3.png)
Исходя из этих двух причин, я так и не смог нормально синхронизировать скрипт и скорость UV-анимации. При скорости UV-scroll 0,5 анимация по длинной стороне текстуры 64х2048 проходила примерно (!) за 0,5 с, то есть текстура повторялась примерно (!) два раза за секунду. При скорости 0,2 – примерно (!) один раз за секунду. При 1,0 очень быстро.
![www.youtube.com www.youtube.com](./../../styles/abbcode/images/youtube.gif)
Вывод:
Куча времени была потрачена для получения отрицательного результата.
Есть еще AddTime…Возможно, что через анимацию чего-то под линзой светофора, можно решить задачу визуализации плавного затухания / загорания. Например, если оставить мысль о линзе с хитрой альфой, то под нее можно поместить «цветок» яркого огня, который будет раскрываться под линзой при загорании и закрываться при затухании огня. AddTime позволяет узнать, закончилась анимация или нет. Но это опять потребует много времени.
P.S. Я наблюдал: при прохождении сигнала поездом, показание на красный может смениться только когда чуть ли не полсостава будет за местом фактического расположения светофора. При прохождении одиночного локомотива сигнал переключался мгновенно. Правда, это были два разных светофора на двух противоположных путях, но в 20-30 м друг от друга. От чего зависит их такое поведение?