-
What do you want to achieve?
A want to let the dog follow the player in a smooth way. -
What is the issue?
The pathfinding is stuttering like it is lagging.
-
What solutions have you tried so far?
Multiple ways of making the path regenerate when moved.
You should send your code so people can help you diagnose it properly.
Are you using a server script to do it or a local script?
I am using one server script inside the dog.
Script:
local PathService = game:GetService("PathfindingService")
local Path = PathService:CreatePath()
local WalkAnimation = script.Parent.Humanoid:LoadAnimation(script.WalkAnim)
for Index, Limb in pairs(script.Parent:GetChildren()) do
if Limb:IsA("BasePart") then
Limb.Anchored = false
if Limb ~= script.Parent.PrimaryPart then
Limb.CanCollide = false
else
Limb.CanCollide = true
end
end
end
function FindPath(Player)
local FindPathCourotine = coroutine.wrap(function()
local Character = Player.Character or Player.CharacterAdded:Wait()
while true do
Path:ComputeAsync(script.Parent.HumanoidRootPart.Position, Character.HumanoidRootPart.Position)
for Index, Point in pairs(Path:GetWaypoints()) do
if Point.Action == Enum.PathWaypointAction.Jump then
script.Parent.Humanoid.Jump = true
repeat
wait()
until script.Parent.Humanoid.FloorMaterial ~= nil
end
script.Parent.Humanoid:MoveTo(Point.Position)
local MoveStatus = script.Parent.Humanoid.MoveToFinished:Wait(2)
if not MoveStatus then
FindPath(Player)
return
end
end
wait()
end
end)
FindPathCourotine()
end
script.Parent.Vest.ClickDetector.MouseClick:Connect(function(Player)
script.Parent.Vest.ClickDetector.MaxActivationDistance = 0
FindPath(Player)
end)
Can you find the problem? Because i have been searching for a solution for a while now and can’t get it to work smoothly.
Try setting the network ownership of the npc to the server, it can cause stuttering if its being replicated by the client sometimes.
I do not think the problem is network-related, I think your code is just slow.
You are doing this:
- Compute path (this takes some time)
- Jump if necessary (busy wait while doing this), then move to the next point.
- Wait until we reach the next point
- If we did, go to step 2
- If we did not within 2 seconds, go to step 1
Instead of all this waiting, use event-based code to properly deal with reaching waypoints, blocked waypoints, etc. Read this great article that goes over how to do this properly, and make some improvements to your code
Also, read this devforum post for more motivation about using events, rather than busy waits (like repeat wait() until ...
)
EDIT: The article I linked handles blocked paths, but not a constantly moving goal. However, having a system like that which avoids a for loop would still be useful for solving that problem.
Okey i will take a look into the article you send! If it works i wil mark your post as the solution.
It works but how do i now put this into a loop so it contantly follows me around?
**Script right now: **
local PathService = game:GetService("PathfindingService")
local Path = PathService:CreatePath()
local DogUser
local Waypoints
local CurruntWaypoint
local function StartPath()
Path:ComputeAsync(script.Parent.HumanoidRootPart.Position, DogUser.Character.HumanoidRootPart.Position)
Waypoints = {}
if Path.Status == Enum.PathStatus.Success then
Waypoints = Path:GetWaypoints()
CurruntWaypoint = 1
script.Parent.Humanoid:MoveTo(Waypoints[CurruntWaypoint].Position)
else
script.Parent.Humanoid:MoveTo(script.Parent.HumanoidRootPart.Position)
end
end
local function OnWaypointChecked(Checked)
if Checked and CurruntWaypoint < #Waypoints then
CurruntWaypoint = CurruntWaypoint + 1
script.Parent.Humanoid:MoveTo(Waypoints[CurruntWaypoint].Position)
end
end
local function OnWaypointBlocked(BlockedWaypoint)
if BlockedWaypoint > CurruntWaypoint then
StartPath()
end
end
Path.Blocked:Connect(OnWaypointChecked)
script.Parent.Humanoid.MoveToFinished:Connect(OnWaypointChecked)
script.Parent.Vest.ClickDetector.MouseClick:Connect(function(Player)
script.Parent.Vest.ClickDetector.MaxActivationDistance = 0
print("Activating!")
DogUser = Player
StartPath()
end)
This sorta solved the problem. It made the stuttering way less!
Glad to hear, I had similar issues while working on npcs as well, and when I did that they were way more stable so I figured it may be the case.