I'm trying to make a game, the AI enemy is programmed to go to a random part position in a folder in the workspace and attack a player once they are enough distance away, but when the enemy gets close to my player, the AI stutters, basically stopping for a bit, then starting, then stopping, rinse and repeat. Any help? Here's the script..
local reaper = script.Parent local humanoid = reaper.Humanoid reaper.PrimaryPart:SetNetworkOwner(nil) local function canSeeTarget(target) local origin = reaper.HumanoidRootPart.Position local direction = (target.HumanoidRootPart.Position - reaper.HumanoidRootPart.Position).unit * 40 local ray = Ray.new(origin, direction) local hit, pos = workspace:FindPartOnRay(ray, reaper) if hit then if hit:IsDescendantOf(target) then return true end else return false end end local function findTarget() local players = game.Players:GetPlayers() local maxDistance = 40 local nearestTarget for index, player in pairs(players) do if player.Character then local target = player.Character local distance = (reaper.HumanoidRootPart.Position - target.HumanoidRootPart.Position).Magnitude if distance < maxDistance and canSeeTarget(target) then nearestTarget = target maxDistance = distance end end end return nearestTarget end local function getPath(destination) local PathfindingService = game:GetService("PathfindingService") local pathParams = { ["AgentHeight"] = 9.5, ["AgentRadius"] = 4, ["AgentCanJump"] = false } local path = PathfindingService:CreatePath(pathParams) path:ComputeAsync(reaper.HumanoidRootPart.Position, destination.Position) return path end local function attack(target) local distance = (reaper.HumanoidRootPart.Position - target.HumanoidRootPart.Position).Magnitude if distance > 2 then humanoid:MoveTo(target.HumanoidRootPart.Position) else local attackAnim = humanoid:LoadAnimation(script.Attack) attackAnim:Play() target.Humanoid.Health = 0 end end local function walkTo(destination) local path = getPath(destination) if path.Status == Enum.PathStatus.Success then for index, waypoint in pairs(path:GetWaypoints()) do local target = findTarget() if target and target.Humanoid.Health > 0 then print("TARGET FOUND", target.Name) attack(target) break else print("Moving to ", waypoint.Position) humanoid:MoveTo(waypoint.Position) humanoid.MoveToFinished:Wait() end end else humanoid:MoveTo(destination.Position - (reaper.HumanoidRootPart.CFrame.LookVector * 10)) end end function patrol() local waypoints = workspace.waypoints:GetChildren() local randomNum = math.random(1, #waypoints) walkTo(waypoints[randomNum]) end while wait(0) do patrol() end
The enemy is r6, is it because of the character? I have no clue...
I feel this part of your code is wrong - 013
if hit then
014 if hit:IsDescendantOf(target) then 015 return true 016 end 017 else 018 return false 019 end 020 end
because you are repeating the "if hit" command twice.
I hope this helped, please friend request me on roblox if you have further questions.