/
Lexan97
/
Cowbeat
Обзор
Документация
Войти
/
Lexan97
/
Cowbeat
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Assets/Scripts/Player/PlayerStats.cs
145 строк
5 KB
Lexa97
Final Commit gor present
26 май 2026, 23:40
26 май 2026, 23:40
70e9bdb
Код
Авторство
О чём код?
using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; using System.Collections; using TMPro; // Обязательно для использования TextMeshPro public class PlayerStats : MonoBehaviour { [Header("Health & UI")] public float maxHealth = 100f; public float currentHealth; public Slider healthSlider; public TextMeshProUGUI healthText; // Сюда перетащишь свой текст из иерархии public GameObject damageTextPrefab; [Header("Death UI")] public CanvasGroup deathCanvasGroup; public float fadeSpeed = 1.5f; public bool isDead = false; private bool waitingToDieOnLand = false; [Header("Regeneration")] public float timeToStartRegen = 15f; public float healthRegenRate = 10f; private float outOfCombatTimer = 0f; private Animator anim; private PlayerCombat playerCombat; private PlayerMovement playerMovement; private CharacterController controller; void Start() { maxHealth += PersistentData.AdditionalMaxHealth; currentHealth = maxHealth; anim = GetComponent<Animator>(); playerCombat = GetComponent<PlayerCombat>(); playerMovement = GetComponent<PlayerMovement>(); controller = GetComponent<CharacterController>(); UpdateHealthUI(); // Обновляем UI при старте if (deathCanvasGroup != null) deathCanvasGroup.alpha = 0; } void Update() { if (isDead) { UpdateDeathFade(); Cursor.lockState = CursorLockMode.None; Cursor.visible = true; return; } if (waitingToDieOnLand && controller.isGrounded) Die(); HandleHealthRegen(); } // Метод для обновления и слайдера, и текста private void UpdateHealthUI() { if (healthSlider != null) { healthSlider.maxValue = maxHealth; healthSlider.value = currentHealth; } if (healthText != null) { healthText.text = $"{Mathf.RoundToInt(currentHealth)} / {Mathf.RoundToInt(maxHealth)}"; } } // Метод для магазина (Этап 4) public void UpgradeMaxHealth(float amount) { maxHealth += amount; currentHealth = maxHealth; UpdateHealthUI(); // Обновляем UI Debug.Log($"Максимальное здоровье увеличено! Новый лимит: {maxHealth}"); } private void UpdateDeathFade() { if (deathCanvasGroup != null && deathCanvasGroup.alpha < 1) deathCanvasGroup.alpha += fadeSpeed * Time.deltaTime; } private void HandleHealthRegen() { if (playerCombat != null && !playerCombat.IsInCombatMode && !waitingToDieOnLand) { outOfCombatTimer += Time.deltaTime; if (outOfCombatTimer >= timeToStartRegen && currentHealth < maxHealth) { currentHealth += healthRegenRate * Time.deltaTime; UpdateHealthUI(); // Обновляем UI } } else outOfCombatTimer = 0f; } public void TakeDamage(float damage) { if (isDead || waitingToDieOnLand) return; if (playerMovement != null && playerMovement.isRolling) return; outOfCombatTimer = 0f; currentHealth -= damage; if (damageTextPrefab != null) { GameObject textObj = Instantiate(damageTextPrefab, transform.position + Vector3.up * 2, Quaternion.identity); bool randomFlyLeft = Random.value > 0.5f; textObj.GetComponent<DamagePopup>().Setup(damage, randomFlyLeft, false); } if (controller.isGrounded) StartCoroutine(HitStunCoroutine()); UpdateHealthUI(); // Обновляем UI if (currentHealth <= 0) { if (!controller.isGrounded) waitingToDieOnLand = true; else Die(); } } void Die() { if (isDead) return; isDead = true; if (anim != null) anim.SetTrigger("Die"); if (playerMovement != null) playerMovement.enabled = false; if (playerCombat != null) playerCombat.enabled = false; if (controller != null) controller.enabled = false; } private IEnumerator HitStunCoroutine() { if (playerMovement != null && playerMovement.isRolling) yield break; if (playerMovement != null) playerMovement.canMove = false; if (anim != null) anim.SetTrigger("Hit"); yield return new WaitForSeconds(0.25f); if (playerMovement != null) playerMovement.canMove = true; } }