为啥 For 循环返回“尝试获取 Vector3 值的长度”

Posted

技术标签:

【中文标题】为啥 For 循环返回“尝试获取 Vector3 值的长度”【英文标题】:Why Does A For Loop Return "attempt to get length of a Vector3 value"为什么 For 循环返回“尝试获取 Vector3 值的长度” 【发布时间】:2021-09-13 22:20:43 【问题描述】:

我不知道这段代码有什么问题,它的字面意思是完美的 for 循环正在尝试获取 vector3 值。

local locations = 
local Players = game:GetService("Players")

local function SplitString(String)

    local CurrentString = ""
    local x = 1

    for i = 1, #String do

        local FullString = string.sub(String,1,i)
        local Character = string.sub(String,i,i)
        local CurrentString = string.sub(String, x, i)
        print(locations[1])

        if Character == "," then
            CurrentString = string.sub(String,x,i-1)
            table.insert(locations,CurrentString)
            x = i + 1
            CurrentString = string.sub(String, x , i)
            print(locations)
        end

        --Add the character to the string.
        if Character == " " then
            x = i + 1
            CurrentString = string.sub(String, x, i + 1)
        end
        if #FullString + 1 == #String then
            table.insert(locations, CurrentString)
        end
    end
end



Players.PlayerAdded:Connect(function(player)
    player.CharacterAdded:Connect(function(char)
        local humanoidrootpart = char:WaitForChild("HumanoidRootPart")
        
        wait(5)
        
        while humanoidrootpart do
            local location = humanoidrootpart.position
            print(location)
            
            SplitString(location)
            print(locations[1])
            
            local RoundLocatX = math.floor(locations[1]*50)/50
            local RoundLocatZ = math.floor(locations[3]*50)/50
            local RoundLocatXLength = RoundLocatX.length
            local RoundLocatZLength = RoundLocatZ.length
            
            
            if RoundLocatX > 50 then
                print('hi')
            end
            wait(1)
        end
    end)
end)

这是错误:

ServerScriptService.Terrain Generation:9: attempt to get length of a Vector3 value

我会在 roblox 论坛上发布这个,但他们很愚蠢,需要一些愚蠢的阅读时间才能在上面发布。

【问题讨论】:

【参考方案1】:

你的错误指向这一行:

for i = 1, #String do

并说您正在尝试获取 Vector3 对象的长度。这意味着#String 没有按预期工作。所以看看你传递给SplitString函数的对象......

        local location = humanoidrootpart.position
        print(location)
        SplitString(location)

您的 location 变量是 Vector3,而不是字符串,并且它不支持长度运算符 #

但是您不必将其解析为字符串即可从中获取值。由于它是Vector3,因此您可以简单地索引其中的不同值。

        local location = humanoidrootpart.Position
        
        local RoundLocatX = math.floor(location.X * 50) / 50
        local RoundLocatZ = math.floor(location.Z * 50) / 50

【讨论】:

如何索引其中的值? 将我的最后一个代码块与您的原始代码进行比较。 location 不是从数组中索引值,而是一个对象,其值存储在索引 XYZ

以上是关于为啥 For 循环返回“尝试获取 Vector3 值的长度”的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 For 循环在 EJS 节点 js 中只返回一个值?

java for循环 判断条件为空时 构造方法为啥不需要返回值

为啥 for 循环不遍历列表中的每个项目?

为啥我在这个 for 循环中无法读取未定义的属性“startsWith”?

为啥我的 for 循环只读取我创建的数组的最后一个元素? [复制]

for循环提交ajax,为啥只有第一次能够提交,后面的循环都没有提交到后台,但是for执行完了?急急急!