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 } }