Lighting

顯示已棄用項目

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

無法建立
服務

照明 服務在體驗中控制全球照明。它包括一系列可調整的屬性,您可以使用它們來變更照明在不同對象上的外觀和交互方式,如在 照明屬性 中所述。

照明 也可能包含 Atmosphere 對象來渲染實際的大氣效果,包括粒子密度、霧、閃光和顏色。請參閱 大氣效果 了解詳情。

此外, 照明 (包括Workspace.CurrentCamera ) 可能包含 post-processing 效果,例如SunRaysEffect 和1>Class.BlurEffect1>。請參閱4> post-processing 效果4> 了解更多資訊。

範例程式碼

Day/Night Cycle

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

概要

屬性

方法

活動

屬性

Ambient

平行讀取

適用於從天空中隱藏的區域,例如室內區域。

此屬性預設為 0, 0, 0 (黑色).

只要這個屬性的紅、綠、和藍頻道不超過 Lighting.OutdoorAmbient 的相應頻道,改變顏色將被保留以區域隱藏在太陽/月亮之外。有效的 <

注意,當 Lighting.GlobalShadows 關閉時,不會有區別之間的區域被遮蔽和不被遮蔽的區域。 在這個情況下 Lighting.OutdoorAmbient 將被忽略,顏色將在環境屬性中適用。

如需更多影響照明顏色的屬性,請參閱 Lighting.ColorShiftBottomLighting.ColorShiftTop

Brightness

平行讀取

這個空間方的照明強度。

變更此值將影響地圖的照明。當光源的亮度設為0時,沒有因為 Lighting.ColorShift_TopLighting.ColorShift_Bottom 而造成的效果。注意,這個光源沒有影響創建由 Lighting.GlobalShadows ��

這個屬性未錨定,效果會在 0 和 2 之間壓縮。意味著將亮度設為 10 與將它設為 2 無大小。

注意,Lighting.AmbientLighting.OutdoorAmbient 也可以用來影響地方的光澤。例如,將 Lighting.OutdoorAmbient 設置為 255、255、255 會使地方看起來比

ClockTime

未複製
平行讀取

一個數量代表(以小時)當前時間的日用 Lighting

注意,此屬性與實際的時間點不相等,並且在遊戲中不會改變,除非由指令碼變更。

為了測量 Lighting 時間的格式,使用 Lighting.CurrentTime 。改變 Lighting.CurrentTime 或使用 1> Class.Lighting:SetMinutesAfterMidnight()1> 也會改變此屬性。

使用 ClockTime 需要時間進行正常化:


minutesAfterMidnight = 0
while true do
minutesAfterMidnight += 1
local minutesNormalised = minutesAfterMidnight % (60 * 24)
local hours = minutesNormalised / 60
Lighting.ClockTime = hours
task.wait()
end

使用 Lighting.TimeOfDay 需要時間正常化,並且格式化為字串:


minutesAfterMidnight = 0
while true do
minutesAfterMidnight += 1
local minutesNormalised = minutesAfterMidnight % (60 * 24)
local seconds = minutesNormalised * 60
local 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..":"..secs
Lighting.TimeOfDay = timeString
task.wait()
end

使用 Lighting:SetMinutesAfterMidnight() 不需要額外處理:


minutesAfterMidnight = 0
while true do
minutesAfterMidnight += 1
Lighting: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.AmbientLighting.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.AmbientLighting.OutdoorAmbient 屬性相似,但它是動態的,可以根據天空和時間的日落改變。當這屬性增加時, Ambient 和 OutdoorAmbient 相應減少。

這也會讓天空盒子在夜間顯示。

EnvironmentSpecularScale

平行讀取

環境中的反射光。 此屬性的值預設為 0。

它會使平滑的物體反射環境。 特別重要以使金屬更具實際感。

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 的技術是 Legacy
Lighting.Technology = Enum.Technology.Legacy
Lighting.ExposureCompensation = 5

FogColor

平行讀取

Fog 屬性隱藏在 Lighting 包含 Atmosphere 對物件時。

一個 Color3 值,給出 Lighting 霧的顏色。

霧如何工作?

