98 lines
4.1 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|