buonobo
buonobo

Reputation: 1

Tower-Defense Enemy AI movement roblox

can someone help me on how show i move the NPCs through a path, like in the tds game?. I have tried this

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 

and it works to an extend , that when i approach the npc it somehow falls and lags , otherwise if i just run it without a player it works just fine. Are there other techniques, like lerp or tween? I tried using lerp, but i couldn't move the whole model.

video showing the problem

Upvotes: 0

Views: 1208

Answers (1)

Kylaaa
Kylaaa

Reputation: 7188

You are running into an issue with network ownership. The Roblox engine decides who is responsible for calculating the positions of objects based on some calculation around who is closest to the object and who has a strong enough machine to do the calculation. For example, desktop computers and laptops tend to have a wider sphere of influence than mobile devices. Anyways, when you walk close it the NPCs, there is a handoff of ownership, and that is causing the NPCs to fall over. So to fix it, you need to call SetNetworkOwner(nil) on the NPC's PrimaryPart so that the part is owned by the server.

npc.PrimaryPart:SetNetworkOwner(nil)

Also, if you want to clean up your code, you can make it entirely driven by events. Once you tell it to start moving, it will select the next target once it arrives.

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)

Upvotes: 1

Related Questions