Фев 112019
 

Переключаемый (аварийный) свет

Для реализации переключаемого света нам понадобится:

  • light_surface (2 шт.)
  • trigger_changetarget (2 шт.)
  • env_render (2 шт.)
  • multi_manager (3 шт)
  • trigger_auto (1 шт.)
  • func_door (1 шт.)
  • func_rot_button (1 шт.)
  • func_wall (1 шт.)
  • func_detail (1 шт.)

Примечание: В этом методе, для реализации аварийного освещения, используется брашевая энтить (func_wall), в которую входят аварийные источники света. При включении аварийного освещения, к показателям wpoly прибавятся полигоны ламп аварийного освещения.


  Принцип работы: Создаем 2 источника света, в виде двух light_surface, один для основного, второй для аварийного. Дублируя браши с текстурой основного света, превращаем его в энтить. В начале игры лампы аварийного света необходимо скрыть, иначе они будут отображаться негорящими поверх основного света. Для этого используем trigger_auto. Для переключения режима света используем рычаг (func_rot_button), который будет включать переключать основной и аварийный свет между собой. Для исправления одного бага, используем func_door.

Подготовка освещения к логике

  1. В моем случае, текстура основного света имеет имя light01_pl, а аварийного light01_sl. Что означает Primary Lighting и Secondary Lighting.

  Предполагается, что основной свет уже расставлен на карте. Если же нет, то это необходимо это проделать.

  После расстановки основного источника света, необходимо перевести все браши с текстурой основного света в func_detail:


  Параметры:

Func_detail Значение
Detail Level 2
Passable yes


Примечание к func_detail: Если лампы соприкасаются с другим func_detail, то необходимо помнить, чтобы Detail Level у лампочек был всегда выше, чем на другом func_detail.


  2. Следующим шагом будет дублирование брашей основного света. После дублирования основного света, скрываем неиспользуемые объекты, выделив дублированный объект и нажав сочетание клавиш Ctrl+H. Теперь, нам необходимо заменить текстуры основного света на всех лампах на аварийный. Проделать подобную операцию можно в Texture Application Mode(Shift+A). Откроется окно, выбираем Replace…, будут 2 поля. Find: текстура для замены; Replace: текстура, на которую необходимо заменить. В моем случае выйдет вот так: Find: light01_pl Replace: light01_sl.     Такую же операцию проводим и для боковых граней брашей аварийного освещения, избавляемся от ненужных полигонов. В поле Find вводим имя боковых граней текстуры лампы, в поле Replace текстура по имени noclip. В итоге, должна быть только текстура аварийного освещения.

  Продублированный основной свет превращаем в func_wall, добавив только имя:


  Параметры:

Func_wall          Значение
Name SecondaryLight


  3. Размещение двух light_surface.


  Параметры основного света:

Light_surface Значение //
Texture Name light01_pl Имя текстуры
Texture Brightness 225 Яркость текстуры
Color 200 220 255 Цвет R G B
Adjust Emit Scale 70 Умножение света. Желательно устанавливать в районе от 10 до 100. Зависит от помещения, размера лампы.
Name PrimaryLight Имя для взаимодействия с LS


  Остальные параметры и флаги для основного света не трогаем.


  Параметры аварийного света:

Light_surface Значение //
Texture Name light01_sl Имя текстуры
Texture Brightness 100 Яркость текстуры
Color 255 250 208 Цвет R G B
Adjust Emit Scale 40 Умножение света. Желательно устанавливать в районе от 10 до 100. Зависит от помещения, размера лампы.
Name SecondaryLight Имя для взаимодействия с LS
Filter Entity Name SecondaryLight Поиск для освещения именно аварийных источников.


  Флаги:

Flags  
Initially Dark Выключен в начале.


  4. Следующий шаг, создать кнопку, а в моем случае рычаг, который будет переключать основной свет и аварийный.


  Параметры:

func_rot_button Значение
Name control_lighting
Target light01


  Флаги:

Flags  
Not Solid Делает рычаг не материальным
Toggle Рычаг не будет возвращаться сам в исходное положение, пока его не активируют.


  Остальные значения и флаги на ваше усмотрение.  

Логика


  1. Уберем из видимости аварийный свет, объект func_wall с помощью энтити env_render:


  Параметры для скрытия:

Env_render Значение
Name SecondaryLight_off
Target SecondaryLight
Render Mode Texture
FX Amount 0


  Параметры для показа:

Env_render Значение
Name SecondaryLight_on
Target SecondaryLight
Render Mode Normal
FX Amount 255

Примечание: Если вы планируете использовать детальные текстуры на источники света, то необходимо помнить, что детальная текстура накладывается на брашевую энтить только тогда, когда Render mode: Normal. Будь там любой другой режим, детальная текстура на эту поверхность, принадлежащую этой брашевой энтити, накладываться не будет!


  2. Создадим 2 multi_manager’а для переключения основного света на аварийный и наоборот:

Примечание: Для добавления новых параметров необходимо отжать кнопку SmartEdit


  Параметры 1-го mm:

Multi_manager Значение //
targetname light01 Имя multi_manager’а
PrimaryLight 0.0 Выключение основного света
SecondaryLight 0.5 Включение аварийного света
SecondaryLight_on 0.5 Делает видимым func_wall.
light01_off 0.5 Переключение target у рычага с light01, на light02


  Параметры 2-го mm:

Multi_manager Значение //
targetname light02 Имя multi_manager’а
SecondaryLight 0.0 Выключение аварийного света
SecondaryLight_off 0.0 Скрытие ламп func_wall
PrimaryLight 0.5 Включение основного света
light02_off 0.5 Переключение target у рычага с light02, на light01


  3. В multi_manager’ах мы указали изменение параметра target у рычага. Необходимо использовать 2 энтити trigger_changetarget:


  Параметры 1-го trigger_changetarget:

trigger_changetarget Значение //
Name light01_off Имя для вызова
Target control_lighting Имя рычага, у которого будет менять target
New Target light02 Новый target у рычага.


  Параметры 2-го trigger_changetarget:

trigger_changetarget Значение //
Name light02_off Имя для вызова
Target control_lighting Имя рычага, у которого будет менять target
New Target light01 Новый target у рычага.

Заключительный этап


  1. Размещаем trigger_auto для того, чтобы скрыть неактивные лампы в первом раунде:

Параметры:

Trigger_auto Значение
Target SecondaryLight_off


  2. Устраняем баг, если раунд закончился при включенном аварийном освещение. В новом раунде лампы аварийного света будут включены, и target у рычага остается с прошлого раунда. Исправлять такое поведение мы будем с помощью волшебного func_door:


  Параметры:

Func_door Значение
Target lighting_fix_mm
Delay before close -1


  Флаги:

Flags  
Starts Open Активировать в начале раунда.
Passable Убрать коллизию.

Создаем multi_manager:


  Параметры:

Multi_manager Значение //
targetname lighting_fix_mm Имя multi_manager’а
SecondaryLight_off 0.0 Скрывает лампы func_wall.
light02_off 0.0 Переключение target у рычага.

Карта-пример:

https://www.dropbox.com/s/jcagc98x8t7qo4v/SwitchableLighting.rar?dl=0

 Опубликовано в 20:23

Извините, форма комментирования закрыта в данный момент.