Zombie Ai System Help

Need to help on how to make my zombies smoother.


It works great, but tends to lag once the zombies get closer to the player. Below is the code for zombie, it’s also nested in the server scripts as well.

local myHuman = script.Parent:WaitForChild(“Humanoid”)
local myRoot = script.Parent:WaitForChild(“HumanoidRootPart”)
local head = script.Parent:WaitForChild(“Head”)
local lowerTorso = script.Parent:WaitForChild(“LowerTorso”)

local hit = script.Parent:WaitForChild(“Hit”)
local hitAnim = myHuman:LoadAnimation(hit)
hitAnim.Priority = Enum.AnimationPriority.Action

local hitSound = head:WaitForChild(“Attack”)
local screamSound = head:WaitForChild(“Scream”)

local clone = script.Parent:Clone()
local zomb = script.Parent

function findPath(target)
local path = game:GetService(“PathfindingService”):CreatePath()
path:ComputeAsync(myRoot.Position,target.Position)
local waypoints = path:GetWaypoints()

if path.Status == Enum.PathStatus.Success then
for _, waypoint in ipairs(waypoints) do
if waypoint.Action == Enum.PathWaypointAction.Jump then
myHuman.Jump = false
end
myHuman:MoveTo(waypoint.Position)
local timeOut = myHuman.MoveToFinished:Wait(1)
if not timeOut then
myHuman.Jump = false
print(“Path too long!”)
findPath(target)
break
end
if checkSight(target) then
repeat
print(“Moving directly to the target”)
myHuman:MoveTo(target.Position)
attack(target)
wait(0.1)
if target == nil then
break
elseif target.Parent == nil then
break
end
until checkSight(target) == false or myHuman.Health < 1 or target.Parent.Humanoid.Health < 1
break
end
if (myRoot.Position - waypoints[1].Position).magnitude > 20 then
print(“Target has moved, generating new path”)
findPath(target)
break
end
end
end
end

function checkSight(target)
local ray = Ray.new(myRoot.Position, (target.Position - myRoot.Position).Unit * 40)
local hit,position = workspace:FindPartOnRayWithIgnoreList(ray, {script.Parent})
if hit then
if hit:IsDescendantOf(target.Parent) and math.abs(hit.Position.Y - myRoot.Position.Y) < 3 then
print(“I can see the target”)
return true
end
end
return false
end

function findTarget()
local dist = 1000
local target = nil
local potentialTargets = {}
local seeTargets = {}
for i,v in ipairs(workspace:GetChildren()) do
local human = v:FindFirstChild(“Humanoid”)
local torso = v:FindFirstChild(“Torso”) or v:FindFirstChild(“HumanoidRootPart”)
if human and torso and v.Name ~= script.Parent.Name then
if (myRoot.Position - torso.Position).magnitude < dist and human.Health > 0 then
table.insert(potentialTargets,torso)
end
end
end
if #potentialTargets > 0 then
for i,v in ipairs(potentialTargets) do
if checkSight(v) then
table.insert(seeTargets, v)
elseif #seeTargets == 0 and (myRoot.Position - v.Position).magnitude < dist then
target = v
dist = (myRoot.Position - v.Position).magnitude
end
end
end
if #seeTargets > 0 then
dist = 1000
for i,v in ipairs(seeTargets) do
if (myRoot.Position - v.Position).magnitude < dist then
target = v
dist = (myRoot.Position - v.Position).magnitude
end
end
end
if target then
if math.random(20) == 1 then
screamSound:Play()
end
end
return target
end

function attack(target)
if (myRoot.Position - target.Position).magnitude < 5 then
hitAnim:Play()
hitSound:Play()
if target.Parent ~= nil then
target.Parent.Humanoid:TakeDamage(25)
end
wait(0.4)
end
end

function died()
wait(5)
clone.Parent = workspace
game:GetService(“Debris”):AddItem(script.Parent,0.1)
end

myHuman.Died:Connect(died)

lowerTorso.Touched:Connect(function(obj)
if not obj.Parent:FindFirstChild(“Humanoid”) then
myHuman.Jump = false
end
end)

function main()
local target = findTarget()
if target then
myHuman.WalkSpeed = 16
findPath(target)
else
myHuman.WalkSpeed = 8
end
end

while wait(0.1) do
if myHuman.Health < 1 then
break
end
main()
end

HumanoidRootPart:SetNetworkOwner(nil)

This will make the zombies physics only be calculated on the server. Otherwise, there is a delay from the zombie’s position to being recognized in the code when detecting when to move next.

1 Like

Instantly worked, little frustrated it was so simple but I appreciate this. Thank You!

1 Like

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.