基于图块的照明系统中的多个光源

时间:2016-06-10 14:51:30

标签: lua roblox

我在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

1 个答案:

答案 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值。有意义吗?