Lighting

显示已弃用

*此内容使用人工智能(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.OutdoorAmbient

注意,当 Lighting.GlobalShadows 被禁用时,不会有区域被隐藏和不被隐藏之间的区域。在此情况下,Lighting.OutdoorAmbient 将被忽略,室外环境属性的颜色将在所有地方都适用。

了解有关影响照明颜色的其他属性,请参阅Lighting.ColorShiftBottomLighting.ColorShiftTop

Brightness

读取并联

场景中的照明强度。

改变此值会影响地图照明的影响。当亮度设置为 0 时,因为 Lighting.ColorShift_TopLighting.ColorShift_Bottom 为灯源没有效果,因此不会影响创建的阴影。注意,这不会影响由 Lighting.GlobalShadows

当这个属性未设定时,效果将在 0 和 2 之间 clamped 。 意味着将亮度设置为 10 与将其设置为 2 无异。

注意, Lighting.AmbientLighting.OutdoorAmbient 也可以用来影响地方的亮度。例如,将 Lighting.OutdoorAmbient 设置为 255、255、255 会使地方看起来更亮 than 其默认值

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 的底表面。当太阳位于直接1>Class.BasePart1> 的头顶时,色调变化将仅适用于4>Class.BasePart4> 的底表面。

此效果可以通过改变 Lighting.Brightness 来提高或降低。

ColorShift_Bottom 会影响相反的表面 Lighting.ColorShift_Top

注意,Lighting.ColorShift_Top 和 ColorShift_Bottom 会与 Lighting.AmbientLighting.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.AmbientLighting.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

您可以使用此属性来调整在色图步骤之前的曝光量,以显示更多细节在更暗或更浅的区域。这是我们移动到HDR管道的过程中所需的。

Lighting.Technology 设置为 Legacy 时,此属性无效。


local Lighting = game:GetService("Lighting")
-- ExposureCompensation 没有效果,因为Lighting的技术是遗产
Lighting.Technology = Enum.Technology.Legacy
Lighting.ExposureCompensation = 5

FogColor

读取并联

当Lighting包含一个 Atmosphere 对象时,雾属性隐藏。

一个 Color3 值,为雾 Lighting 提供色调。

如何使雾工作?

Roblox 中的雾在与 Workspace.CurrentCamera 方向平行显示。它在 Lighting.FogStart 属性之间渐变不见,直到 Lighting.FogEnd 属性,在其全部不透明。雾的效果是它与雾颜色结合。

在距离大于 Lighting.FogEnd 的距离,颜色将全部由 Lighting.FogStartLighting.FogEnd 决定。 但在距离 1> Class.Lighting.FogStart1> 和 4> Class.Lighting.FogEnd4> 之间的距离上,颜色的度合成取决于位置。

Roblox 的雾使用线性 interpolation 在 Lighting.FogStartLighting.FogEnd 之间。这意味着如果 Lighting.FogStart 是 10


local Lighting = game:GetService("Lighting")
-- fog will fade between 25 and 200 studs
Lighting.FogStart = 25
Lighting.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 studs
Lighting.FogStart = 25
Lighting.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 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 设置时会注意到,禁用它会使场景显着黑暗。因为当 GlobalShadows 被禁用时 Lighting.Ambient 是用于计算照明色度在室内和室外空间中都是相同的。当黑暗解决为 Lighting.Ambient 时,通过将

在大多数情况下,开发人员建议将GlobalShadows设置为启用,因为它的视外观效果优于其他选项。请参阅照明属性指南获取比较。

不可写入脚本
读取并联

OutdoorAmbient

读取并联

户外区域的照明颜色。

此属性默认为 127、127、127。

只要 Lighting.Ambient 的红色、绿色和蓝色通道不超过此属性中的相应通道,室外照明的色调就会由此属性确定。 户外Ambient 值的上

注意,当 Lighting.GlobalShadows 被禁用时,天空中的区域和不在天空中的区域之间没有区分。 在这种情况下,OutdoorAmbient 将被忽略,天色属性将在所有地方都应用。

了解有关影响照明颜色的其他属性,请参阅Lighting.ColorShift_BottomLighting.ColorShift_Top

不可写入脚本
读取并联

ShadowSoftness

读取并联

控制暗影的模糊程度。该属性的默认值为 0.2。

此属性仅在 Lighting.Technology 模式是 ShadowMapFuture 和设备是否支持 ShadowMap 时工作。

Technology

读取并联
Roblox 脚本安全性

确定照明系统以渲染3D世界。不可脚本,仅在Studio中修改。请参阅Enum.Technology获取可用选项,并在Lighting Technology中查看详细描述和视觉效果。

TimeOfDay

读取并联

Lighting 使用的 24 小时代表当前时间的表示。

注意,该属性不会与实际的时间相对应,在游戏期间不会改变,除非通过脚本更改。

对于数量的 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 的方向。

注意,当月亮具有“set”并且不再可见时,这个函数的返回将继续指向地图下的月亮。

开发人员想要改变月球的位置应该使用 Lighting.ClockTimeLighting.GeographicLatitude 属性。

有一个变体的此函数可用于获得太阳的方向,Lighting:GetSunDirection()


返回

Vector3 表示从位置 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 零的太阳方向。

代码示例

Lighting:GetSunDirection

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

SetMinutesAfterMidnight

void

Lighting.TimeOfDay 设置为每个时区提供给予定的时间后的时间。 将 Lighting.ClockTime 设置为每个时区提供给予定的时间后的时间。

我如何才能做一个白天/夜晚脚本?

设置分钟后午夜允许使用数量值,例如在一天/夜周期 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

这个事件发生 when a Lighting 属性改变或Sky 添加或移除 从 Lighting

尽管此事件在大多数 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)