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 _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(_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); } } } } }