122 lines
3.6 KiB
C#
122 lines
3.6 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|