您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
56 行
1.5 KiB
56 行
1.5 KiB
using UnityEngine;
|
|
|
|
public class UIHealthBarManager : MonoBehaviour
|
|
{
|
|
[SerializeField] private HealthSO _protagonistHealth = default; //the HealthBar is watching this object, which is the health of the player
|
|
[SerializeField] private HealthConfigSO _healthConfig = default;
|
|
[SerializeField] private UIHeartDisplay[] _heartImages = default;
|
|
|
|
[Header("Listening to")]
|
|
[SerializeField] private VoidEventChannelSO _UIUpdateNeeded = default; //The player's Damageable issues this
|
|
|
|
private void OnEnable()
|
|
{
|
|
_UIUpdateNeeded.OnEventRaised += UpdateHeartImages;
|
|
|
|
InitializeHealthBar();
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
_UIUpdateNeeded.OnEventRaised -= UpdateHeartImages;
|
|
}
|
|
|
|
private void InitializeHealthBar()
|
|
{
|
|
_protagonistHealth.SetMaxHealth(_healthConfig.InitialHealth);
|
|
_protagonistHealth.SetCurrentHealth(_healthConfig.InitialHealth);
|
|
|
|
UpdateHeartImages();
|
|
}
|
|
|
|
private void UpdateHeartImages()
|
|
{
|
|
int heartValue = _protagonistHealth.MaxHealth / _heartImages.Length;
|
|
int filledHeartCount = Mathf.FloorToInt((float)_protagonistHealth.CurrentHealth / heartValue);
|
|
|
|
for (int i = 0; i < _heartImages.Length; i++)
|
|
{
|
|
float heartPercent = 0;
|
|
|
|
if (i < filledHeartCount)
|
|
{
|
|
heartPercent = 1;
|
|
}
|
|
else if (i == filledHeartCount)
|
|
{
|
|
heartPercent = ((float)_protagonistHealth.CurrentHealth - (float)filledHeartCount * (float)heartValue) / (float)heartValue;
|
|
}
|
|
else
|
|
{
|
|
heartPercent = 0;
|
|
}
|
|
_heartImages[i].SetImage(heartPercent);
|
|
}
|
|
}
|
|
}
|