// NOTE: 此文件包含 MapPinManager 类,但文件名为 MapPin.cs(历史遗留,Unity .meta 绑定限制不可安全重命名)。
// 如需搜索,请搜索 "MapPinManager" 类名,而非文件名。
using System.Collections.Generic;
using UnityEngine;
using BaseGames.Core;
using BaseGames.Core.Save;
namespace BaseGames.World.Map
{
/// 标记类型与显示精灵的映射表项(从 MapPanel 移入,与数据同文件管理)。
[System.Serializable]
public class PinSpriteEntry
{
public PinType PinType;
public Sprite Sprite;
}
///
/// 地图自定义标记管理器(架构 15_MapShopModule §1.5)。
/// 实现 和 ,通过 ServiceLocator 对外暴露。
///
/// 每次 Pin 集合变化时自增,外部消费方(MapPanel)
/// 可通过版本号判断是否需要重绘,避免无效 Instantiate。
///
/// MapPin/PinType 数据类定义在 SaveData.cs(BaseGames.Core.Save)中,避免循环依赖。
///
public class MapPinManager : MonoBehaviour, ISaveable, IPinService
{
private List _pins = new();
public IReadOnlyList Pins => _pins;
/// 每次 Pin 集合发生变化时自增;外部消费方通过此版本号实现脏检查。
public int PinsVersion { get; private set; }
private void OnEnable()
{
ServiceLocator.GetOrDefault()?.Register(this);
ServiceLocator.Register(this);
}
private void OnDisable()
{
ServiceLocator.GetOrDefault()?.Unregister(this);
ServiceLocator.Unregister(this);
}
// ── 公共 API ──────────────────────────────────────────────────────────
public void AddPin(MapPin pin)
{
if (pin != null) { _pins.Add(pin); PinsVersion++; }
}
public void RemovePin(MapPin pin)
{
if (_pins.Remove(pin)) PinsVersion++;
}
/// 便捷方法:用枚举类型创建并添加标记。
public MapPin CreatePin(string roomId, float normX, float normY,
PinType type = PinType.Marker, string note = "")
{
var pin = new MapPin
{
RoomId = roomId,
NormalizedPosX = normX,
NormalizedPosY = normY,
PinTypeInt = (int)type,
Note = note,
};
AddPin(pin);
return pin;
}
// ── ISaveable ─────────────────────────────────────────────────────────
public void OnSave(SaveData data) => data.Map.Pins = _pins;
public void OnLoad(SaveData data)
{
_pins = data.Map.Pins ?? new List();
PinsVersion++; // 加载存档后通知消费方重绘
}
}
}