using System.Collections.Generic;
using UnityEngine;
using BaseGames.Core.Save;
namespace BaseGames.World.Map
{
///
/// 集中管理标记类型(PinType)与对应 Sprite 的映射配置。
/// 替代原先分散在 MapPanel 和 MinimapHUD 中各自维护的 PinSpriteEntry 数组,
/// 两个 UI 组件共享同一资产引用,保证标记外观统一且便于策划修改。
/// 内部使用 惰性缓存,GetSprite 为 O(1) 查找。
///
[CreateAssetMenu(menuName = "BaseGames/World/Map/PinConfig")]
public class MapPinConfigSO : ScriptableObject
{
[SerializeField] private PinSpriteEntry[] _entries;
private Dictionary _cache;
///
/// 根据 PinType 返回对应 Sprite(O(1) 哈希查找)。
/// 首次调用时惰性构建内部字典;entries 中无匹配项时返回 null。
///
public Sprite GetSprite(PinType type)
{
EnsureCache();
return _cache.TryGetValue(type, out var s) ? s : null;
}
private void EnsureCache()
{
if (_cache != null) return;
_cache = new Dictionary();
if (_entries == null) return;
foreach (var e in _entries)
_cache[e.PinType] = e.Sprite;
}
private void OnValidate()
{
// 编辑器修改配置后立即重建缓存,确保 Play Mode 前数据已就绪
_cache = null;
}
}
/// 标记类型与显示精灵的映射表项。
[System.Serializable]
public class PinSpriteEntry
{
public PinType PinType;
public Sprite Sprite;
}
}