4

我在为游戏编写一些代码时遇到了一个问题。看来我不能在如下语句中使用变量;

local Username = "Cranavvo"
game.Players.Username:BreakJoints() -- Kills the player

输出告诉我“没有像'用户名'这样的用户”应该是"Cranavvo"

4

4 回答 4

10

来自桌子上的 Lua PiL

要表示记录,您可以使用字段名称作为索引。Lua 通过a.namea["name"].

初学者的一个常见错误是a.xa[x]. 第一种形式表示a["x"],即由字符串 索引的表"x"

因此,当您尝试:

game.Players.Username:BreakJoints()

Lua 将其解释为:

game["Players"]["Username"]:BreakJoints()

这当然是错的。如果您想使用不同的名称作为表的索引,请像这样使用它们:

local foo = "Cranavvo"
game.Players[foo]:BreakJoints()

但要提到的是,Player类没有BreakJoints方法,您必须借助.Character属性获取角色模型,如下所示:

local foo = "Cranavvo"
game.Players[foo].Character:BreakJoints()

还需要提到的是,如果具有该名称的玩家不存在,则代码将中断,并且该字符可以为空,在这种情况下它也会中断。因此,您需要添加一些错误处理。像这样:

local foo = "Cranavvo"
local Player = game.Players:findFirstChild(foo)
if Player ~= nil and Player.Character ~= nil then
    Player.Character:BreakJoints()
end
于 2013-03-31T15:38:28.843 回答
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
于 2013-03-31T18:48:11.030 回答
1

在执行代码时仔细检查用户是否真的存在。

它也应该是:

game.Players.Username:BreakJoints()

编辑:

我误读了您想要做的事情:在

...Players.Username

lua 将Username解释为命名索引,并且不使用预先声明的 Username 变量。

如果要访问具有动态名称的数组变量,可以这样做:

game.Players[Username]:BreakJoints()

另外在 roblox 中,您可以使用以下内容:

game.Players:GetPlayerByID(userId):BreakJoints()
于 2013-03-31T14:53:18.273 回答
-1

变量有时在 Lua 中非常令人困惑。

例如,有全局变量和局部变量。

局部变量是操作结束后可以忘记/擦除的变量:local x = 2

全局变量是留在游戏/应用程序中不会被遗忘的变量,这对高分和其他整洁的东西很好。x = 2(注意没有“本地”声明)

于 2014-12-20T08:49:51.777 回答