using UnityEngine; using UnityEngine.UI; using GeometryTD.CustomEvent; using GeometryTD.Procedure; namespace GeometryTD.UI { public class NodeItem : MonoBehaviour { private const string CombatIconAssetName = "Combat"; private const string EventIconAssetName = "Event"; private const string ShopIconAssetName = "Shop"; private const string BossIconAssetName = "BossCombat"; [SerializeField] private Image _icon; [SerializeField] private Image _bg; [SerializeField] private CommonButton _button; [SerializeField] private Color _lockedColor = Color.gray; [SerializeField] private Color _activeColor = Color.cyan; [SerializeField] private Color _passedColor = Color.green; [SerializeField] private Color _exceptionColor = Color.red; [SerializeField] private Color _defaultIconColor = Color.white; [SerializeField] private Color _lockedIconColor = Color.gray; private NodeItemContext _context; private string _requestedIconAssetName; public void RefreshUI(NodeItemContext context) { _context = context; if (_button != null) { _button.Interactive = context != null && context.CanClick; } Color targetColor = _lockedColor; if (context == null) { targetColor = _lockedColor; } else if (context.IsCompleted) { targetColor = _passedColor; } else if (context.IsException) { targetColor = _exceptionColor; } else if (context.IsCurrent) { targetColor = _activeColor; } if (_bg != null) { _bg.color = targetColor; } if (_icon != null) { RefreshIcon(context != null ? context.NodeType : RunNodeType.None); _icon.color = context != null && !context.IsLocked ? _defaultIconColor : _lockedIconColor; } } public void OnClick() { if (_context == null || !_context.CanClick) { return; } GameEntry.Event.Fire(this, NodeMapNodeClickEventArgs.Create(_context.SequenceIndex)); } private void RefreshIcon(RunNodeType nodeType) { if (_icon == null) { return; } string assetName = ResolveIconAssetName(nodeType); _requestedIconAssetName = assetName; if (string.IsNullOrWhiteSpace(assetName) || GameEntry.SpriteCache == null) { _icon.sprite = null; return; } GameEntry.SpriteCache.GetSprite(assetName, sprite => { if (_icon == null || _requestedIconAssetName != assetName) { return; } _icon.sprite = sprite; }); } private static string ResolveIconAssetName(RunNodeType nodeType) { switch (nodeType) { case RunNodeType.Combat: return CombatIconAssetName; case RunNodeType.Event: return EventIconAssetName; case RunNodeType.Shop: return ShopIconAssetName; case RunNodeType.BossCombat: return BossIconAssetName; default: return null; } } } }