我已經在 Roblox 游戲上作業了大約三個星期,并且創造了一些我引以為豪的東西,但我有一個非常嚴重的錯誤,我似乎無法解決。我想讓游戲成為我將來可以添加的東西,所以我制作了一個程式來獎勵玩家殺死NPC的金幣和經驗值。我還制作了一個 GUI 欄來向玩家展示他們對下一個級別的進步。我的問題是金幣會出現,但 xp 不會。我已經嘗試了七十多次修復,我一直在用頭撞磚墻,但 xp 仍然不會出現在欄上,玩家也無法升級。
我的 xp bar 程式如下所示:
--Player related variables--
local player = game.Players.LocalPlayer
local level = player:WaitForChild("Level")
local current = level:WaitForChild("Current")
local max = level:WaitForChild("Max")
--UI related variables--
local gui = script.Parent
local exterior = gui:WaitForChild("Exterior")
local label = exterior:WaitForChild("Label")
local exp = exterior:WaitForChild("Exp")
local bar = exterior:WaitForChild("Bar")
--Change stats upon join--
label.Text = "Level "..level.Value
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
level.Changed:Connect(function(val, level)
label.Text = "Level "..level.Value
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
wait(1)
end)
current.Changed:Connect(function(val)
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
wait(1)
end)
我的獎勵計劃是這樣的:
local Humanoid = script.Parent.Humanoid
local Experience = 10
function Dead()
local tag = Humanoid:FindFirstChild("creator")
if tag ~= nil then
if tag.Value ~= nil then
local leaderstats = tag.Value:FindFirstChild("leaderstats")
if leaderstats ~= nil then
leaderstats.Cash.Value = leaderstats.Cash.Value 50
workspace.ServerScriptService.leaderstats.Current:Connect(function(Experience)
if leaderstats.Current.Value ~= nil then
leaderstats.Current.Value = leaderstats.Current.Value Experience
else leaderstats.Current.Value = 10
end
end)
wait(0.1)
script:Remove()
end
end
end
end
Humanoid.Died:Connect(Dead)
我還有一個像這樣的 leaderstats 代碼:
local DataStore = game:GetService("DataStoreService"):GetDataStore("butthole")
game.Players.PlayerAdded:Connect(function(player)
local folder = Instance.new("Folder")
folder.Name = "leaderstats"
folder.Parent = player
local cash = Instance.new("IntValue")
cash.Name = "Cash"
cash.Value = 900
cash.Parent = folder
--start
local level = Instance.new("IntValue", player)
level.Name = "Level"
level.Value = 1
local exp = Instance.new("IntValue", level)
exp.Name = "Current"
exp.Value = 0
local maxExp = Instance.new("IntValue", level)
maxExp.Name = "Max"
maxExp.Value = 100
exp.Changed:Connect(function(val)
if exp.Value >= maxExp.Value then
level.Value = level.Value 1
exp.Value = 0
maxExp.Value = maxExp.Value * 2.5
end
有些東西沒有正確地與其他東西交談,但我無法弄清楚那可能在哪里。我不是專業開發人員,我只是一個嘗試制作游戲的人。
uj5u.com熱心網友回復:
如果您想跳過說明,請滾動到底部
當前代碼中的錯誤:
主要問題是您的獎勵計劃中的這個片段:
workspace.ServerScriptService.leaderstats.Current:Connect(function(Experience)
if leaderstats.Current.Value ~= nil then
leaderstats.Current.Value = leaderstats.Current.Value Experience
else leaderstats.Current.Value = 10
end
end)
1:ServerScriptService 不在作業空間內
要訪問 ServerScriptService,請使用 game.ServerScriptService
2:“leaderstats.Current”不是事件......
leaderstats.Current不是事件,所以event:Connect(func)不起作用。像Current.Changed這樣的東西會被認為是一個事件
3:“當前”不在“leaderstats”中
根據您的leaderstats 代碼,Current 不在 leaderstats 內,而是在 level 內:player.Level.Current
盡管我指出了這些事情,但我們不會修復 1 和 2,因為它們是不必要的
4:額外的引數“level”導致沖突
最后一個錯誤發生在xp bar 腳本中:
level.Changed:Connect(function(val, level)
label.Text = "Level "..level.Value
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
end)
問題是代碼片段的第一行:第二個引數“級別”不存在。
該Changed事件只有1個引數是變更后的新的值(在這種情況下,是新的電平)。這意味著這val是您級別的數值。
只需從引數中洗掉“級別”即可解決此部分
解決方案:
獎勵腳本:
local Humanoid = script.Parent.Humanoid
local Experience = 10
function Dead()
local tag = Humanoid:FindFirstChild("creator")
if tag ~= nil then
local player = tag.Value -- making variable makes it easier to understand
if player then
local leaderstats = player:FindFirstChild("leaderstats")
local level = player:FindFirstChild("Level") -- "Current" is inside Level
if leaderstats and level then
leaderstats.Cash.Value = leaderstats.Cash.Value 50
level.Current.Value = level.Current.Value Experience --Simply add the EXP
script:Remove()
end
end
end
end
Humanoid.Died:Connect(Dead)
XP 欄腳本:
--Player related variables--
local player = game.Players.LocalPlayer
local level = player:WaitForChild("Level")
local current = level:WaitForChild("Current")
local max = level:WaitForChild("Max")
--UI related variables--
local gui = script.Parent
local exterior = gui:WaitForChild("Exterior")
local label = exterior:WaitForChild("Label")
local exp = exterior:WaitForChild("Exp")
local bar = exterior:WaitForChild("Bar")
--Change stats upon join--
label.Text = "Level "..level.Value
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
level.Changed:Connect(function(val)
label.Text = "Level "..level.Value
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
end)
current.Changed:Connect(function(val)
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
end)
補充說明
1:處理額外的XP
當一個人獲得足夠的 XP 來升級時,XP 被設定為 0,級別上升 1。然而,這意味著所有額外的 XP 都沒有用處。我已經更改了功能以解決額外的 XP。
leaderstats 腳本(替換您當前的exp.Changed功能):
exp.Changed:Connect(function(val)
if exp.Value >= maxExp.Value then
local newLevel = level.Value
local newXP = exp.Value
local newMax = maxExp.Value
while newXP > newMax do
newLevel = newLevel 1
newXP = newXP - newMax
newMax = newMax * 2.5
end
maxExp.Value = newMax
exp.Value = newXP
level.Value = newLevel
end
end)
2:函式(非必需,但推薦)
創建一個函式來更新 UI 可以更輕松地進行以后的更改
XP Bar 腳本(下半場):
--Change stats upon join--
function updateUI()
label.Text = "Level ".. level.Value
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
end
updateUI()
level.Changed:Connect(updateUI)
current.Changed:Connect(updateUI)
uj5u.com熱心網友回復:
在聽取了 kojocrash 的建議后,酒吧現在終于可以作業了:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/376257.html
上一篇:說明:獲取之前的狀態
