Защита башни от врага движение искусственного интеллекта roblox

может кто-нибудь помочь мне, как показать, что я перемещаю NPC по пути, как в игре tds ?. Я пробовал это

local function move()
        -- source is an array with all the positions it has to go to
    for i=1,#source,1 do
        -- This is in case the MoveTo takes more than 8 seconds
        local itreached = false
        while itreached == false do
            npc.Humanoid:MoveTo(source[i].Position)
            wait()
            npc.Humanoid.MoveToFinished:Connect(function()
                itreached = true
            end)
        end
    end    
end 

и он работает до некоторой степени, когда я подхожу к npc, он каким-то образом падает и тормозит, в противном случае, если я просто запускаю его без игрока, он работает нормально. Есть ли другие техники, такие как lerp или tween? Я пробовал использовать lerp, но не смог переместить всю модель.

видео, показывающее проблему


person buonobo    schedule 22.03.2021    source источник
comment
Если вы используете поиск пути, лучше всего перейти к. Я бы посоветовал вам прочитать руководства Roblox по поиску пути в центре разработки.   -  person Arthur Buzas Baccan    schedule 22.03.2021


Ответы (1)


У вас возникла проблема с сетью. Движок Roblox решает, кто отвечает за вычисление позиций объектов, на основе некоторых вычислений, касающихся того, кто находится ближе всего к объекту и у кого есть достаточно мощная машина для выполнения вычислений. Например, настольные компьютеры и ноутбуки, как правило, имеют более широкую сферу влияния, чем мобильные устройства. В любом случае, когда вы подходите близко к NPC, происходит передача права собственности, и это приводит к падению NPC. Поэтому, чтобы исправить это, вам нужно вызвать SetNetworkOwner (nil) на PrimaryPart NPC, чтобы эта часть принадлежала серверу.

npc.PrimaryPart:SetNetworkOwner(nil)

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

local targetPos = 1

local function move()
    npc.Humanoid:MoveTo(source[targetPos].Position) 
end

-- listen for when the NPC arrives at a position    
npc.Humanoid.MoveToFinished:Connect(function(didArrive)
    -- check that the NPC was able to arrive at their target location
    if not didArrive then
        local errMsg = string.format("%s could not arrive at the target location : (%s, %s, %s)", npc.Name, tostring(targetPos.X), tostring(targetPos.Y), tostring(targetPos.Z))
        error(errMsg)
        -- do something to handle this bad case! Delete the npc?
        return
    end

    -- select the next target
    targetPos = targetPos + 1

    -- check if there are any more targets to move to
    if targetPos <= #source then
        move()
    else
        print("Done moving!")
    end
end)
person Kylaaa    schedule 22.03.2021