【问题标题】:while loop wont work inside of the other while loopwhile 循环不会在另一个 while 循环内工作
【发布时间】:2016-01-11 22:03:11
【问题描述】:

我在 roblox lua 中编写脚本,当我尝试在第一个循环中放置一个 while 循环时,它会弄乱第一个代码序列,有人可以帮我解决这个问题吗?

问题是,当人形机器人到达 tar2 时,他停在那里不动,我希望他继续跑到点,但同时也有它,所以如果一个真实的人经过,那么他会追着他跑。

local larm = script.Parent:FindFirstChild("Left Arm")
local rarm = script.Parent:FindFirstChild("Right Arm")
local plr = game.Players:GetChildren()
local tar1 = game.Workspace.tar1
local tar2 = game.Workspace.tar2
local tar3 = game.Workspace.tar3
local tar4 = game.Workspace.tar4
local pos = {tar1, tar2, tar3, tar4}
local char = script.Parent
local Hum = char.Humanoid
torso = char.Torso
GoTo = 0 

while true do
    wait(1) 
    if GoTo == 0 then   
          Hum:MoveTo(pos[1].Position)
    end

    if (torso.Position - pos[1].Position).magnitude < 5 then 
            GoTo = 1 
    end

    if GoTo == 1 then 
            Hum:MoveTo(pos[2].Position)
    end

    if (torso.Position - pos[2].Position).magnitude < 5 then 
        GoTo = 2
    end

    if GoTo == 2 then 
        Hum:MoveTo(pos[3].Position)
        Goto = 3
    end

    if (torso.Position - pos[3].Position).magnitude < 5 then 
        GoTo = 4
    end

    if GoTo == 5 then 
        Hum:MoveTo(pos[4].Position)
    end


    while true do 
        wait(0.1)
        plrs = game.Players:GetChildren()
        for i,plr in ipairs(plrs) do 
            if plr.Character ~= nil then 
            tor = plr.Character.Torso
                if (torso.Position-tor.Position).magnitude <= 5 then 
                        GoTo = 0                
                        Hum:MoveTo(tor.Position)
                end 
            end
        end
    end
end

【问题讨论】:

  • 内循环何时退出?
  • 我猜它永远不会。
  • 我不理解你代码中的逻辑,所以我无法对此发表评论,但也许你应该再次查看你的代码并尝试找出你的逻辑应该是什么。跨度>

标签: lua roblox


【解决方案1】:

协程! Coroutines 是炸弹。它们允许您在单个脚本中一次执行多个 while 循环。

local larm = script.Parent:FindFirstChild("Left Arm")
local rarm = script.Parent:FindFirstChild("Right Arm")
local plr = game.Players:GetChildren()
local tar1 = game.Workspace.tar1
local tar2 = game.Workspace.tar2
local tar3 = game.Workspace.tar3
local tar4 = game.Workspace.tar4
local pos = {tar1, tar2, tar3, tar4}
local char = script.Parent
local Hum = char.Humanoid
torso = char.Torso
GoTo = 1

function normalCor() -- run around
while true do
    wait(1)
    for i=1, 4 do
        if GoTo == i then
        Hum:MoveTo(pos[i].Position)
        end
        if (torso.Position - pos[i].Position).magnitude < 5 then
            GoTo = GoTo + 1
            if GoTo == 5 then
                GoTo = 1
            end
            --[[
            The above _can_ be done in a single statement:
            "GoTo = (GoTo+1)%4+1"
            "a % 4" gets the remainder of a / 4 ]]
        end
    end
end
end
cr = coroutine.create(normalCor)
coroutine.resume(cr) -- this lets you do two while loops at the same time.

function aggroCor() -- when a player is nearby
    while true do
        wait(0.1)
        plrs = game.Players:GetChildren()
        for i,plr in ipairs(plrs) do
            if plr.Character ~= nil then
            tor = plr.Character.Torso
                if (torso.Position-tor.Position).magnitude <= 5 then
                        GoTo = 0
                        Hum:MoveTo(tor.Position)
                end
            end
        end
    end
end
cr = coroutine.create(aggroCor)
coroutine.resume(cr)

Roblox 的语法 spawn(aggroCor) 你也可以玩弄, 如果coroutine.whatever 看起来工作量太大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-04
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-12
    • 1970-01-01
    相关资源
    最近更新 更多