Spawning enemies randomly: code snippet

Lesson#11 of 22 in project Theory

Steps

  1. Select the model
  2. Put it in the ServerStorage folder
  3. Make a server script - put it inside a ServerScriptService folder


--! strict

local CONFIG = {
	EnemyModel = "Zombie",
	EnemiesFolder = "Enemies",
	SpawnArea = workspace.Baseplate,

	MinSpawnTime = 2,
	MaxSpawnTime = 5,

	MaxEnemies = 20,
}

local ServerStorage = game:GetService("ServerStorage")
local EnemyModel = ServerStorage:WaitForChild(CONFIG.EnemiesFolder):WaitForChild(CONFIG.EnemyModel)


local function getRandomPosition()
	local area = CONFIG.SpawnArea
	local size = area.Size
	local position = area.Position

	local x = position.X + math.random(-size.X / 2, size.X / 2)
	local z = position.Z + math.random(-size.Z / 2, size.Z / 2)

	-- Spawn slightly above the area
	return Vector3.new(x, position.Y + 5, z)
end


local function spawnEnemy()
	local enemy = EnemyModel:Clone()
	enemy:PivotTo(CFrame.new(getRandomPosition()))

	enemy.Parent = workspace.Enemies

	task.wait(math.random(CONFIG.MinSpawnTime, CONFIG.MaxSpawnTime))
end


local function main()
	while true do
		-- prepare enemiesFolder
		local enemiesFolder = workspace:FindFirstChild("Enemies")

		if not enemiesFolder then
			enemiesFolder = Instance.new("Folder")
			enemiesFolder.Name = "Enemies"
			enemiesFolder.Parent = workspace
		end
		

	
		if #enemiesFolder:GetChildren() < CONFIG.MaxEnemies then
			spawnEnemy()
		end
	end
	
end

main()