74 lines
1.9 KiB
C#
74 lines
1.9 KiB
C#
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
public class PlayerHealthUI : MonoBehaviour
|
|
{
|
|
[Header("Ссылки")]
|
|
public PlayerHealth playerHealth;
|
|
public Slider healthSlider;
|
|
public Image healthFillImage;
|
|
public Text healthText;
|
|
|
|
[Header("Настройки визуала")]
|
|
public bool smoothTransition = true;
|
|
public float smoothSpeed = 5f;
|
|
public bool changeColorWithHealth = true;
|
|
public Color highHealthColor = new Color(0.2f, 0.85f, 0.3f, 1f); // Зеленый
|
|
public Color lowHealthColor = new Color(0.9f, 0.2f, 0.2f, 1f); // Красный
|
|
|
|
private float currentFill = 1f;
|
|
|
|
void Start()
|
|
{
|
|
if (playerHealth == null)
|
|
{
|
|
playerHealth = FindAnyObjectByType<PlayerHealth>();
|
|
}
|
|
|
|
UpdateHealthUI(true);
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
UpdateHealthUI(false);
|
|
}
|
|
|
|
private void UpdateHealthUI(bool immediate)
|
|
{
|
|
if (playerHealth == null) return;
|
|
|
|
float maxHp = playerHealth.maxHealth;
|
|
float currentHp = Mathf.Max(0f, playerHealth.CurrentHealth);
|
|
float targetFill = maxHp > 0f ? currentHp / maxHp : 0f;
|
|
|
|
if (immediate || !smoothTransition)
|
|
{
|
|
currentFill = targetFill;
|
|
}
|
|
else
|
|
{
|
|
currentFill = Mathf.MoveTowards(currentFill, targetFill, smoothSpeed * Time.deltaTime);
|
|
}
|
|
|
|
if (healthSlider != null)
|
|
{
|
|
healthSlider.value = currentFill;
|
|
}
|
|
|
|
if (healthFillImage != null)
|
|
{
|
|
healthFillImage.fillAmount = currentFill;
|
|
|
|
if (changeColorWithHealth)
|
|
{
|
|
healthFillImage.color = Color.Lerp(lowHealthColor, highHealthColor, currentFill);
|
|
}
|
|
}
|
|
|
|
if (healthText != null)
|
|
{
|
|
healthText.text = $"{Mathf.CeilToInt(currentHp)} / {Mathf.CeilToInt(maxHp)}";
|
|
}
|
|
}
|
|
}
|