我在ROBLOX中通过根据光源距离改变颜色制作了一个基本的基于瓷砖的照明系统。我希望能够放置多个光源,但我遇到了一些问题:
当我尝试添加另一个光源时,性能会下降一点(从完整的60到45-50)。
它无法正常工作,光源会切断光线等等。
我的代码:
local sp = script.Parent
local lightBrightness
local lightPower = 1
local grid = game.ReplicatedStorage.Folder:Clone()
grid.Parent = workspace.CurrentCamera
local lightSource = game.ReplicatedStorage.LightSource:Clone()
lightSource.Parent = workspace.CurrentCamera
lightSource.Position = grid:GetChildren()[math.random(1,#grid:GetChildren())].Position
for _, v in pairs(grid:GetChildren()) do
if v:IsA("Part") then
game["Run Service"].RenderStepped:connect(function()
local lightFact = (lightSource.Position-v.Position).magnitude
lightBrightness = lightPower - (lightFact*10)/255
if lightFact < 35 then
v.SurfaceGui.Frame.BackgroundColor3 = v.SurfaceGui.Frame.BackgroundColor3.r >= 0 and Color3.new((100/255)+lightBrightness*.85,(50/255)+lightBrightness*.85,10/255+lightBrightness) or Color3.new(0,0,0)
elseif lightFact > 35 and lightFact < 40 and v.SurfaceGui.Frame.BackgroundColor3.r > 0 then
v.SurfaceGui.Frame.BackgroundColor3 = Color3.new(0,0,0)
end
end)
end
end
答案 0 :(得分:0)
代码运行缓慢的原因是因为RenderStepped
事件每帧渲染都会运行,这通常是每1/60秒运行一次。尝试使用Stepped
事件来提高性能,因为它只会触发1/30秒。
对于你的光源相互抵消,从查看你的代码看,每个光源都会影响它周围的瓷砖,而不用检查之前影响瓷砖的光源。
例如,光源A有lightFact
37 影响拼贴A,因此拼贴A会改变它的外观。然后,稍后在循环中的光源B具有 32 的lightFact
。那么,该图块的最终lightFact
值将为32,有效地抵消了初始光源的影响。
为了解决此问题,您需要在循环过程中为每个磁贴存储当前lightFact
变量。我的建议(唉,可能不是最快的)是在每个图块内部创建一个新的Instance
IntValue
,在图块上存储当前影响lightFact
的值。然后,只要光源即将检查磁贴,检查它是否有子lightFact
,如果有,请将该值添加到代码中的lightFact
值。因此,您用于应用于图块的lightFact
值不会取消最后一个光源,因为它会在其自己的计算中合并其他光源lightFact
值。有意义吗?