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

Whats the best way to make a npc follower?

Asked by 4 years ago

Im trying to make an npc that will just walk behind the player and follow them around. I tried using pathfinding to do this but it seems to be really janky and chopy. Heres the code for it :

--Services
local PathFindingService = game:GetService("PathfindingService")

--Variables
local targetCharacter = script.Parent.Parent.Parent
local target = targetCharacter:WaitForChild("HumanoidRootPart")
local localCharacter = script.Parent.Parent
local localHumanoid = localCharacter:WaitForChild("Humanoid")
local localRoot = localCharacter:WaitForChild("HumanoidRootPart")

--Functions
function moveTo()
    print("Moving to player")
    local pos = target.Position + target.CFrame.LookVector * -2 + target.CFrame.RightVector * 2
    localHumanoid:MoveTo(pos)
end

function drawWaypoint(point)
    local part = Instance.new("Part", workspace)
    part.BrickColor = BrickColor.new("White")
    part.Shape = "Ball"
    part.Material = "Neon"
    part.Transparency = 0.25
    part.Anchored = true
    part.Locked = true
    part.CanCollide = false
    part.Size = Vector3.new(1,1,1)
    part.Position = point.Position
    game:GetService("Debris"):AddItem(part,1)
end

function generatePath()
    print("Generating Path")
    local path = PathFindingService:CreatePath()
    path:ComputeAsync(localRoot.Position ,target.Position + target.CFrame.LookVector * -2 + target.CFrame.RightVector * 2)
    return path
end

function moveAlongWaypoints(path)
    print("Moving along waypoints")
    local wayPoints = path:GetWaypoints()
    for _,waypoint in pairs(wayPoints)do
        print("Next waypoint")
        drawWaypoint(waypoint)
        localHumanoid:MoveTo(waypoint.Position)
        localHumanoid.MoveToFinished:Wait()
    end
end

function main()
    local path = generatePath()
    if path ~= nil and path.Status == Enum.PathStatus.Success then
        print("Path was Successfully made")
        moveAlongWaypoints(path)
    else
        warn("Failed to generate path") 
    end
end

--Loops main function
while true do   
    print("Running Main")
    main()
    game:GetService("RunService").Stepped:Wait()
end

If some one could fix the code to make the movement smoother or just tell me a better way I would apreaciate it alot :)

https://gyazo.com/3e0e075f6b6d6f740ba2e5d302e55b8a

0
Instead of doing while true do, use RenderStepped, because that will run everytime a new frame is generated. I think this would make the movements and turning smoother? But, I'm not sure. I don't really work with AI or PathFindingService. Fires every frame prior to the frame being rendered. https://developer.roblox.com/en-us/api-reference/event/RunService/RenderStepped killerbrenden 1537 — 4y
0
game:GetService("RunService"):Connect(function() print("Running Main") main() end) killerbrenden 1537 — 4y

Answer this question