// 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++; // 加载存档后通知消费方重绘 } } }