照明服务在体验中控制全球照明。它包括一系列可用的属性,您可以使用它们来改变照明的外观和与其他对象交互方式,如在照明属性中所示。
照明 也可能包含一个 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 中,雾将完全不透明。
从 Workspace.CurrentCamera 的深度,在 studs 开始显示的雾。
场景的地理坐标,以度数表示,影响“Class.Lighting”时间在太阳和月的位置的结果。
切换基于体素的动态照明对游戏。
户外区域的照明颜色。
控制暗影的模糊程度。
确定照明系统以渲染 3D 世界。 不可脚本。
Lighting 使用的 24 小时代表当前时间的表示。
方法
返回午夜后剩余的时间,用于照明。
返回一个 Vector3 代表月从位置 0, 0, 0 的方向。
返回月亮的当前阶段。
返回一个 Vector3 代表从0, 0, 0的位置表示太阳方向的方向。
将 Lighting.TimeOfDay 设置为每个时区提供给予定的时间后的时间。 将 Lighting.ClockTime 设置为每个时区提供给予定的时间后的时间。
活动
属性
Ambient
适用于从天空中隐藏的区域,例如室内区域。
此属性默认为 0, 0, 0 (黑色).
只要这个属性的红色、绿色和蓝色通道不超过Lighting.OutdoorAmbient的相应通道,改变色调将为受到阳光/月亮影响的区域保留。 实际Lighting.OutdoorAmbient
注意,当 Lighting.GlobalShadows 被禁用时,不会有区域被隐藏和不被隐藏之间的区域。在此情况下,Lighting.OutdoorAmbient 将被忽略,室外环境属性的颜色将在所有地方都适用。
了解有关影响照明颜色的其他属性,请参阅Lighting.ColorShiftBottom 和Lighting.ColorShiftTop 。
Brightness
场景中的照明强度。
改变此值会影响地图照明的影响。当亮度设置为 0 时,因为 Lighting.ColorShift_Top 或 Lighting.ColorShift_Bottom 为灯源没有效果,因此不会影响创建的阴影。注意,这不会影响由 Lighting.GlobalShadows
当这个属性未设定时,效果将在 0 和 2 之间 clamped 。 意味着将亮度设置为 10 与将其设置为 2 无异。
注意, Lighting.Ambient 和 Lighting.OutdoorAmbient 也可以用来影响地方的亮度。例如,将 Lighting.OutdoorAmbient 设置为 255、255、255 会使地方看起来更亮 than 其默认值
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 的底表面。当太阳位于直接1>Class.BasePart1> 的头顶时,色调变化将仅适用于4>Class.BasePart4> 的底表面。
此效果可以通过改变 Lighting.Brightness 来提高或降低。
ColorShift_Bottom 会影响相反的表面 Lighting.ColorShift_Top
注意,Lighting.ColorShift_Top 和 ColorShift_Bottom 会与 Lighting.Ambient 和 Lighting.OutdoorAmbient 属性如果它们大于 0, 0, 0 影响 ColorShift_Bottom 的影响可能很难确定。还需
ColorShift_Top
代表从太阳或月亮面反射的光色。
Class.BasePart 的表面受到 ColorShift_Top 的影响受到颜色变化的位置和方向。当太阳或月的位置直接与BasePart 相对时,颜色变化只适用于表面上。当太阳直接与BasePart 相对时,颜色变化只适用于表面上。
此效果可以通过改变 Lighting.Brightness 来提高或降低。
尽管 ColorShift_Top 会影响暴露在光下的表面, Lighting.ColorShift_Bottom 会影响受到光的表面。
注意,ColorShift_Top 和 ColorShift_Bottom 将与 Lighting.Ambient 和 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
您可以使用此属性来调整在色图步骤之前的曝光量,以显示更多细节在更暗或更浅的区域。这是我们移动到HDR管道的过程中所需的。
当 Lighting.Technology 设置为 Legacy 时,此属性无效。
local Lighting = game:GetService("Lighting")-- ExposureCompensation 没有效果,因为Lighting的技术是遗产Lighting.Technology = Enum.Technology.LegacyLighting.ExposureCompensation = 5
FogColor
当Lighting包含一个 Atmosphere 对象时,雾属性隐藏。
如何使雾工作?
Roblox 中的雾在与 Workspace.CurrentCamera 方向平行显示。它在 Lighting.FogStart 属性之间渐变不见,直到 Lighting.FogEnd 属性,在其全部不透明。雾的效果是它与雾颜色结合。
在距离大于 Lighting.FogEnd 的距离,颜色将全部由 Lighting.FogStart 和 Lighting.FogEnd 决定。 但在距离 1> Class.Lighting.FogStart1> 和 4> Class.Lighting.FogEnd4> 之间的距离上,颜色的度合成取决于位置。
Roblox 的雾使用线性 interpolation 在 Lighting.FogStart 和 Lighting.FogEnd 之间。这意味着如果 Lighting.FogStart 是 10
local Lighting = game:GetService("Lighting")-- fog will fade between 25 and 200 studsLighting.FogStart = 25Lighting.FogEnd = 200
注意,雾不会遮蔽天窗。
FogEnd
当Lighting包含一个 Atmosphere 对象时,雾属性隐藏。
从 Workspace.CurrentCamera 的深度,在 studs 中,雾将完全不透明。
如何使雾工作?
Roblox 中的雾在与 Workspace.CurrentCamera 的外观方向平行显示。它在 Lighting.FogStart 属性之间渐变不见,直到 FogEnd 属性上,它完全不透明。雾的效果是它与颜色合成在 Lighting.FogColor 。
在 FogEnd 之外的距离,颜色将完全由 Lighting.FogColor 决定。 但在 Lighting.FogStart 和 FogEnd 之间的距离,色度与颜色是否会被淡出取决于位置。
Roblox 的雾使用线性 interpolation 在 Lighting.FogStart 和 FogEnd 之间。这意味着如果 Lighting.FogStart 是 10 和 FogEnd 是 20 ,在 15 格距离上,雾会在 50%。 这意味着在 15 格
local Lighting = game:GetService("Lighting")-- fog will fade between 25 and 200 studsLighting.FogStart = 25Lighting.FogEnd = 200
雾的颜色可以调整使用 Lighting.FogColor 。
注意,雾不会遮蔽天窗。
FogStart
当Lighting包含一个 Atmosphere 对象时,雾属性隐藏。
从 Workspace.CurrentCamera 的深度,在 studs 开始显示的雾。
如何使雾工作?
Roblox 中的雾在与 Workspace.CurrentCamera 的外观方向垂直显示。它在 Lighting.FogEnd 不可见的 FogStart 属性之间渐变。效果是将颜色渐变为 Lighting.FogColor 。雾的效果是它与 1> Class.Lighting.FogColor1>
在距离大于 Lighting.FogEnd 的距离,颜色将全部由 Lighting.FogColor 决定。 但在 FogStart 和 Lighting.FogEnd 之间的距离上,颜色的渐变程度取决于位置。
Roblox 的雾使用线性 interpolation 在 FogStart 和 Lighting.FogEnd 之间。 这意味着如果 FogStart 是 10 和 Lighting.FogEnd 是 20 ,在 15 英里的距离 雾会在 50% 的颜色。 这意味着
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 设置时会注意到,禁用它会使场景显着黑暗。因为当 GlobalShadows 被禁用时 Lighting.Ambient 是用于计算照明色度在室内和室外空间中都是相同的。当黑暗解决为 Lighting.Ambient 时,通过将
在大多数情况下,开发人员建议将GlobalShadows设置为启用,因为它的视外观效果优于其他选项。请参阅照明属性指南获取比较。
Intent
OutdoorAmbient
户外区域的照明颜色。
此属性默认为 127、127、127。
只要 Lighting.Ambient 的红色、绿色和蓝色通道不超过此属性中的相应通道,室外照明的色调就会由此属性确定。 户外Ambient 值的上
注意,当 Lighting.GlobalShadows 被禁用时,天空中的区域和不在天空中的区域之间没有区分。 在这种情况下,OutdoorAmbient 将被忽略,天色属性将在所有地方都应用。
了解有关影响照明颜色的其他属性,请参阅Lighting.ColorShift_Bottom 和Lighting.ColorShift_Top 。
Quality
ShadowSoftness
控制暗影的模糊程度。该属性的默认值为 0.2。
此属性仅在 Lighting.Technology 模式是 ShadowMap 或 Future 和设备是否支持 ShadowMap 时工作。
Technology
确定照明系统以渲染3D世界。不可脚本,仅在Studio中修改。请参阅Enum.Technology获取可用选项,并在Lighting Technology中查看详细描述和视觉效果。
TimeOfDay
Lighting 使用的 24 小时代表当前时间的表示。
注意,该属性不会与实际的时间相对应,在游戏期间不会改变,除非通过脚本更改。
对于数量的 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 的方向。
注意,当月亮具有“set”并且不再可见时,这个函数的返回将继续指向地图下的月亮。
开发人员想要改变月球的位置应该使用 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 设置为每个时区提供给予定的时间后的时间。
我如何才能做一个白天/夜晚脚本?
设置分钟后午夜允许使用数量值,例如在一天/夜周期 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
这个事件发生 when a Lighting 属性改变或Sky 添加或移除 从 Lighting 。
尽管此事件在大多数 Lighting 属性发生变更时触发,但开发人员应该意识到几个例外:
- 改变 Lighting.GlobalShadows 将不会触发此事件
在不希望此行为的情况下,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)