71 lines
2.0 KiB
C#
71 lines
2.0 KiB
C#
|
using System.Collections;
|
||
|
using Sirenix.OdinInspector;
|
||
|
using UnityEngine;
|
||
|
using UnityEngine.UI;
|
||
|
|
||
|
// ReSharper disable once CheckNamespace
|
||
|
namespace BlueWaterProject
|
||
|
{
|
||
|
public class HpSlider : MonoBehaviour
|
||
|
{
|
||
|
[SerializeField] private Transform target;
|
||
|
[SerializeField] private Slider slider;
|
||
|
[SerializeField] private Slider damageEffectSlider;
|
||
|
[SerializeField] private float duration = 2f;
|
||
|
[SerializeField] private Vector3 offset = Vector3.up;
|
||
|
|
||
|
[Button("셋팅 초기화")]
|
||
|
private void Init()
|
||
|
{
|
||
|
slider = GetComponent<Slider>();
|
||
|
damageEffectSlider = transform.Find("Fill Area/Background/DamageEffectSlider").GetComponent<Slider>();
|
||
|
}
|
||
|
|
||
|
private void Update()
|
||
|
{
|
||
|
if (!target) return;
|
||
|
|
||
|
transform.position = target.TransformPoint(offset);
|
||
|
}
|
||
|
|
||
|
public void SetHpSlider(Transform target, float maxHp)
|
||
|
{
|
||
|
if (!slider || !damageEffectSlider) return;
|
||
|
|
||
|
this.target = target;
|
||
|
|
||
|
slider.maxValue = maxHp;
|
||
|
damageEffectSlider.maxValue = maxHp;
|
||
|
|
||
|
slider.value = maxHp;
|
||
|
damageEffectSlider.value = maxHp;
|
||
|
|
||
|
SetActiveHpSlider(true);
|
||
|
}
|
||
|
|
||
|
public void UpdateHpSlider(float value)
|
||
|
{
|
||
|
if (!slider || !damageEffectSlider) return;
|
||
|
|
||
|
StartCoroutine(DamageEffect(value));
|
||
|
}
|
||
|
|
||
|
private IEnumerator DamageEffect(float 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;
|
||
|
}
|
||
|
|
||
|
public void SetActiveHpSlider(bool value) => gameObject.SetActive(value);
|
||
|
}
|
||
|
}
|