0

我在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
4

1 回答 1

1

协程!协程是重磅炸弹。它们允许您在单个脚本中一次执行多个 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看起来工作量太大的话。

于 2015-10-21T17:07:52.967 回答