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(_ => UpdateHealth(false))); boss.eventSm.onEnergyChanged.InsertByPriority("BossInfoUI_UpdateEnergy", new PrioritizedAction(_ => UpdateEnergy(false))); boss.eventSm.onStanceChanged.InsertByPriority("BossInfoUI_UpdateStance", new PrioritizedAction(_ => 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); } } }