using Cysharp.Threading.Tasks; using SepCore.AsyncTask; using SepCore.Definition; using TMPro; using UnityEngine; using UnityEngine.UI; using UnityGameFramework.Runtime; namespace SepCore.UI { public class CharacterSlotItem : MonoBehaviour { [SerializeField] private Image bg; [SerializeField] private Image icon; [SerializeField] private TextMeshProUGUI characterName; [SerializeField] private FormatTextUI hpText; [SerializeField] private FormatTextUI mpText; [SerializeField] private FormatTextUI speedText; [SerializeField] private FormatTextUI atkText; [SerializeField] private FormatTextUI matText; private int _iconVersion = 0; /// /// 用存档角色填充格子;角色配置不存在时按空格子显示。 /// public void SetCharacter(CharacterSave save) { CharacterConfig config = GameEntry.Luban.Get(save.characterId); if (config == null) { Log.Warning("Can not find character config '{0}' for squad slot.", save.characterId); SetEmpty(); return; } characterName.text = config.Name; hpText.Set(config.MaxHp); mpText.Set(config.MaxMp); speedText.Set(config.Speed); atkText.Set(config.Atk); matText.Set(config.Mat); _iconVersion++; ShowIconAsync(config.Icon_Ref, _iconVersion).Forget(); } /// /// 显示为空格子。 /// public void SetEmpty() { _iconVersion++; characterName.text = string.Empty; hpText.Clear(); mpText.Clear(); speedText.Clear(); atkText.Clear(); matText.Clear(); HideIcon(); } private void HideIcon() { if (icon == null) { return; } icon.sprite = null; icon.gameObject.SetActive(false); } /// /// 异步加载角色图标;iconVersion 用于防止复用格子时旧加载结果覆盖新内容。 /// private async UniTaskVoid ShowIconAsync(SpriteConfig iconConfig, int iconVersion) { if (iconConfig == null || icon == null) { return; } Sprite sprite = await SpriteLoader.LoadSpriteAsync(iconConfig); if (sprite == null || _iconVersion != iconVersion) { return; } icon.sprite = sprite; icon.gameObject.SetActive(true); } } }