98 lines
3.0 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |