using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.UI; public class StatusUI : MonoBehaviour { public StatusIconUI iconPrefab; private BattleParticipant battleParticipant; private BattleState battleState; private Dictionary statusIcons; private Dictionary buffIcons; public void Init(BattleParticipant battleParticipant, BattleState battleState) { this.battleParticipant = battleParticipant; this.battleState = battleState; this.statusIcons = new Dictionary(); this.buffIcons = new Dictionary(); this.battleParticipant.OnStatusChanged += this.NotifyBattleStatusOrBuffsChanged; this.battleParticipant.OnBuffsChanged += this.NotifyBattleStatusOrBuffsChanged; } // Start is called before the first frame update void Start() { UpdateAppearance(); } public void NotifyBattleStatusOrBuffsChanged(BattleParticipant updatedParticipant) { if (updatedParticipant != this.battleParticipant) { throw new System.InvalidOperationException( "NotifyBattleStatusOrBuffsChanged was notified about a different participant."); } UpdateAppearance(); } private void UpdateAppearance() { int index = 0; foreach (BattleStatus status in Enum.GetValues(typeof(BattleStatus)).Cast()) { if (status == BattleStatus.None) { continue; } StatusIconUI iconUI = null; this.statusIcons.TryGetValue(status, out iconUI); if (this.battleParticipant.HasStatus(status)) { if (iconUI == null) { iconUI = Instantiate(this.iconPrefab.gameObject, this.transform).GetComponent(); iconUI.InitStatus(status); this.statusIcons[status] = iconUI; } iconUI.UpdateStatusAmount(this.battleParticipant.GetStatusAmount(status)); iconUI.SetPosition(index++); } else { if (iconUI != null) { Destroy(iconUI.gameObject); this.statusIcons.Remove(status); } } } Dictionary previousBuffIcons = new Dictionary(this.buffIcons); List currentBuffs = this.battleState.BuffManager.GetAllBuffsFor(this.battleParticipant); foreach (Buff buff in currentBuffs) { StatusIconUI iconUI = null; previousBuffIcons.TryGetValue(buff, out iconUI); if (iconUI == null) { iconUI = Instantiate(this.iconPrefab.gameObject, this.transform).GetComponent(); iconUI.InitBuff(buff); this.buffIcons[buff] = iconUI; } else { previousBuffIcons.Remove(buff); } iconUI.SetPosition(index++); } // If a buff is left in previousBuffIcons, it has been removed. foreach (KeyValuePair p in previousBuffIcons) { Buff buff = p.Key; StatusIconUI iconUI = p.Value; Destroy(iconUI.gameObject); this.buffIcons.Remove(buff); } } }