using System.Collections; using Sirenix.OdinInspector; using TMPro; using UnityEngine; using UnityEngine.UI; namespace BlueWater.Uis { public class FieldBossHealthPointUi : MonoBehaviour { [SerializeField, Required] private Slider _slider; [SerializeField, Required] private TMP_Text _nameText; [SerializeField, Required] private Slider _damageEffectSlider; [SerializeField] private float _duration = 1f; private Coroutine _damageEffectCoroutineInstance; private bool _isInitialized; [Button("컴포넌트 초기화")] private void InitializeComponents() { _slider = GetComponent(); _nameText = transform.Find("NameText").GetComponent(); _damageEffectSlider = transform.Find("Background/DamageEffectSlider").GetComponent(); } private void Awake() { SetActiveHpSlider(false); } public void SetBoss(int maxHp, string bossName) { if (!_slider || !_damageEffectSlider) return; if (_damageEffectCoroutineInstance != null) { StopCoroutine(_damageEffectCoroutineInstance); _damageEffectCoroutineInstance = null; } _slider.maxValue = maxHp; _damageEffectSlider.maxValue = maxHp; _slider.value = maxHp; _damageEffectSlider.value = maxHp; _nameText.text = _nameText ? bossName : null; SetActiveHpSlider(true); } public void SetCurrentHealthPoint(int value, string bossName) { if (!_slider || !_damageEffectSlider) return; if (!string.IsNullOrEmpty(bossName) && !_nameText.text.Equals(bossName)) { _nameText.text = bossName; } _damageEffectCoroutineInstance = StartCoroutine(DamageEffect(value)); } private IEnumerator DamageEffect(int value) { var previousHp = _slider.value; var tick = (previousHp - value) / _duration; _slider.value = value; while (_damageEffectSlider.value > value) { _damageEffectSlider.value -= tick * Time.deltaTime; yield return null; } _damageEffectSlider.value = value; if (_damageEffectSlider.value == 0) { SetActiveHpSlider(false); } } public void SetActiveHpSlider(bool value) => gameObject.SetActive(value); } }