Как выполнять a для l oop непрерывно, вместо того, чтобы зависать на одной повторяющейся функции? - PullRequest
1 голос
/ 05 мая 2020

Я пытаюсь запустить функцию для всех дочерних элементов модели, но функция по существу зацикливается бесконечно, предотвращая вызов следующего элемента в for l oop, мне нужен либо лучший способ сделать это или обходной путь.

Основной код:

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

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 06 мая 2020

У вас нет бесконечного l oop, а скорее рекурсивного l oop: функции в модуле вызывают друг друга, пока не произойдет переполнение стека. Их порождение в разных потоках умножит это. служба для подростков, это очень аккуратно. Вы можете использовать его для go вверх и вниз за один проход. Таким образом, вам не нужно переключаться между двумя функциями. Также вы можете сгладить движения синусоидой.

1 голос
/ 05 мая 2020

Что вы можете сделать, так это отредактировать основной скрипт для запуска функции 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) --Using an anonymous function as the spawn() function doesn't accept functions with parameters 
        wait(math.random(0.1,0.3))
        print("exec")
    end
    print("executed")
end)

Это работает, однако в долгосрочной перспективе вам не следует делать это как бесконечные циклы, выполняемые в нескольких потоках, могут вызвать значительную задержку, если не оптимизированы

Код изменен:

move.moveUp(child)

на

spawn(function() move.moveUp(child) end)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...