Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

How to make NPC follow/walk to the player?

Asked by 6 years ago

Goal
I’m trying to make a basic NPC that can follow or walk to the player like a generic roblox zombie would.

Problem
I don’t know which is the correct way to do it, my script just won’t work and it’s not firing anything inside the function, it won’t even print. I’m targeting the player’s HRP and both of the player and NPC use R15.

01local Players = game:GetService("Players")
02 
03for _, player in pairs(Players:GetPlayers()) do
04    spawn(function()
05        while true do
06            print("im smart")
07            local pos = player.Character:FindFirstChild("HumanoidRootPart").Position
08            local pos2 = player.Character:FindFirstChild("HumanoidRootPart")
09            script.Parent.Humanoid:MoveTo(pos, pos2)
10            wait(0.1)
11        end
12    end)
13end
0
https://www.youtube.com/watch?v=pQ9Mcc-5UuA I just saw people talk about it I hope it helps roblox made something called pathfinding and it automatically finds a path. The person in the video made some monsters. turquoise_monkeyman 32 — 6y
0
https://web.roblox.com/games/168156797/Pathfinding is a uncopylocked game using pathfinding turquoise_monkeyman 32 — 6y
0
I hope I helped. I know it didn't answer your question but I hope it was helpfu. Tell  me if it was turquoise_monkeyman 32 — 6y

1 answer

Log in to vote
2
Answered by 6 years ago

The problem is you are applying :MoveTo() with the wrong parameters as. Your script only runs once as well and doesn’t start the while loop.

Humanoid:MoveTo(location, part)

The first parameter, location, is a Vector3 value. This is where you want to humanoid to go. The second parameter, part, is sort of like an offset to the location. If you click the wiki page, you can see a gif that explains it better.

If I were to pass a part with the location being Vector3.new(0,0,0), the Humanoid will walk to the part’s location and will update when the part’s position changes.

Note: The Humanoid will timeout after 8 seconds of being unable to reach to destination. To avoid this, keep resetting the timeout by running the function again. More info on the wiki page mentioned above.

Making the NPC Better

Now that we understand the :MoveTo() function, what are some ways we can apply this to our NPC?

PathfindingService
As much as I would like to explain this, I never have used this before. What it does is it creates a path for the NPC to follow based on the geometry of the map. Here is a tutorial on the wiki page:
https://developer.roblox.com/articles/Pathfinding

Chasing the Nearest Player
Using Magnitude to get the distance between two points in studs will help us determine what player is closest to our NPC and we can apply :MoveTo() to have the NPC chase them.

01local npcHRP = NPC.HumanoidRootPart
02 
03local function GetNearestPlayer(minimumDistance)
04    local closestMagnitude = minimumDistance or math.huge
05    --minimumDistance is a number in studs
06    local closestPlayer
07    for i,v in next, game.Players:GetPlayers() do
08        local Character = v.Character
09        if (Character) then
10            local humanoid = Character.Humanoid
11            local HRP = Character.HumanoidRootPart
12            if (humanoid.Health > 0) then
13                local mag = (npcHRP.Position - HRP.Position).Magnitude
14                if (mag <= closestMagnitude) then
15                    closestPlayer = v
16                    closestMagnitude = mag
17                end
18            end
19        end
20    end
21    return closestPlayer
22end

Using this function, we get the nearest PlayerObject. We can ‘convert’ that to a Vector3 and run the :MoveTo() function with it.

Note: Make sure you apply the loop to keep checking for the nearest player. You also need to keep applying :MoveTo() to keep the NPC from timing out.

Ad

Answer this question