lua - 我在 Roblox Lua 脚本中遇到问题。我想编写脚本,以便在死亡时保存库存。有小费吗?
问题描述
我想编写一个脚本,这样当玩家死亡时,库存中的东西就不会消失。这是我当前的脚本,有关如何完成此操作的任何指示或提示?我已经将它编写为本地和服务器脚本,它在工作区中,仍然没有运气
local Inventory = {}
local function Spawned(Char)
local Plr = game.Players:GetPlayerFromCharacter(Char)
for i,v in pairs(Inventory[Plr]) do
if Plr['Backpack']:findFirstChild(v.Name) then
Plr['Backpack'][v.Name]:Destroy()
end
v.Parent = Plr['Backpack']
end
Inventory[Plr] = {}
Char:WaitForChild('Humanoid').Died:connect(function()
for i,v in pairs({Plr['Backpack'], Char}) do
for ii,vv in pairs(v:GetChildren()) do
if vv:IsA('Tool') then
table.insert(Inventory[Plr], vv:Clone())
vv:Destroy()
end
end
end
end)
end
game.Players.PlayerAdded:connect(function(Plr)
Inventory[Plr] = {}
local Char = Plr.Character or Plr.CharacterAdded:wait()
Spawned(Char)
Plr.CharacterAdded:connect(Spawned)
end)
解决方案
有几种不同的方式可以存储玩家库存。我将在下面展示一对,以便您看到它们。
1. 将武器存放在 StarterGear 中
正如 Coordinate Newton 所说,一旦玩家购买了武器而不是只将其放在背包中,您还可以将其放入他们的 .StarterGear 文件夹中,这意味着每次他们生成工具时都会自动将其放入新背包中。这很简单,因为您只需要将武器克隆到:
game.Players.LocalPlayer.StarterGear
以及玩家的背包。您在评论中提到您已经尝试过此方法,但它没有用,但恐怕我想不出它不能正常工作的原因。
2. 使用 IntValue 作为全局变量
如果不能使用,那么另一种方法是在每次购买武器时创建一个新的 IntValue 实例,如果武器被移除,则将其销毁。如果您将 IntValue 命名为玩家拥有的武器的名称,那么您可以使用代码在复制存储中查找该武器(如果它存储在那里)。
例如,如果将以下代码放入本地脚本,将创建一个文件夹来存储 IntValues,然后每次玩家重生时,代码将运行所有这些 IntValues,获取名称并将相应的武器放入玩家背包。
game.Players.LocalPlayer.CharacterAdded:Connect(function()
local Children = Storage:GetChildren()
if #Children > 0 then --If there are stored weapons
for _, child in pairs(Children) do
-- Below: Clone the weapon from Replicated Storage using the name from the IntValue
local WeaponClone = game.ReplicatedStorage:FindFirstChild(tostring(child.Name)):Clone()
WeaponClone.Parent = game.Players.LocalPlayer.Backpack
end
end
end)
local Storage = Instance.new("Folder") --Folder to store current weapons in
Storage.Name = "BoughtWeapons"
Storage.Parent = game.Player.LocalPlayer
我还创建了两个函数,您可以分别调用它们来创建和销毁 IntValue。
local function WeaponBought(WeaponName)
local WeaponSave = Instance.new("IntValue")
WeaponSave.Name = WeaponName
WeaponSave.Parent = game.Players.LocalPlayer.BoughtWeapons
end
local function WeaponRemoved(WeaponName)
game.Players.LocalPlayer.BoughtWeapons:FindFirstChild(WeaponName):Destroy()
end
您可以将这两个函数放在任何本地脚本中,它们不必与其他主代码一起使用。您需要做的就是将玩家拥有的武器的名称传递给函数,例如:
WeaponBought("GravityCoil")
这将在文件夹中创建一个名为“GravityCoil”的 IntValue,以在玩家重生时使用。这不像简单地使用 StarterGear 文件夹那么方便,但如果由于某种原因你不能那么这是一个很好的第二个选择。
这个解决方案的一个小问题是,它需要将武器存储在复制存储中,开发者可以很容易地获得它们而无需购买它们。不幸的是,这只是使用本地脚本执行此操作所带来的问题。
你的代码
我很确定您的代码无法按预期工作的原因是,据我所知,玩家的背包在 Humanoid.Died 触发时已经被清除,因此您将无法获得玩家拥有的武器列表。
我希望这对您尝试做的事情有所帮助,即使这不是您所要求的。
推荐阅读
- ionic-framework - 如何在具有 Cordova DatePicker 插件的浏览器中运行离子应用程序?
- jquery - iOS 的 JS 页面加载指示器
- java - Ant:从ant执行一个java程序并存储返回值
- solr - 在 SOLRCloud 中启用 LTR (solr version8.2)
- c++ - 在 C++ Lambda 表达式中,为什么人们更喜欢按值捕获而不是作为参数传递?
- c# - 字符串未被识别为有效的 DateTime
- java - 在 Weblogic 服务器中部署时,未加载新字体以使用动态报告生成 pdf
- c# - HTML.ActionLink 到详细信息页面不起作用
- c# - 如何在richTextBox 中添加图像?
- postgresql - 使用 JPA 调用原生 Postgresql 命令