using Components; using CustomEvent; using Entity; using GameFramework.Event; using TMPro; using UnityEngine; using UnityEngine.UI; namespace UI { public class HudForm : UGuiForm { [SerializeField] private float _sliderFadeDuration = 0.5f; [SerializeField] private Slider _hpSlider; [SerializeField] private TMP_Text _hpText; private float _currentHpPercent = 0; private Coroutine _hpSliderFadeCoroutine; [SerializeField] private Slider _expSlider; private float _currentExpPercent = 0; private Coroutine _expSliderFadeCoroutine; [SerializeField] private TMP_Text _expText; private int _playerCurrentLevel = 1; [SerializeField] private TMP_Text _coinText; private int _currentCoin = 0; public void RefreshUI(HudFormContext hudFormContext) { } #region FSM protected override void OnInit(object userData) { base.OnInit(userData); GameEntry.Event.Subscribe(PlayerHealthChangeEventArgs.EventId, PlayerHpChange); GameEntry.Event.Subscribe(PlayerExpChangeEventArgs.EventId, PlayerExpChange); GameEntry.Event.Subscribe(PlayerCoinChangeEventArgs.EventId, PlayerCoinChange); GameEntry.Event.Subscribe(PlayerLevelUpEventArgs.EventId, PlayerLevelUp); } protected override void OnClose(bool isShutdown, object userData) { GameEntry.Event.Unsubscribe(PlayerLevelUpEventArgs.EventId, PlayerLevelUp); GameEntry.Event.Unsubscribe(PlayerHealthChangeEventArgs.EventId, PlayerHpChange); GameEntry.Event.Unsubscribe(PlayerExpChangeEventArgs.EventId, PlayerExpChange); GameEntry.Event.Unsubscribe(PlayerCoinChangeEventArgs.EventId, PlayerCoinChange); base.OnClose(isShutdown, userData); } #endregion #region Event Handlers private void PlayerHpChange(object sender, GameEventArgs e) { if (!(e is PlayerHealthChangeEventArgs args)) return; _hpText.text = $"{args.CurrentHealth}/{args.MaxHealth}"; float percent = (float)args.CurrentHealth / args.MaxHealth; if (Mathf.Approximately(_currentHpPercent, percent)) return; _currentHpPercent = percent; if (_hpSliderFadeCoroutine != null) StopCoroutine(_hpSliderFadeCoroutine); _hpSliderFadeCoroutine = StartCoroutine(_hpSlider.SmoothValue(percent, _sliderFadeDuration)); } private void PlayerExpChange(object sender, GameEventArgs e) { if (!(e is PlayerExpChangeEventArgs args)) return; float percent = (float)args.CurrentExp / args.MaxExp; if (Mathf.Approximately(_currentExpPercent, percent)) return; _currentExpPercent = percent; if (_expSliderFadeCoroutine != null) StopCoroutine(_expSliderFadeCoroutine); _expSliderFadeCoroutine = StartCoroutine(_expSlider.SmoothValue(percent, _sliderFadeDuration)); } private void PlayerLevelUp(object sender, GameEventArgs e) { if (!(e is PlayerLevelUpEventArgs)) return; _playerCurrentLevel++; _expText.text = $"LV.{_playerCurrentLevel}"; } private void PlayerCoinChange(object sender, GameEventArgs e) { if (!(e is PlayerCoinChangeEventArgs args)) return; if (_currentCoin == args.CoinCount) return; _coinText.text = $" {args.CoinCount}"; _currentCoin = args.CoinCount; } #endregion #region Test private Player _player; public void CauseDamageToPlayer() { if (_player == null) { _player = FindObjectOfType(); } if (_player == null) return; _player.GetComponent().TakeDamage(2); } #endregion } }