Roblox 中的霧在平面上與 Workspace.CurrentCamera 方向平行顯示。它會在 Lighting.FogStart 屬性之間漸漸消失,直到 Lighting.FogEnd 屬性,在這裡它是完全不可見的。霧的效果是它會與霧顏色結

在距離大於 Lighting.FogEnd 的距離,顏色將完全由 FogColor 決定。但在距離 Lighting.FogStartLighting.FogEnd 之間的距離,顏色所涂抹的程度取決於位置。

Roblox 的霧使用線性 interpolation 在 Lighting.FogStartLighting.FogEnd 之間。這意味著如果 Lighting.FogStart


local Lighting = game:GetService("Lighting")
-- fog will fade between 25 and 200 studs
Lighting.FogStart = 25
Lighting.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 studs
Lighting.FogStart = 25
Lighting.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 studs
Lighting.FogStart = 25
Lighting.FogEnd = 200

Lighting.FogColor 可以調整霧的顏色。

注意,霧不會遮蔽天窗。

GeographicLatitude

平行讀取

場景的地理位置,以度計,影響「Class.Lighting」時間在太陽和月的位置。

計算太陽的位置時,地球的傾斜也會被考帳號。

變更地理位置將會改變每個 Lighting.TimeOfDay 的太陽位置。發展人員尋求獲得太陽或月的位置,應該使用 Lighting:GetSunDirection()Lighting:GetMoonDirection()

範例程式碼

Sun direction

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 指南查看。

無法建立指令碼
平行讀取

OutdoorAmbient

平行讀取

適用於戶外區域的照明顏色。

此屬性預設為 127、127、127。

Class.Lighting.Ambient 的紅、綠、和藍頻道Lighting.Ambient,燈光在戶外區域的

注意,當 Lighting.GlobalShadows 關閉時,不會有區別之間的區域被隱藏在天空中,或不被隱藏在天空中。 在這個情況下,OutdoorAmbient 將被忽略,Lighting.Ambient

如需更多影響照明顏色的屬性,請參閱 Lighting.ColorShift_BottomLighting.ColorShift_Top

無法建立指令碼
平行讀取

ShadowSoftness

平行讀取

控制暗影的模糊程度。此屬性的值預設為 0.2。

此屬性僅當 Lighting.Technology 模式為 ShadowMapFuture 和裝置為ShadowMap 時才能工作。

Technology

平行讀取
Roblox 指令碼安全性

決定渲染3D世界的照明系統。非腳本,只能在 Studio 中修改。請參閱 Enum.Technology 以取得可用選項,並在 LightingTechnology 中查看每個選項的詳細說明和視覺效果。

TimeOfDay

平行讀取

Class.Lighting 使用的 24 小時串代表當前時間。

注意,此屬性與實際的時間點不相等,並且在遊戲中不會改變,除非由指令碼變更。

Class.Lighting 時間使用量 Lighting.ClockTime 變更 Lighting.ClockTime 或使用 1> Class.Lighting:SetMinutesAfterMidnight()1> 也會變更此屬性。

使用 TimeOfDay 需要時間正常化和一個格式化的字串:


minutesAfterMidnight = 0
while true do
minutesAfterMidnight += 1
local minutesNormalised = minutesAfterMidnight % (60 * 24)
local seconds = minutesNormalised * 60
local 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..":"..secs
Lighting.TimeOfDay = timeString
task.wait()
end

使用 Lighting.ClockTime 需要時間才能正常化:


minutesAfterMidnight = 0
while true do
minutesAfterMidnight += 1
local minutesNormalised = minutesAfterMidnight % (60 * 24)
local hours = minutesNormalised / 60
Lighting.ClockTime = hours
task.wait()
end

使用 Lighting:SetMinutesAfterMidnight() 不需要額外處理:


minutesAfterMidnight = 0
while true do
minutesAfterMidnight += 1
Lighting:SetMinutesAfterMidnight(minutesAfterMidnight)
task.wait()
end

方法

GetMinutesAfterMidnight

平行寫入

返回午夜後剩下的時間數,以供照明。

這個數字將與 Lighting.ClockTime 乘以 60 相當。

