using System.Collections; using UnityEngine; public class PlayerHealth : MonoBehaviour { public float maxHealth = 100f; private float currentHealth = 100f; public bool IsDead => currentHealth <= 0; public float CurrentHealth => currentHealth; [Header("Компоненты персонажа (автоматически)")] public Animator playerAnimator; public CharacterController characterController; public PlayerMovement playerMovement; public PlayerGun playerGun; public PlayerAttack playerAttack; public EchoTrigger echoTrigger; [Header("Экран смерти")] public DeathScreenUI deathScreenUI; [Tooltip("Пауза перед показом экрана смерти для проигрывания анимации падения")] public float deathScreenDelay = 1.2f; [Header("Защита от мгновенного урона толпой")] [Tooltip("Минимальная задержка между получением урона от ударов врагов")] public float damageCooldown = 0.35f; private float lastDamageTime = -10f; private bool hasDied = false; void Start() { currentHealth = maxHealth; if (playerAnimator == null) playerAnimator = GetComponentInChildren(); if (characterController == null) characterController = GetComponent(); if (playerMovement == null) playerMovement = GetComponent(); if (playerGun == null) playerGun = GetComponent(); if (playerAttack == null) playerAttack = GetComponent(); if (echoTrigger == null) echoTrigger = GetComponent(); if (deathScreenUI == null) deathScreenUI = FindAnyObjectByType(); } public void TakeDamage(float damage) { if (IsDead || hasDied) return; if (Time.time < lastDamageTime + damageCooldown) return; lastDamageTime = Time.time; currentHealth -= damage; Debug.Log($"Игрок получил урон! Осталось здоровья: {currentHealth}"); if (currentHealth <= 0f) { currentHealth = 0f; Die(); } } public void Die() { if (hasDied) return; hasDied = true; Debug.Log("[PlayerHealth] ИГРОК ПОГИБ! Запуск экрана смерти."); // Отключаем управление и физику персонажа if (playerMovement != null) playerMovement.enabled = false; if (playerGun != null) playerGun.enabled = false; if (playerAttack != null) playerAttack.enabled = false; if (echoTrigger != null) echoTrigger.enabled = false; if (characterController != null) characterController.enabled = false; // Отключаем слой удержания оружия и запускаем анимацию смерти if (playerAnimator != null) { if (playerAnimator.layerCount > 1) { playerAnimator.SetLayerWeight(1, 0f); } playerAnimator.SetTrigger("Die"); } // Показываем экран смерти с кинематографичной задержкой StartCoroutine(ShowDeathScreenDelayed()); } private IEnumerator ShowDeathScreenDelayed() { yield return new WaitForSeconds(deathScreenDelay); if (deathScreenUI != null) { deathScreenUI.ShowDeathScreen(); } else if (DeathScreenUI.Instance != null) { DeathScreenUI.Instance.ShowDeathScreen(); } } }