照明 服務在體驗中控制全球照明。它包括一系列可調整的屬性,您可以使用它們來變更照明在不同對象上的外觀和交互方式,如在 照明屬性 中所述。
照明 也可能包含 Atmosphere 對象來渲染實際的大氣效果,包括粒子密度、霧、閃光和顏色。請參閱 大氣效果 了解詳情。
此外, 照明 (包括Workspace.CurrentCamera ) 可能包含 post-processing 效果,例如SunRaysEffect 和1>Class.BlurEffect1>。請參閱4> post-processing 效果4> 了解更多資訊。
範例程式碼
local Lighting = game:GetService("Lighting")
local TIME_SPEED = 60 -- 1 min = 1 hour
local START_TIME = 9 -- 9am
local minutesAfterMidnight = START_TIME * 60
local waitTime = 60 / TIME_SPEED
while true do
minutesAfterMidnight = minutesAfterMidnight + 1
Lighting:SetMinutesAfterMidnight(minutesAfterMidnight)
task.wait(waitTime)
end
概要
屬性
適用於從天空中隱藏的區域,例如室內區域。
這個空間方的照明強度。
一個數量代表(以小時)當前時間的日用 Lighting 。
代表在光中反射的顏色,顏色與面向太陽或月亮的表面不同。
代表從太陽或月亮面反射的光色。
由環境產生的環境光。
從環境中得到的鏡像光。
曝光補償值。
深度從 Workspace.CurrentCamera ,以 studs 計測單位,在此霧將完全不透明。
Class.Workspace.CurrentCamera 的深度,以 studs 表示,在此霧開始顯示。
場景的地理位置,以度計,影響「Class.Lighting」時間在太陽和月的位置。
切換遊戲的動態照明。
適用於戶外區域的照明顏色。
控制暗影的模糊程度。
決定 3D 世界的照明系統。 非 scriptable。
Class.Lighting 使用的 24 小時串代表當前時間。
方法
返回午夜後剩下的時間數,以供照明。
返回 Vector3 代表月亮從位置 0, 0, 0 的方向。
返回月亮目前的相位。
返回 Vector3 代表太陽從位置 0, 0, 0 的方向。
設置 Lighting.TimeOfDay 和 Lighting.ClockTime 至指定的午夜後的指定數分鐘。
活動
屬性
Ambient
適用於從天空中隱藏的區域,例如室內區域。
此屬性預設為 0, 0, 0 (黑色).
只要這個屬性的紅、綠、和藍頻道不超過 Lighting.OutdoorAmbient 的相應頻道,改變顏色將被保留以區域隱藏在太陽/月亮之外。有效的 <
注意,當 Lighting.GlobalShadows 關閉時,不會有區別之間的區域被遮蔽和不被遮蔽的區域。 在這個情況下 Lighting.OutdoorAmbient 將被忽略,顏色將在環境屬性中適用。
如需更多影響照明顏色的屬性,請參閱 Lighting.ColorShiftBottom 和 Lighting.ColorShiftTop。
Brightness
這個空間方的照明強度。
變更此值將影響地圖的照明。當光源的亮度設為0時,沒有因為 Lighting.ColorShift_Top 或 Lighting.ColorShift_Bottom 而造成的效果。注意,這個光源沒有影響創建由 Lighting.GlobalShadows ��
這個屬性未錨定,效果會在 0 和 2 之間壓縮。意味著將亮度設為 10 與將它設為 2 無大小。
注意,Lighting.Ambient 和 Lighting.OutdoorAmbient 也可以用來影響地方的光澤。例如,將 Lighting.OutdoorAmbient 設置為 255、255、255 會使地方看起來比
ClockTime
一個數量代表(以小時)當前時間的日用 Lighting 。
注意,此屬性與實際的時間點不相等,並且在遊戲中不會改變,除非由指令碼變更。
為了測量 Lighting 時間的格式,使用 Lighting.CurrentTime 。改變 Lighting.CurrentTime 或使用 1> Class.Lighting:SetMinutesAfterMidnight()1> 也會改變此屬性。
使用 ClockTime 需要時間進行正常化:
minutesAfterMidnight = 0while true dominutesAfterMidnight += 1local minutesNormalised = minutesAfterMidnight % (60 * 24)local hours = minutesNormalised / 60Lighting.ClockTime = hourstask.wait()end
使用 Lighting.TimeOfDay 需要時間正常化,並且格式化為字串:
minutesAfterMidnight = 0while true dominutesAfterMidnight += 1local minutesNormalised = minutesAfterMidnight % (60 * 24)local seconds = minutesNormalised * 60local hours = string.format("%02.f", seconds//3600)local mins = string.format("%02.f", math.floor(seconds/60 - (hours*60)))local secs = string.format("%02.f", math.floor(seconds - hours*3600 - mins *60))local timeString = hours..":"..mins..":"..secsLighting.TimeOfDay = timeStringtask.wait()end
使用 Lighting:SetMinutesAfterMidnight() 不需要額外處理:
minutesAfterMidnight = 0while true dominutesAfterMidnight += 1Lighting:SetMinutesAfterMidnight(minutesAfterMidnight)task.wait()end
ColorShift_Bottom
代表在光中反射的顏色,顏色與面向太陽或月亮的表面不同。
Class.BasePart 的表面會受到 ColorShift_Bottom 的影響,其位置和方向與 BasePart 相對於太陽或月的位置有關。當太陽直接頂在 BasePart 上時,色彩變更只適用於底表面。
此效果可以通過變更 Lighting.Brightness 來提升或降低。
ColorShift_Bottom 會影響底部的表面 Lighting.ColorShift_Top
注意,Lighting.ColorShift_Top 和 ColorShift_Bottom 會與 Lighting.Ambient 和 Lighting.OutdoorAmbient 屬性互動,如果它們大於 0, 0, 0 。또한,1> ColorShift_Bottom
ColorShift_Top
代表從太陽或月亮面反射的光色。
Class.BasePart 的表面會受到 ColorShift_Top 的位置和方向,BasePart 與太陽或月的位置相對而言。當太陽直接位於上方時,BasePart 的變更顏色只適用於表面上。
此效果可以通過變更 Lighting.Brightness 來提升或降低。
顏色變更_上限會影響受到光的表面,但 Lighting.ColorShift_Bottom 會影響受到光的表面。
注意, Lighting.Ambient 會與 Lighting.OutdoorAmbient 和 Class.Lighting.OutdoorAmbient 屬性互動,如果它們大於 0, 0, 0。
EnvironmentDiffuseScale
由環境得到的環境燈。此屬性的值預設為 0。
它與 Lighting.Ambient 和 Lighting.OutdoorAmbient 屬性相似,但它是動態的,可以根據天空和時間的日落改變。當這屬性增加時, Ambient 和 OutdoorAmbient 相應減少。
這也會讓天空盒子在夜間顯示。
ExposureCompensation
此屬性決定了曝光補償量,可以對場景的曝光等級造成曝光補償。預設為 0。
- +1 的值表示為兩倍的曝光,而 -1 的值表示為半曝光。
- 0 的值表示沒有要進行的曝露補償。
- 範圍:-5 至 5
此屬性是複製的,可以從指令碼或 Studio 設定。
local Lighting = game:GetService("Lighting")Lighting.ExposureCompensation = 5
您可以使用此屬性來調整 tonemap 步驟前的曝光量,以顯示更多在更淺或更黑暗區域的細節。這是我們移動到 HDR 管道的需要。
當 Lighting.Technology 設為 Legacy 時,此屬性沒有效果。
local Lighting = game:GetService("Lighting")-- ExposureCompensation 沒有效果,因為 Lighting 的技術是 LegacyLighting.Technology = Enum.Technology.LegacyLighting.ExposureCompensation = 5
FogColor
Fog 屬性隱藏在 Lighting 包含 Atmosphere 對物件時。
霧如何工作?
Roblox 中的霧在平面上與 Workspace.CurrentCamera 方向平行顯示。它會在 Lighting.FogStart 屬性之間漸漸消失,直到 Lighting.FogEnd 屬性,在這裡它是完全不可見的。霧的效果是它會與霧顏色結
在距離大於 Lighting.FogEnd 的距離,顏色將完全由 FogColor 決定。但在距離 Lighting.FogStart 和 Lighting.FogEnd 之間的距離,顏色所涂抹的程度取決於位置。
Roblox 的霧使用線性 interpolation 在 Lighting.FogStart 和 Lighting.FogEnd 之間。這意味著如果 Lighting.FogStart 是
local Lighting = game:GetService("Lighting")-- fog will fade between 25 and 200 studsLighting.FogStart = 25Lighting.FogEnd = 200
注意,霧不會遮蔽天窗。
FogEnd
Fog 屬性隱藏在 Lighting 包含 Atmosphere 對物件時。
深度從 Workspace.CurrentCamera ,以 studs 計測單位,在此霧將完全不透明。
霧如何工作?
Roblox 中的霧會顯示在一架與 Workspace.CurrentCamera 外觀方向相pendicular的飛機上。它會在 Lighting.FogStart 屬性之間漸漸消失,直到 FogEnd 屬性上,它是完全不可見的。霧的效果是它會與霧的顏色結合在 <
距離 FogEnd 大於 Lighting.FogColor ,顏色將完全由 Lighting.FogStart 決定。 但在距離 Class.Lighting.FogStart 和 FogEnd 之間的距離,顏色所涂抹的度量取決於位置。
Roblox 的霧使用線性 interpolation 在 Lighting.FogStart 和 FogEnd 之間。這意味著如果 Lighting.FogStart 是 10 和 FogEnd 是 20 的距離,霧將在 50% 的距離。 這意味著在 15 格子
local Lighting = game:GetService("Lighting")-- fog will fade between 25 and 200 studsLighting.FogStart = 25Lighting.FogEnd = 200
Lighting.FogColor 可以調整霧的顏色。
注意,霧不會遮蔽天窗。
FogStart
Fog 屬性隱藏在 Lighting 包含 Atmosphere 對物件時。
Class.Workspace.CurrentCamera 的深度,以 studs 表示,在此霧開始顯示。
霧如何工作?
Roblox 中的霧會顯示在一架與 Workspace.CurrentCamera 外觀方向相pendicular的飛機上。它會在 Lighting.FogEnd 屬性之間逐漸消失,直到 Lighting.FogColor 屬性,它是完全不可見的。霧的效果是它與 1>FogColor1> 結合。
在距離大於 Lighting.FogEnd 的距離,顏色將全部由 Lighting.FogColor 決定。 但在 FogStart 和 Lighting.FogEnd 之間的距離,顏色所涂抹的程度取決於位置。
Roblox 的霧使用線性 interpolation 在 FogStart 和 Lighting.FogEnd 之間。這意味著如果 FogStart 是 10 和 Lighting.FogEnd 是 20 ,在 15 英尺的距離 Fog 將在 50%。這意味著在 15 英
local Lighting = game:GetService("Lighting")-- fog will fade between 25 and 200 studsLighting.FogStart = 25Lighting.FogEnd = 200
Lighting.FogColor 可以調整霧的顏色。
注意,霧不會遮蔽天窗。
GeographicLatitude
場景的地理位置,以度計,影響「Class.Lighting」時間在太陽和月的位置。
計算太陽的位置時,地球的傾斜也會被考帳號。
變更地理位置將會改變每個 Lighting.TimeOfDay 的太陽位置。發展人員尋求獲得太陽或月的位置,應該使用 Lighting:GetSunDirection() 或 Lighting:GetMoonDirection() 。
範例程式碼
local Lighting = game:GetService("Lighting")
local UNIT_Z = Vector3.new(0, 0, 1)
local EARTH_TILT = math.rad(23.5) -- The Earth's tilt in radians.
local HALF_SOLAR_YEAR = 182.6282 -- Half the length of an average solar year
local function getSunDirection()
local gameTime = Lighting:GetMinutesAfterMidnight()
local geoLatitude = Lighting.GeographicLatitude
local dayTime = gameTime / 1440
local sourceAngle = 2 * math.pi * dayTime
local sunPosition = Vector3.new(math.sin(sourceAngle), -math.cos(sourceAngle), 0)
local latRad = math.rad(geoLatitude)
local sunOffset = -EARTH_TILT * math.cos(math.pi * (dayTime - HALF_SOLAR_YEAR) / HALF_SOLAR_YEAR) - latRad
local sunRotation = CFrame.fromAxisAngle(UNIT_Z:Cross(sunPosition), sunOffset)
local sunDirection = sunRotation * sunPosition
return sunDirection
end
print(getSunDirection())
GlobalShadows
切換遊戲中的動態光源
GlobalShadows 是做什麼的?
設為真,暗影將在陰晴區域依照太陽和月亮的位置渲染。這些區域的照明顏色由 Lighting.Ambient 屬性決定。在其他區域的照明顏色由 Lighting.OutdoorAmbient 屬性決定。
停用時,陰影不會畫出,因此室內和室外區域之間沒有區分。因結果,Lighting.Ambient屬性決定燈光顏色,而Lighting.OutdoorAmbient則完全無聲。
陰影是使用 voxel 系統計算的,每個照明 voxel 是 4x4x4 格。這意味著對象需要大於 4x4x4 格才能顯示一個實際的陰影。陰影也會在 BaseParts 移動時重新計算。
注意,此屬性與 GlobalShadows 設置無關。
有關 Roblox 的動態照明,請參閱此 博客文章。
切換全球暗影
開發人員切換GlobalShadows設定時會注意到將其關閉會使位置變得明暗Lighting.Ambient。這是因為當GlobalShadows關閉時,Lighting.Ambient會用於計算照明顏色在室內和戶外兩個空間。這個黑暗可以通過將
大多數情況下,建議開啟GlobalShadows,因為它的視覺外觀優於其他方案。請參閱Lighting Properties 指南查看。
Intent
OutdoorAmbient
適用於戶外區域的照明顏色。
此屬性預設為 127、127、127。
Class.Lighting.Ambient 的紅、綠、和藍頻道Lighting.Ambient,燈光在戶外區域的
注意,當 Lighting.GlobalShadows 關閉時,不會有區別之間的區域被隱藏在天空中,或不被隱藏在天空中。 在這個情況下,OutdoorAmbient 將被忽略,Lighting.Ambient
如需更多影響照明顏色的屬性,請參閱 Lighting.ColorShift_Bottom 和 Lighting.ColorShift_Top 。
Quality
ShadowSoftness
控制暗影的模糊程度。此屬性的值預設為 0.2。
此屬性僅當 Lighting.Technology 模式為 ShadowMap 或 Future 和裝置為ShadowMap 時才能工作。
Technology
決定渲染3D世界的照明系統。非腳本,只能在 Studio 中修改。請參閱 Enum.Technology 以取得可用選項,並在 LightingTechnology 中查看每個選項的詳細說明和視覺效果。
TimeOfDay
Class.Lighting 使用的 24 小時串代表當前時間。
注意,此屬性與實際的時間點不相等,並且在遊戲中不會改變,除非由指令碼變更。
Class.Lighting 時間使用量 Lighting.ClockTime 變更 Lighting.ClockTime 或使用 1> Class.Lighting:SetMinutesAfterMidnight()1> 也會變更此屬性。
使用 TimeOfDay 需要時間正常化和一個格式化的字串:
minutesAfterMidnight = 0while true dominutesAfterMidnight += 1local minutesNormalised = minutesAfterMidnight % (60 * 24)local seconds = minutesNormalised * 60local hours = string.format("%02.f", seconds//3600)local mins = string.format("%02.f", math.floor(seconds/60 - (hours*60)))local secs = string.format("%02.f", math.floor(seconds - hours*3600 - mins *60))local timeString = hours..":"..mins..":"..secsLighting.TimeOfDay = timeStringtask.wait()end
使用 Lighting.ClockTime 需要時間才能正常化:
minutesAfterMidnight = 0while true dominutesAfterMidnight += 1local minutesNormalised = minutesAfterMidnight % (60 * 24)local hours = minutesNormalised / 60Lighting.ClockTime = hourstask.wait()end
使用 Lighting:SetMinutesAfterMidnight() 不需要額外處理:
minutesAfterMidnight = 0while true dominutesAfterMidnight += 1Lighting:SetMinutesAfterMidnight(minutesAfterMidnight)task.wait()end
方法
GetMinutesAfterMidnight
返回午夜後剩下的時間數,以供照明。
這個數字將與 Lighting.ClockTime 乘以 60 相當。
這個數字不會總是與 Lighting:SetMinutesAfterMidnight() 中所提供的值相等,因為它會在當前日期的午夜後返回分鐘。
對於 Lighting 時間以字串格式設置,請參閱 Lighting.TimeOfDay。
返回
午夜後的時間數。
範例程式碼
local Lighting = game:GetService("Lighting")
Lighting.TimeOfDay = "14:00:00"
print(Lighting:GetMinutesAfterMidnight())
GetMoonDirection
返回 Vector3 代表月亮從位置 0, 0, 0 的方向。
注意,當月具有「設定」,並且不再可見時, Vector3 由此函數所返回的指向將繼續指向地圖下方的月亮。
開發人員想要變更月的位置應該使用 Lighting.ClockTime 或 Lighting.GeographicLatitude 屬性。
有一個變體此功能可以取得太陽的方向,Lighting:GetSunDirection()。
返回
範例程式碼
local Lighting = game:GetService("Lighting")
Lighting.TimeOfDay = "14:00:00"
print(Lighting:GetMoonDirection())
GetSunDirection
返回 Vector3 代表太陽從位置 0, 0, 0 的方向。
注意,當太陽設置為已設置,且不再可見時,這個函數的 Vector3 將繼續指向地圖下方的太陽。
開發人員想要變更太陽的位置應該使用 Lighting.ClockTime 或 Lighting.GeographicLatitude 屬性。
有一個變體此功能取得月的方向,Lighting:GetMoonDirection()。
返回
範例程式碼
local Lighting = game:GetService("Lighting")
Lighting.TimeOfDay = "14:00:00"
Lighting.GeographicLatitude = 41.73
print(Lighting:GetSunDirection())
SetMinutesAfterMidnight
設置 Lighting.TimeOfDay 和 Lighting.ClockTime 至指定的午夜後的指定數分鐘。
我如何可以做一個白天/夜晚指令碼?
SetMinutesAfterMidnight允許使用數值,例如在日/夜週期Script中,無需將其轉換為格式為 Lighting.TimeOfDay 所需的字串。它還允許超過 24 小時的值,與之對應的時間在下一天。請參閱下面的代碼示例。
使用 Lighting.TimeOfDay 需要時間正常化,並且格式化為字串:
minutesAfterMidnight = 0while true dominutesAfterMidnight += 1local minutesNormalised = minutesAfterMidnight % (60 * 24)local seconds = minutesNormalised * 60local hours = string.format("%02.f", seconds // 3600)local mins = string.format("%02.f", math.floor(seconds / 60 - (hours * 60)))local secs = string.format("%02.f", math.floor(seconds - hours * 3600 - mins * 60))local timeString = hours .. ":" .. mins .. ":" .. secsLighting.TimeOfDay = timeStringtask.wait()end
使用 Lighting.ClockTime 需要時間才能正常化:
minutesAfterMidnight = 0while true dominutesAfterMidnight += 1local minutesNormalised = minutesAfterMidnight % (60 * 24)local hours = minutesNormalised / 60Lighting.ClockTime = hourstask.wait()end
使用 Lighting:SetMinutesAfterMidnight() 不需要額外處理:
minutesAfterMidnight = 0while true dominutesAfterMidnight += 1Lighting:SetMinutesAfterMidnight(minutesAfterMidnight)task.wait()end
參數
午夜後的時間數。
返回
範例程式碼
local Lighting = game:GetService("Lighting")
Lighting:SetMinutesAfterMidnight(840)
活動
LightingChanged
此事件發生,當 Lighting 屬性發生變更或 Sky 添加或移除時。
雖然此事件發生,當 Lighting 的大部分屬性變更時,開發人員應該注意到幾個例外:
- 變更 Lighting.GlobalShadows 將不會發射此事件
- Class.Lighting.FogColor 、Lighting.FogStart 和 Lighting.FogEnd 將不會發射此事件
當不需要此行為時,可以使用 Object.Changed 事件或 Object:GetPropertyChangedSignal() 函數。
參數
範例程式碼
local Lighting = game:GetService("Lighting")
local function onLightingChanged(skyboxChanged)
if skyboxChanged then
print("Skybox has changed")
else
print("The skybox did not change.")
end
end
Lighting.LightingChanged:Connect(onLightingChanged)