如何连续执行 for 循环而不被困在一个重复的函数中?

我正在尝试运行一个函数来处理模型的所有子元素,但是这个函数本质上会无限循环,阻止调用 for 循环中的下一个项目,我需要更好的方法或解决方法。

主要代码:

local wave = workspace["Wave model"]
local move = require(script.Parent.moveModule)
local Players = game:GetService("Players")

Players.PlayerAdded:Connect(function()
    for _, child in ipairs(wave:GetChildren()) do
        move.moveUp(child)
        wait(math.random(0.1,0.3))
        print("exec")
    end
    print("executed")
end)

我调用的模块:

local functions = {}

function functions.callNext(part, which)
    if which == "up" then
        functions.moveUp(part)
    else
        functions.moveDown(part)
    end
end

function functions.moveUp(part)
    local Tween = game:GetService("TweenService")

    local Objective = {}
    Objective.Position = Vector3.new(part.Position.X, part.Position.Y + 10, part.Position.Z)

    local tweenInfo = TweenInfo.new(5)

    local tweenie = Tween:Create(part, tweenInfo, Objective)

    print("played")
    tweenie:Play()
    print("done")
    tweenie.Completed:Connect(function()
        print("Fcuk")
    end)
    wait(5)
    functions.callNext(part, "down")
end

function functions.moveDown(part)
    local Tween = game:GetService("TweenService")

    local Objective = {}
    Objective.Position = Vector3.new(part.Position.X, part.Position.Y - 10, part.Position.Z)

    local tweenInfo = TweenInfo.new(5)

    local tweenie = Tween:Create(part, tweenInfo, Objective)

    print("played")
    tweenie:Play()
    print("done")
    wait(5)
    functions.callNext(part, "up")
end

return functions

有什么想法吗?

点赞
用户10140659
用户10140659

你可以编辑主脚本,将 moveup() 函数在一个单独的线程中运行,方法如下:

local wave = workspace["Wave model"]
local move = require(script.Parent.moveModule)
local Players = game:GetService("Players")

Players.PlayerAdded:Connect(function()
    for _, child in ipairs(wave:GetChildren()) do
        spawn(function() move.moveUp(child) end) -- 使用匿名函数,因为 spawn() 函数不接受带参数的函数
        wait(math.random(0.1,0.3))
        print("exec")
    end
    print("executed")
end)

这样可以运行,但从长远来看,不宜这样做,因为在多个线程上运行的无限循环如果未经过优化,会导致显著的延迟。

代码更改:

move.moveUp(child)

改为

spawn(function() move.moveUp(child) end)
2020-05-05 14:16:49
用户1296374
用户1296374

你没有无限循环,而是一个递归循环:模块中的函数相互调用,直到你的堆栈溢出。在不同的线程中开启它们将会使它们倍增。

我建议通过缓动函数的回调函数来触发你的方向改变,这样的方式使用了异步性:

local functions = {}

function functions.moveUp(part)
    local Tween = game:GetService("TweenService")

    local Objective = {}
    Objective.Position = Vector3.new(part.Position.X, part.Position.Y + 10, part.Position.Z)

    local tweenInfo = TweenInfo.new(5)

    local tweenie = Tween:Create(part, tweenInfo, Objective)
    tweenie:Play()
    tweenie.Completed:Connect(function()
        functions.moveDown(part)
    end)
end

function functions.moveDown(part)
    local Tween = game:GetService("TweenService")

    local Objective = {}
    Objective.Position = Vector3.new(part.Position.X, part.Position.Y - 10, part.Position.Z)

    local tweenInfo = TweenInfo.new(5)

    local tweenie = Tween:Create(part, tweenInfo, Objective)
    tweenie:Play()
    tweenie.Completed:Connect(function()
        functions.moveUp(part)
    end)
end

return functions

顺便说一句 - 你应该阅读Tween Service文档,这是非常好的。你可以用它在一个运行中上下移动。这样你就不必在两者之间切换。此外,你还可以用sin波形平滑移动。

2020-05-06 02:30:49