So I recently made a game that involves using towers to kill enemies and it locks on to enemies within it's range. However the function that does this seems to cause a lot of lag when it does, and in order for me to check if an enemy is near, I have to use a 'while true do' that goes through every enemy in the enemy folder and checks if it's magnitude from the tower is less than the towers range. I think there is a more efficient way to do this, but I'm not sure. Here's a couple links for images.
https://gyazo.com/80f223c7f11938711bc7488978b293ac
Anything within the blue circle it will shoot. However this is how I made it function.
local function getNearestEnemy()
local lowest = 500
local nearObj
local children = #enemyFolder:GetChildren()
for i, v in pairs(enemyFolder:GetChildren()) do
local rootPart = v:FindFirstChild('HumanoidRootPart')
if rootPart ~= nil then
local health = v:FindFirstChild('Health')
if health ~= nil then
local groundPos = hitbox.Position - Vector3.new(0, hitbox.Size.Y / 2, 0)
local mag = (groundPos - rootPart.Position).magnitude
if health.Value >= 1 then
if mag <= range.Value then
if mag < lowest then
nearObj = v
lowest = mag
end
end
end
end
end
if i == children then
return nearObj
end
end
end
spawn(function()
while true do
wait(.1)
if enemy == nil then
local nearestEnemy = getNearestEnemy()
if nearestEnemy ~= nil then
enemy = nearestEnemy
end
else
if enemy:FindFirstChild('HumanoidRootPart') == nil then
enemy = nil
else
attackEnemy()
end
end
end
end)
Some variables that you see may not be included in the code block I provided. There is a big issue with how my towers run though. As you can see, every .1 seconds it will check for nearby enemies. That means every second, it has gone through the enemy folder, 10 times. Which I think can easily be seen as a cause of lag. What I want to do is trigger a towers attack when an enemy gets close enough. How might I go about changing this into that type of system?
