Files
Cielonos/Assets/Scripts/MainGame/UI/PlayerUI/EnemyInfo/BossInfo/BossInfoUnit.cs
SoulliesOfficial 9a9e48f8a5
2026-06-27 12:52:03 -04:00

98 lines
4.1 KiB
C#

using Cielonos.MainGame;
using Cielonos.MainGame.Buffs;
using Cielonos.MainGame.Buffs.Character;
using Cielonos.MainGame.Characters;
using SLSUtilities.General;
using SLSUtilities.UI;
using TMPro;
using UnityEngine;
using UnityEngine.Serialization;
namespace Cielonos.MainGame.UI
{
public class BossInfoUnit : UIElementBase
{
public CharacterBase boss;
public TMP_Text nameText;
public RectTransform barContainer;
public BossHealthBar healthBar;
[FormerlySerializedAs("armorBar")] public BossStanceBar stanceBar;
public BossEnergyBar energyBar;
[Header("Colors")]
public Color normalStanceColor = new Color(1f, 0.78f, 0.58f);
public Color paralyzedStanceColor = new Color(1f, 0.3f, 0.3f);
public void Initialize(CharacterBase character)
{
boss = character;
nameText.text = "Nexus Crab"; //TODO: 后续改为读取角色名称
// Subscribe to character attribute events
boss.eventSm.onHealthChanged.InsertByPriority("BossInfoUI_UpdateHealth", new PrioritizedAction<float>(_ => UpdateHealth(false)));
boss.eventSm.onEnergyChanged.InsertByPriority("BossInfoUI_UpdateEnergy", new PrioritizedAction<float>(_ => UpdateEnergy(false)));
boss.eventSm.onStanceChanged.InsertByPriority("BossInfoUI_UpdateStance", new PrioritizedAction<float>(_ => UpdateStance(false)));
UpdateHealth(true);
UpdateStance(true);
UpdateEnergy(true);
}
private void OnDestroy()
{
if (boss != null && boss.eventSm != null)
{
boss.eventSm.onHealthChanged.Remove("BossInfoUI_UpdateHealth");
boss.eventSm.onEnergyChanged.Remove("BossInfoUI_UpdateEnergy");
boss.eventSm.onStanceChanged.Remove("BossInfoUI_UpdateStance");
}
}
public void UpdateHealth(bool isInstant = false)
{
float currentHealth = boss.attributeSm[CharacterAttribute.Health];
float maximumHealth = boss.attributeSm[CharacterAttribute.MaximumHealth];
float ratio = currentHealth / maximumHealth;
Color fillColor = healthBar.GetTargetColor(ratio);
healthBar.UpdateFillImage(currentHealth, maximumHealth);
//healthBar.UpdateFillColor(fillColor, isInstant);
if(!isInstant) healthBar.Blink(Color.white);
}
public void UpdateStance(bool isInstant = false)
{
if (stanceBar == null) return;
if (!boss.attributeSm.Has(CharacterAttribute.MaximumStance) || boss.attributeSm[CharacterAttribute.MaximumStance] <= 0)
{
if (stanceBar.gameObject.activeSelf) stanceBar.gameObject.SetActive(false);
return;
}
if (!stanceBar.gameObject.activeSelf) stanceBar.gameObject.SetActive(true);
if (boss.buffSm.TryGetBuff(out ElectronicParalysis buff) && buff.independentStackSubmodule.totalStackAmount > 0)
{
float remainingTime = buff.independentStackSubmodule.LongestUnit.remainingTime;
float maximumTime = buff.independentStackSubmodule.LongestUnit.duration;
stanceBar.UpdateFillColor(paralyzedStanceColor, true);
float elapsed = maximumTime - remainingTime;
stanceBar.UpdateFillImage(elapsed, maximumTime);
}
else
{
float currentStance = boss.attributeSm[CharacterAttribute.Stance];
float maximumStance = boss.attributeSm[CharacterAttribute.MaximumStance];
stanceBar.UpdateFillColor(normalStanceColor, true);
stanceBar.UpdateFillImage(currentStance, maximumStance);
}
}
public void UpdateEnergy(bool isInstant = false)
{
float currentEnergy = boss.attributeSm[CharacterAttribute.Energy];
float maximumEnergy = boss.attributeSm[CharacterAttribute.MaximumEnergy];
energyBar.UpdateFillImage(currentEnergy, maximumEnergy);
if(!isInstant) energyBar.Blink(Color.white);
}
}
}