Time-based difficulty scaling with object pools and bird pooper restart improvements to the minigame

This commit is contained in:
Michal Pikulski
2025-12-16 23:21:10 +01:00
parent 0ff3fbbc70
commit 6133caec53
14 changed files with 994 additions and 280 deletions

View File

@@ -31,9 +31,9 @@ namespace Minigames.BirdPooper
[Tooltip("Array of target prefabs to spawn randomly")]
[SerializeField] private GameObject[] targetPrefabs;
private IBirdPooperSettings settings;
private float spawnTimer;
private bool isSpawning;
private IBirdPooperSettings _settings;
private float _spawnTimer;
private bool _isSpawning;
private float _currentTargetInterval = 1f;
[Header("Spawn Timing")]
@@ -42,16 +42,17 @@ namespace Minigames.BirdPooper
[Tooltip("Maximum interval between target spawns (seconds)")]
[SerializeField] private float maxTargetSpawnInterval = 2f;
internal override void OnManagedAwake()
/// <summary>
/// Initializes the target spawner by loading settings and validating references.
/// Should be called once before spawning begins.
/// </summary>
private void Initialize()
{
base.OnManagedAwake();
// Load settings
settings = GameManager.GetSettingsObject<IBirdPooperSettings>();
if (settings == null)
_settings = GameManager.GetSettingsObject<IBirdPooperSettings>();
if (_settings == null)
{
Debug.LogError("[TargetSpawner] BirdPooperSettings not found!");
// continue we'll use inspector intervals
Debug.LogWarning("[TargetSpawner] BirdPooperSettings not found! Using inspector intervals.");
}
// Validate interval range
@@ -96,15 +97,15 @@ namespace Minigames.BirdPooper
private void Update()
{
if (!isSpawning)
if (!_isSpawning)
return;
spawnTimer += Time.deltaTime;
_spawnTimer += Time.deltaTime;
if (spawnTimer >= _currentTargetInterval)
if (_spawnTimer >= _currentTargetInterval)
{
SpawnTarget();
spawnTimer = 0f;
_spawnTimer = 0f;
// pick next random interval
_currentTargetInterval = Random.Range(minTargetSpawnInterval, maxTargetSpawnInterval);
}
@@ -167,15 +168,34 @@ namespace Minigames.BirdPooper
}
/// <summary>
/// Start spawning targets at regular intervals.
/// Start spawning targets.
/// Initializes the spawner if not already initialized, then begins spawning logic.
/// </summary>
public void StartSpawning()
{
isSpawning = true;
spawnTimer = 0f;
// choose initial interval
// Initialize if not already done
if (_settings == null)
{
Initialize();
}
// Begin the spawning process
BeginSpawningTargets();
}
/// <summary>
/// Internal method that handles the actual spawning startup logic.
/// Sets initial state and computes first interval.
/// </summary>
private void BeginSpawningTargets()
{
_isSpawning = true;
_spawnTimer = 0f;
// Choose initial interval
_currentTargetInterval = Random.Range(minTargetSpawnInterval, maxTargetSpawnInterval);
Debug.Log("[TargetSpawner] Started spawning targets");
Debug.Log($"[TargetSpawner] Started spawning targets with interval {_currentTargetInterval:F2}s");
}
/// <summary>
@@ -183,14 +203,14 @@ namespace Minigames.BirdPooper
/// </summary>
public void StopSpawning()
{
isSpawning = false;
_isSpawning = false;
Debug.Log("[TargetSpawner] Stopped spawning targets");
}
/// <summary>
/// Check if spawner is currently spawning.
/// </summary>
public bool IsSpawning => isSpawning;
public bool IsSpawning => _isSpawning;
/// <summary>
/// Draw gizmos to visualize spawn and despawn points in the editor.