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.Actionlocal hitSound = head:WaitForChild(“Attack”)
local screamSound = head:WaitForChild(“Scream”)local clone = script.Parent:Clone()
local zomb = script.Parentfunction 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
endfunction 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
endfunction 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
endfunction 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
endfunction died()
wait(5)
clone.Parent = workspace
game:GetService(“Debris”):AddItem(script.Parent,0.1)
endmyHuman.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
endwhile wait(0.1) do
if myHuman.Health < 1 then
break
end
main()
end