表字段中的变量名称不起作用

时间:2013-03-31 14:48:58

标签: lua roblox lua-table

我在为游戏编写代码时遇到了一个问题。似乎我不能在像;

这样的语句中使用变量
local Username = "Cranavvo"
game.Players.Username:BreakJoints() -- Kills the player

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

4 个答案:

答案 0 :(得分:8)

来自Lua PiL on tables

  

要表示记录,请使用字段名称作为索引。 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(请注意,"本地" 声明)