95 lines
2.7 KiB
C#
95 lines
2.7 KiB
C#
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<Slider>();
|
|
_nameText = transform.Find("NameText").GetComponent<TMP_Text>();
|
|
_damageEffectSlider = transform.Find("Background/DamageEffectSlider").GetComponent<Slider>();
|
|
}
|
|
|
|
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);
|
|
}
|
|
} |