2016-06-10 80 views
0

我通過基於距離光源的距離改變顏色,在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

你的代碼運行速度慢是因爲RenderStepped事件運行,每幀渲染的原因,這是(通常)第二的每1/60。嘗試使用Stepped事件來提高性能,因爲它只會觸發1/30秒。

至於你的光源互相取消,它看起來從你的代碼看,每個光源影響它周圍的瓷磚沒有檢查什麼光源影響瓷磚之前。

例如,光源A有一個lightFact的影響了瓷磚A,因此瓷磚A改變了它的外觀。然後,稍後在環路中的光源B具有lightFact的。那麼,該瓦片的最終lightFact值將爲32,從而有效抵消初始光源效應。

爲了解決此問題,您需要在循環中存儲當前的每個tile的lightFact變量。我的建議(唉,也許不是最快)將創建一個新的InstanceIntValue內每個瓷磚,存儲當前影響lightFact瓷磚值。然後,無論何時光源要檢查磁貼,請檢查它是否有小孩lightFact,如果有,請將該值添加到代碼中的lightFact值。因此,您用於應用到平鋪的lightFact值不會取消最後一個光源,因爲它在其自身的計算中包含了其他光源lightFact值。合理?