這個數字不會總是與 Lighting:SetMinutesAfterMidnight() 中所提供的值相等,因為它會在當前日期的午夜後返回分鐘。

對於 Lighting 時間以字串格式設置,請參閱 Lighting.TimeOfDay


返回

午夜後的時間數。

範例程式碼

Lighting:GetMinutesAfterMidnight

local Lighting = game:GetService("Lighting")
Lighting.TimeOfDay = "14:00:00"
print(Lighting:GetMinutesAfterMidnight())

GetMoonDirection

平行寫入

返回 Vector3 代表月亮從位置 0, 0, 0 的方向。

注意,當月具有「設定」,並且不再可見時, Vector3 由此函數所返回的指向將繼續指向地圖下方的月亮。

開發人員想要變更月的位置應該使用 Lighting.ClockTimeLighting.GeographicLatitude 屬性。

有一個變體此功能可以取得太陽的方向,Lighting:GetSunDirection()


返回

Vector3 代表月亮的方向從位置 0, 0, 0。

範例程式碼

Lighting:GetMoonDirection

local Lighting = game:GetService("Lighting")
Lighting.TimeOfDay = "14:00:00"
print(Lighting:GetMoonDirection())

GetMoonPhase

返回月亮的當前階段。沒有方法可以變更月亮的階段,因此這將永遠返回 0.75。


返回

GetSunDirection

平行寫入

返回 Vector3 代表太陽從位置 0, 0, 0 的方向。

注意,當太陽設置為已設置,且不再可見時,這個函數的 Vector3 將繼續指向地圖下方的太陽。

開發人員想要變更太陽的位置應該使用 Lighting.ClockTimeLighting.GeographicLatitude 屬性。

有一個變體此功能取得月的方向,Lighting:GetMoonDirection()


返回

Vector3 代表從位置 0, 0, 0 到太陽的方向。

範例程式碼

Lighting:GetSunDirection

local Lighting = game:GetService("Lighting")
Lighting.TimeOfDay = "14:00:00"
Lighting.GeographicLatitude = 41.73
print(Lighting:GetSunDirection())

SetMinutesAfterMidnight

void

設置 Lighting.TimeOfDayLighting.ClockTime 至指定的午夜後的指定數分鐘。

我如何可以做一個白天/夜晚指令碼?

SetMinutesAfterMidnight允許使用數值,例如在日/夜週期Script中,無需將其轉換為格式為 Lighting.TimeOfDay 所需的字串。它還允許超過 24 小時的值,與之對應的時間在下一天。請參閱下面的代碼示例。

使用 Lighting.TimeOfDay 需要時間正常化,並且格式化為字串:


minutesAfterMidnight = 0
while true do
minutesAfterMidnight += 1
local minutesNormalised = minutesAfterMidnight % (60 * 24)
local seconds = minutesNormalised * 60
local 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 .. ":" .. secs
Lighting.TimeOfDay = timeString
task.wait()
end

使用 Lighting.ClockTime 需要時間才能正常化:


minutesAfterMidnight = 0
while true do
minutesAfterMidnight += 1
local minutesNormalised = minutesAfterMidnight % (60 * 24)
local hours = minutesNormalised / 60
Lighting.ClockTime = hours
task.wait()
end

使用 Lighting:SetMinutesAfterMidnight() 不需要額外處理:


minutesAfterMidnight = 0
while true do
minutesAfterMidnight += 1
Lighting:SetMinutesAfterMidnight(minutesAfterMidnight)
task.wait()
end

參數

minutes: number

午夜後的時間數。


返回

void

範例程式碼

Setting Lighting Time

local Lighting = game:GetService("Lighting")
Lighting:SetMinutesAfterMidnight(840)

活動

LightingChanged

此事件發生,當 Lighting 屬性發生變更或 Sky 添加或移除時。

雖然此事件發生,當 Lighting 的大部分屬性變更時,開發人員應該注意到幾個例外:

當不需要此行為時,可以使用 Object.Changed 事件或 Object:GetPropertyChangedSignal() 函數。

參數

skyChanged: bool

範例程式碼

Lighting.LightingChanged

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)