CapersProject/Assets/02.Scripts/Ui/Combat/PlayerHealthPointUi.cs
2024-11-07 18:13:54 +09:00

98 lines
3.0 KiB
C#

using System.Collections.Generic;
using BlueWater.Tycoons;
using Sirenix.OdinInspector;
using UnityEngine;
namespace BlueWater.Uis
{
public class PlayerHealthPointUi : MonoBehaviour
{
[SerializeField, Required]
private Transform _healthPointLayout;
[SerializeField, Required]
private HealthPoint _healthPointPrefab;
[SerializeField, Range(1, 10)]
private int _maxHeartCount = 2;
[SerializeField]
private List<HealthPoint> _healthPoints = new();
private int _maxHealth;
private void Awake()
{
EventManager.OnMaxHealthChanged += SetMaxHealthPoint;
EventManager.OnHealthChanged += SetCurrentHealthPoint;
InitializeHealthPoint();
}
private void OnDestroy()
{
EventManager.OnMaxHealthChanged -= SetMaxHealthPoint;
EventManager.OnHealthChanged -= SetCurrentHealthPoint;
}
[Button("컴포넌트 초기화")]
private void InitializeComponents()
{
_healthPointLayout = transform.Find("HealthPointLayout");
}
private void InitializeHealthPoint()
{
foreach (Transform element in _healthPointLayout)
{
Destroy(element.gameObject);
}
_healthPoints = new List<HealthPoint>(_maxHeartCount);
for (var i = 0; i < _maxHeartCount; i++)
{
var newHeart = Instantiate(_healthPointPrefab, _healthPointLayout);
_healthPoints.Add(newHeart);
}
}
public void SetMaxHealthPoint(int previousMaxHealthPoint, int changedMaxHealthPoint)
{
_maxHealth = changedMaxHealthPoint;
var addedMaxHealthPoint = _maxHealth - previousMaxHealthPoint;
// _maxHeartCount = Mathf.CeilToInt(changedMaxHealthPoint / 2);
InitializeHealthPoint();
TycoonManager.Instance.TycoonStatus.CurrentPlayerHealth += addedMaxHealthPoint;
}
public void SetCurrentHealthPoint(int changedHealthPoint)
{
var fullHearts = changedHealthPoint / 2;
var existHalfHeart = changedHealthPoint % 2 != 0;
var activeHeart = Mathf.CeilToInt(_maxHealth / 2f);
for (var i = 0; i < _healthPoints.Count; i++)
{
if (i >= activeHeart)
{
_healthPoints[i].Lock();
continue;
}
if (i < fullHearts)
{
_healthPoints[i].SetHeart(HealthHeart.Full);
}
else if (i == fullHearts && existHalfHeart)
{
_healthPoints[i].SetHeart(HealthHeart.Half);
}
else
{
_healthPoints[i].SetHeart(HealthHeart.Empty);
}
}
}
}
}