我在为游戏编写代码时遇到了一个问题。似乎我不能在像;
这样的语句中使用变量local Username = "Cranavvo"
game.Players.Username:BreakJoints() -- Kills the player
输出告诉我“没有'用户名'这样的用户”应该是"Cranavvo"
。
答案 0 :(得分:8)
要表示记录,请使用字段名称作为索引。 Lua支持 通过提供
a.name
作为语法糖来表示 的a["name"]
强>初学者常犯的一个错误是将
a.x
与a[x]
混淆。首先 表单代表a["x"]
,即由字符串"x"
编制索引的表。
因此,当你尝试:
game.Players.Username:BreakJoints()
Lua将其解释为:
game["Players"]["Username"]:BreakJoints()
哪个是错的。如果要使用不同的名称作为表的索引,请使用它们:
local foo = "Cranavvo"
game.Players[foo]:BreakJoints()
但要提到的是,Player类没有BreakJoints方法,您必须借助model属性获取字符.Character :
local foo = "Cranavvo"
game.Players[foo].Character:BreakJoints()
另外要提到的是,如果具有该名称的播放器不存在,则代码将中断,并且该字符也可以为null,在这种情况下它也会中断。因此,您需要添加一些错误处理。像这样:
local foo = "Cranavvo"
local Player = game.Players:findFirstChild(foo)
if Player ~= nil and Player.Character ~= nil then
Player.Character:BreakJoints()
end
答案 1 :(得分:2)
在roblox中执行此操作的正确方法是:
local Username = "Cranavvo"
local p = game.Players:FindFirstChild(Username)
if(p ~= nil) then
if(p.Character ~= nil) then
p.Character:BreakJoints()
end
end
答案 2 :(得分:1)
在代码执行时仔细检查用户是否真的存在。
也应该是:
game.Players.Username:BreakJoints()
编辑:
我误读了你想做的事情: 在
...Players.Username
lua将用户名解释为命名索引,并且不使用事先声明的用户名变量。
如果要使用动态名称访问数组变量,可以这样做:
game.Players[Username]:BreakJoints()
另外在roblox中你可以使用以下内容:
game.Players:GetPlayerByID(userId):BreakJoints()
答案 3 :(得分:0)
有时,变量在Lua中非常混乱。
例如,有全局和本地变量。
本地变量是操作结束后可以忘记/删除的变量:local x = 2
全局变量是在游戏/应用程序中保持不变的变量,这对于高分和其他整洁的东西来说是好的。 x = 2
(请注意,"本地" 声明)