Files
ggj2026/Assets/Scripts/Spawner.cs
2026-01-31 22:03:18 -06:00

107 lines
2.6 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Spawner : MonoBehaviour
{
// Reference to the Prefab to Spawn
[SerializeField] private GameObject objectToSpawn;
// Time interval between spawns
public float spawnInterval = 1f;
[SerializeField] private int maxAlive = 0;
[SerializeField] private bool spawnOnStart = true;
[SerializeField] private bool repeatSpawns = true;
[SerializeField] private float launchForce = 0f;
[SerializeField] private float launchRandomAngle = 0f;
[SerializeField] private float spinSpeed = 0f;
private readonly List<GameObject> spawned = new List<GameObject>();
private void OnEnable()
{
if (spawnOnStart)
{
SpawnOnce();
}
}
void Start()
{
if (repeatSpawns)
{
// Start the spawning process using a Coroutine
StartCoroutine(SpawnRoutine());
}
}
private void Update()
{
if (spinSpeed != 0f)
{
transform.Rotate(0f, 0f, spinSpeed * Time.deltaTime);
}
}
public void SpawnNow()
{
SpawnOnce();
}
private IEnumerator SpawnRoutine()
{
// Infinite loop to keep spawning (can be modified)
while (true)
{
// Wait for the specified interval
yield return new WaitForSeconds(spawnInterval);
if (objectToSpawn == null)
{
continue;
}
if (maxAlive > 0 && CountAlive() >= maxAlive)
{
continue;
}
SpawnOnce();
}
}
private void SpawnOnce()
{
if (objectToSpawn == null)
{
return;
}
if (maxAlive > 0 && CountAlive() >= maxAlive)
{
return;
}
var instance = Instantiate(objectToSpawn, transform.position, Quaternion.identity);
spawned.Add(instance);
if (launchForce > 0f && instance.TryGetComponent<Rigidbody2D>(out var body))
{
var angleOffset = launchRandomAngle > 0f ? Random.Range(-launchRandomAngle, launchRandomAngle) : 0f;
var direction = Quaternion.Euler(0f, 0f, angleOffset) * transform.right;
body.AddForce(direction.normalized * launchForce, ForceMode2D.Impulse);
}
}
private int CountAlive()
{
for (var i = spawned.Count - 1; i >= 0; i--)
{
if (spawned[i] == null)
{
spawned.RemoveAt(i);
}
}
return spawned.Count;
}
}