Roblox · Дополнительное

Фонари: включаются ночью

Время суток идёт само, а фонари вдоль дороги зажигаются в 18:00 и гаснут в 6:00 — лампа светится и освещает всё вокруг.

Структура

Синим — что нужно создать.

Workspace
└─ Lamps (Folder) — все фонари
   └─ Lamp1 (Model)
      ├─ Pole (Part) — столб
      └─ Bulb (Part) — лампа
         └─ PointLight (PointLight) — Range 20, Enabled выкл.
ServerScriptService
└─ LightsServer (Script)

Шаги

  1. Три источника света, вставляются в деталь: PointLight — во все стороны (лампа, костёр), SpotLight — конусом (фонарик, прожектор; Angle — ширина), SurfaceLight — с одной стороны детали (экран, окно; Face — сторона).
  2. Свойства: Brightness — яркость, Range — дальность, Color — цвет, Shadows — тени, Enabled — включён.
  3. Фонарь: столб «Pole» и шар «Bulb» с PointLight. Все фонари — в папке Workspace → «Lamps».
  4. LightsServer двигает Lighting.ClockTime (DAY_LENGTH = 240 — сутки за 4 минуты; 0 — время стоит) и переключает фонари только в момент смены дня и ночи. Неон «светится» сам, Glass — нет.
  5. Атмосфера ночью: Lighting → Ambient и OutdoorAmbient темнее, Atmosphere (Density) — дымка; костёр — Fire + PointLight.

Скрипты

LightsServer

Где: ServerScriptService · Script
Зачем: Сутки и фонари.

-- время суток
local Lighting = game:GetService("Lighting")
-- все фонари
local lamps = workspace:WaitForChild("Lamps")
-- секунд на сутки (0 — время не идёт)
local DAY_LENGTH = 240
-- с 18:00 до 6:00 горят
local ON_AT, OFF_AT = 18, 6
-- прошлое состояние
local wasNight = nil

-- включить или выключить все
local function SetLamps(on)
    -- каждый фонарь
    for _, lamp in ipairs(lamps:GetChildren()) do
        -- лампа
        local bulb = lamp:FindFirstChild("Bulb")
        -- есть
        if bulb then
            -- светится или нет
            bulb.Material = on and Enum.Material.Neon or Enum.Material.Glass
            -- источники света внутри
            for _, light in ipairs(bulb:GetChildren()) do
                -- PointLight, SpotLight и SurfaceLight — все включаются одним свойством
                if light:IsA("Light") then light.Enabled = on end
            -- конец перебора
            end
        -- конец проверки
        end
    -- конец перебора
    end
-- конец функции
end

-- постоянно
while true do
    -- полсекунды
    local dt = task.wait(0.5)
    -- время идёт
    if DAY_LENGTH > 0 then Lighting.ClockTime = (Lighting.ClockTime + 24 / DAY_LENGTH * dt) % 24 end
    -- ночь?
    local night = Lighting.ClockTime >= ON_AT or Lighting.ClockTime < OFF_AT
    -- сменилось
    if night ~= wasNight then
        -- запоминаем
        wasNight = night
        -- переключаем только в этот момент
        SetLamps(night)
    -- конец проверки
    end
-- конец цикла
end

Проверка

Запусти Play (или Run) и убедись:

Собрать фонари одной командой