协程问题

我正在尝试在 ROBLOX 中创建基本的 GUI 动画系统,使用单个帧并循环将它们放入 imagelabel 中。

这是函数:

local playAnimation = coroutine.create(function(anim,pos,tank)
    while true do
    local animBase = sp.AnimBase:Clone()
    animBase.Parent = tank
    animBase.Visible = true
    animBase.Position = pos -- 下面提到的错误发生的行。
    local frame = 1
    for i = 0, animations[anim]["FrameNum"] do
        frame = frame + 1
        animBase.Image = animations[anim]["Frames"][frame]
        NewWait(.1) -- 这里的等待,干扰了 yield。
        if frame >= animations[anim]["FrameNum"] then
            pos,anim,tank = coroutine.yield()
            break
        end
    end
    animBase:Destroy()
    end
end)

它有两个主要问题: 每次运行时,我都会收到此错误:

20:41:01.934 - Players.Player1.PlayerGui.ScreenGui.Gui-MAIN:65: bad argument #3 to 'Position' (UDim2 expected, got number)

尽管此错误似乎没有做任何事情。(例如停止脚本完全)

标有注释的行会导致错误。

我确保 pos 是正确的。我甚至尝试在设置之前打印它,它打印了正确的东西,即: {0,120},{0,65}

另一个主要问题是在使用一次后无法恢复它。它可以多次运行此行:

coroutine.resume(playAnimation,"Cannon Fire",UDim2.new(0,120,0,68-25),tank.Frame)

但它不会运行:

if tank2:FindFirstChild("Ammo") and isTouching(ammoFrame,tank2:GetChildren()[3]) then
    local lastAmmoPos = ammoFrame.Position
    ammoFrame:Destroy()
    coroutine.resume(playAnimation,"Explosion",lastAmmoPos-UDim2.new(0,25-(ammoTypes[type]["Size"].X.Offset)/2,0,25),tank.Frame)
    tank2:GetChildren()[3]:Destroy()
end

是的,if 语句正常工作。 ammoFrame 和 tank2 的第三个子项都被销毁了。协程只不过不会恢复。

点赞
用户6079712
用户6079712

修复了问题:将 coroutine 完全移除,并将 for 循环封装在 spawn 函数内。

local playAnimation = function(anim,pos,tank)
    local animBase = sp.AnimBase:Clone()
    animBase.Parent = tank
    animBase.Visible = true
    animBase.Position = pos
    local frame = 1
    spawn(function()
        for i = 0, animations[anim]["FrameNum"] do
            frame = frame + 1
            animBase.Image = animations[anim]["Frames"][frame]
            wait(.1) -- 这一句话就是,wait 会干扰 yield。
            if frame >= animations[anim]["FrameNum"] then
                break
            end
        end
        animBase:Destroy()
    end)
end
2016-05-29 15:24:20