using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerHealth : MonoBehaviour
{
public int maxHealth = 3; // Maximum health the player can have
private int currentHealth; // Current health value
public HealthUI healthUI; // Reference to UI component that displays health
private SpriteRenderer spriteRenderer; // Reference to the player's sprite renderer
public static event Action OnPlayerDied; // Event triggered when the player dies
///
/// Called when the script instance is being loaded
///
void Start()
{
ResetHealth(); // Initialize health at start
spriteRenderer = GetComponent(); // Cache sprite renderer
GameController.OnReset += ResetHealth; // Subscribe to reset event
}
///
/// Called when the object is being destroyed
///
private void OnDestroy()
{
GameController.OnReset -= ResetHealth; // Unsubscribe from reset event to prevent memory leaks
}
///
/// Handles trigger collisions (e.g., with traps)
///
private void OnTriggerEnter2D(Collider2D collision)
{
Trap trap = collision.GetComponent(); // Try to get a Trap component
if (trap && trap.damage > 0)
{
TakeDamage(trap.damage); // Apply trap damage
SoundEffectManager.Play("PlayerHit"); // Play hit sound
}
}
///
/// Resets the player's health and updates the UI
///
void ResetHealth()
{
currentHealth = maxHealth; // Set health to max
healthUI.SetMaxHearts(maxHealth); // Update heart UI to max
}
///
/// Handles taking damage, health update, and death condition
///
private void TakeDamage(int damage)
{
currentHealth -= damage; // Decrease current health
healthUI.UpdateHearts(currentHealth); // Update heart UI
StartCoroutine(FlashRed()); // Trigger flash red effect
if (currentHealth <= 0)
{
// Player is dead
OnPlayerDied?.Invoke(); // Invoke player death event if any listeners
}
}
///
/// Coroutine that flashes the player's sprite red to show damage taken
///
private IEnumerator FlashRed()
{
spriteRenderer.color = Color.red; // Set sprite color to red
yield return new WaitForSeconds(0.2f); // Wait for 0.2 seconds
spriteRenderer.color = Color.white; // Reset sprite color
}
}