chore: initial commit

This commit is contained in:
2026-05-08 11:04:00 +08:00
commit f55d2a57c3
6278 changed files with 866081 additions and 0 deletions

View File

@@ -0,0 +1,130 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using BaseGames.Core.Events;
namespace BaseGames.UI.HUD
{
public class HUDController : MonoBehaviour
{
[Header("HP")]
[SerializeField] private Transform _hpContainer;
[SerializeField] private GameObject _hpCellPrefab;
[Header("Gauges")]
[SerializeField] private Image _soulGaugeFill;
[SerializeField] private Image _spiritGaugeFill;
[SerializeField] private TMP_Text _geoText;
[Header("Spring Charges")]
[SerializeField] private Transform _springContainer;
[SerializeField] private GameObject _springIconPrefab;
[Header("Form")]
[SerializeField] private Image[] _formIcons;
[Header("Interact Prompt")]
[SerializeField] private TMP_Text _interactText;
[SerializeField] private GameObject _interactPromptRoot;
[Header("Event Channels - Subscribe")]
[SerializeField] private IntEventChannelSO _onHPChanged;
[SerializeField] private IntEventChannelSO _onMaxHPChanged;
[SerializeField] private IntEventChannelSO _onSoulPowerChanged;
[SerializeField] private IntEventChannelSO _onSpiritPowerChanged;
[SerializeField] private IntEventChannelSO _onGeoChanged;
[SerializeField] private IntEventChannelSO _onSpringChargesChanged;
[SerializeField] private IntEventChannelSO _onFormChanged;
[SerializeField] private StringEventChannelSO _onShowInteractPrompt;
[SerializeField] private VoidEventChannelSO _onHideInteractPrompt;
private readonly List<GameObject> _hpCells = new();
private readonly List<GameObject> _springIcons = new();
private void OnEnable()
{
if (_onHPChanged != null) _onHPChanged.OnEventRaised += UpdateHP;
if (_onMaxHPChanged != null) _onMaxHPChanged.OnEventRaised += RebuildHPCells;
if (_onSoulPowerChanged != null) _onSoulPowerChanged.OnEventRaised += UpdateSoul;
if (_onSpiritPowerChanged != null) _onSpiritPowerChanged.OnEventRaised += UpdateSpirit;
if (_onGeoChanged != null) _onGeoChanged.OnEventRaised += UpdateGeo;
if (_onSpringChargesChanged != null) _onSpringChargesChanged.OnEventRaised += RebuildSpringIcons;
if (_onFormChanged != null) _onFormChanged.OnEventRaised += UpdateFormIcon;
if (_onShowInteractPrompt != null) _onShowInteractPrompt.OnEventRaised += ShowInteractPrompt;
if (_onHideInteractPrompt != null) _onHideInteractPrompt.OnEventRaised += HideInteractPrompt;
}
private void OnDisable()
{
if (_onHPChanged != null) _onHPChanged.OnEventRaised -= UpdateHP;
if (_onMaxHPChanged != null) _onMaxHPChanged.OnEventRaised -= RebuildHPCells;
if (_onSoulPowerChanged != null) _onSoulPowerChanged.OnEventRaised -= UpdateSoul;
if (_onSpiritPowerChanged != null) _onSpiritPowerChanged.OnEventRaised -= UpdateSpirit;
if (_onGeoChanged != null) _onGeoChanged.OnEventRaised -= UpdateGeo;
if (_onSpringChargesChanged != null) _onSpringChargesChanged.OnEventRaised -= RebuildSpringIcons;
if (_onFormChanged != null) _onFormChanged.OnEventRaised -= UpdateFormIcon;
if (_onShowInteractPrompt != null) _onShowInteractPrompt.OnEventRaised -= ShowInteractPrompt;
if (_onHideInteractPrompt != null) _onHideInteractPrompt.OnEventRaised -= HideInteractPrompt;
}
private void UpdateHP(int current)
{
for (int i = 0; i < _hpCells.Count; i++)
if (_hpCells[i] != null) _hpCells[i].SetActive(i < current);
}
private void RebuildHPCells(int max)
{
foreach (var cell in _hpCells)
if (cell != null) Destroy(cell);
_hpCells.Clear();
if (_hpContainer == null || _hpCellPrefab == null) return;
for (int i = 0; i < max; i++)
_hpCells.Add(Instantiate(_hpCellPrefab, _hpContainer));
}
private void UpdateSoul(int val)
{
if (_soulGaugeFill != null) _soulGaugeFill.fillAmount = val / 100f;
}
private void UpdateSpirit(int val)
{
if (_spiritGaugeFill != null) _spiritGaugeFill.fillAmount = val / 100f;
}
private void UpdateGeo(int val)
{
if (_geoText != null) _geoText.text = val.ToString();
}
private void RebuildSpringIcons(int charges)
{
foreach (var icon in _springIcons)
if (icon != null) Destroy(icon);
_springIcons.Clear();
if (_springContainer == null || _springIconPrefab == null) return;
for (int i = 0; i < charges; i++)
_springIcons.Add(Instantiate(_springIconPrefab, _springContainer));
}
private void UpdateFormIcon(int formIndex)
{
if (_formIcons == null) return;
for (int i = 0; i < _formIcons.Length; i++)
if (_formIcons[i] != null) _formIcons[i].enabled = (i == formIndex);
}
private void ShowInteractPrompt(string text)
{
if (_interactText != null) _interactText.text = text;
if (_interactPromptRoot != null) _interactPromptRoot.SetActive(true);
}
private void HideInteractPrompt()
{
if (_interactPromptRoot != null) _interactPromptRoot.SetActive(false);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 533b885673d509d419e441a7264261a7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: