From 742bca59ee3b5fe1f25e339c7fb81cdd01d09fac Mon Sep 17 00:00:00 2001 From: min Date: Mon, 8 Jun 2026 16:11:27 +0300 Subject: [PATCH] =?UTF-8?q?feat(rbxl):=20Day/Night=20=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=8F=D0=B5=D1=82=20skybox=20preset=20=D1=81=20fadeTo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Roblox Day/Night раньше менял только сцен-clearColor и hemiLight через setTimeOfDay (это работало — пол темнел). Но небо оставалось голубым потому что SkyboxManager (купол + горы + звёзды) рулится отдельно. Теперь по часу мапим в preset SkyboxManager: 06-08, 17-19 → sunset (оранжевое небо) 08-17 → lowpoly-roblox (синее день) 19-06 → starry-night (звёзды + луна + тёмное) Используем skybox.fadeTo({preset}, 2) для плавного 2-секундного перехода между пресетами (Урок 62 — кастомное небо). Это даст реальную смену день↔ночь как в оригинале Roblox-Zapper'а. --- src/editor/engine/GameRuntime.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/editor/engine/GameRuntime.js b/src/editor/engine/GameRuntime.js index 544de79..6a0ae5a 100644 --- a/src/editor/engine/GameRuntime.js +++ b/src/editor/engine/GameRuntime.js @@ -213,8 +213,7 @@ export class GameRuntime { } } else if (cmd === 'lightingTimeUpdate') { // Roblox Lighting:SetMinutesAfterMidnight → Babylon небо. - // Ускоряем в 8x чтобы юзер увидел переход день↔ночь - // в течение ~5 секунд после Play. + // Ускоряем в 8x + меняем пресет skybox (clear/sunset/night). try { const baseHour = Number(payload?.hour); if (baseHour >= 0 && baseHour < 24) { @@ -222,11 +221,25 @@ export class GameRuntime { this._lightBaseHour = baseHour; this._lightStartReal = performance.now(); } - // Δigh-час относительно стартовой const dGame = baseHour - this._lightBaseHour; const accel = 8; const hour = ((this._lightBaseHour + dGame * accel) % 24 + 24) % 24; this.scene3d?.setTimeOfDay?.(hour); + // Skybox preset по фазе: + // 06-08 sunset, 08-17 clear, 17-19 sunset, 19-06 starry-night + let targetPreset; + if (hour >= 6 && hour < 8) targetPreset = 'sunset'; + else if (hour >= 8 && hour < 17) targetPreset = 'lowpoly-roblox'; + else if (hour >= 17 && hour < 19) targetPreset = 'sunset'; + else targetPreset = 'starry-night'; + if (this._lightPreset !== targetPreset) { + this._lightPreset = targetPreset; + try { + const sb = this.scene3d?.skybox; + if (sb?.fadeTo) sb.fadeTo({ preset: targetPreset }, 2); + else this.scene3d?.setSkybox?.({ preset: targetPreset }); + } catch (_) {} + } } } catch (_) {} } else if (cmd === 'particleCreated') {