Time-based difficulty scaling with object pools and bird pooper restart improvements to the minigame
This commit is contained in:
@@ -17,12 +17,13 @@ namespace Minigames.BirdPooper
|
||||
[SerializeField] private BirdPlayerController player;
|
||||
[SerializeField] private ObstacleSpawner obstacleSpawner;
|
||||
[SerializeField] private TargetSpawner targetSpawner;
|
||||
[SerializeField] private TapToStartController tapToStartController;
|
||||
[SerializeField] private GameOverScreen gameOverScreen;
|
||||
[SerializeField] private GameObject poopPrefab;
|
||||
|
||||
[Header("Game State")]
|
||||
private int targetsHit;
|
||||
private bool isGameOver;
|
||||
private int _targetsHit;
|
||||
private bool _isGameOver;
|
||||
|
||||
[Header("Input")]
|
||||
[Tooltip("Minimum seconds between consecutive poop spawns")]
|
||||
@@ -60,6 +61,11 @@ namespace Minigames.BirdPooper
|
||||
Debug.LogWarning("[BirdPooperGameManager] TargetSpawner reference not assigned! Targets will not spawn.");
|
||||
}
|
||||
|
||||
if (tapToStartController == null)
|
||||
{
|
||||
Debug.LogError("[BirdPooperGameManager] TapToStartController reference not assigned!");
|
||||
}
|
||||
|
||||
if (gameOverScreen == null)
|
||||
{
|
||||
Debug.LogError("[BirdPooperGameManager] GameOverScreen reference not assigned!");
|
||||
@@ -76,34 +82,76 @@ namespace Minigames.BirdPooper
|
||||
}
|
||||
}
|
||||
|
||||
internal override void OnManagedStart()
|
||||
/// <summary>
|
||||
/// Called after scene is fully loaded and any save data is restored.
|
||||
/// Activates tap-to-start UI instead of starting immediately.
|
||||
/// </summary>
|
||||
internal override void OnSceneRestoreCompleted()
|
||||
{
|
||||
base.OnManagedStart();
|
||||
base.OnSceneRestoreCompleted();
|
||||
|
||||
Debug.Log("[BirdPooperGameManager] Scene fully loaded, activating tap-to-start...");
|
||||
|
||||
if (tapToStartController != null)
|
||||
{
|
||||
tapToStartController.Activate();
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError("[BirdPooperGameManager] TapToStartController missing! Starting game immediately as fallback.");
|
||||
BeginMinigame();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Central method to begin the minigame.
|
||||
/// Initializes player, starts spawners, and sets up game state.
|
||||
/// </summary>
|
||||
public void BeginMinigame()
|
||||
{
|
||||
// Initialize game state
|
||||
isGameOver = false;
|
||||
targetsHit = 0;
|
||||
_isGameOver = false;
|
||||
_targetsHit = 0;
|
||||
|
||||
// Subscribe to player events
|
||||
// Initialize and enable player
|
||||
if (player != null)
|
||||
{
|
||||
player.Initialize();
|
||||
player.OnPlayerDamaged.AddListener(HandlePlayerDamaged);
|
||||
Debug.Log("[BirdPooperGameManager] Subscribed to player damaged event");
|
||||
|
||||
// Make bird do initial flap so first tap feels responsive
|
||||
player.Flap();
|
||||
|
||||
Debug.Log("[BirdPooperGameManager] Player initialized and event subscribed");
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError("[BirdPooperGameManager] Cannot begin minigame - player reference missing!");
|
||||
}
|
||||
|
||||
// Start obstacle spawning
|
||||
if (obstacleSpawner != null)
|
||||
{
|
||||
obstacleSpawner.StartSpawning();
|
||||
Debug.Log("[BirdPooperGameManager] Started obstacle spawning");
|
||||
Debug.Log("[BirdPooperGameManager] Obstacle spawner started");
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError("[BirdPooperGameManager] Cannot begin minigame - obstacle spawner reference missing!");
|
||||
}
|
||||
|
||||
// Start target spawning
|
||||
if (targetSpawner != null)
|
||||
{
|
||||
targetSpawner.StartSpawning();
|
||||
Debug.Log("[BirdPooperGameManager] Started target spawning");
|
||||
Debug.Log("[BirdPooperGameManager] Target spawner started");
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning("[BirdPooperGameManager] Target spawner reference missing - targets will not spawn");
|
||||
}
|
||||
|
||||
Debug.Log("[BirdPooperGameManager] ✅ Minigame started successfully!");
|
||||
}
|
||||
|
||||
internal override void OnManagedDestroy()
|
||||
@@ -129,10 +177,10 @@ namespace Minigames.BirdPooper
|
||||
/// </summary>
|
||||
private void HandlePlayerDamaged()
|
||||
{
|
||||
if (isGameOver) return;
|
||||
if (_isGameOver) return;
|
||||
|
||||
isGameOver = true;
|
||||
Debug.Log($"[BirdPooperGameManager] Player damaged - Game Over! Targets Hit: {targetsHit}");
|
||||
_isGameOver = true;
|
||||
Debug.Log($"[BirdPooperGameManager] Player damaged - Game Over! Targets Hit: {_targetsHit}");
|
||||
|
||||
// Stop spawning obstacles
|
||||
if (obstacleSpawner != null)
|
||||
@@ -167,7 +215,7 @@ namespace Minigames.BirdPooper
|
||||
if (Time.time < _lastPoopTime + poopCooldown)
|
||||
return;
|
||||
|
||||
if (isGameOver || player == null || poopPrefab == null)
|
||||
if (_isGameOver || player == null || poopPrefab == null)
|
||||
return;
|
||||
|
||||
Vector3 spawnPosition = player.transform.position;
|
||||
@@ -183,16 +231,17 @@ namespace Minigames.BirdPooper
|
||||
/// </summary>
|
||||
public void OnTargetHit()
|
||||
{
|
||||
if (isGameOver) return;
|
||||
if (_isGameOver) return;
|
||||
|
||||
targetsHit++;
|
||||
Debug.Log($"[BirdPooperGameManager] Target Hit! Total: {targetsHit}");
|
||||
_targetsHit++;
|
||||
Debug.Log($"[BirdPooperGameManager] Target Hit! Total: {_targetsHit}");
|
||||
}
|
||||
|
||||
#region Public Accessors
|
||||
|
||||
public bool IsGameOver => isGameOver;
|
||||
public int TargetsHit => targetsHit;
|
||||
public bool IsGameOver => _isGameOver;
|
||||
public int TargetsHit => _targetsHit;
|
||||
public BirdPlayerController Player => player;
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user