using BaseGames.Core.Save; namespace BaseGames.World { /// /// 将 WorldStateRegistry 接入 ISaveable 存档管道的桥接组件。 /// /// 挂载位置:Persistent 场景的根 GameObject(与 GameServiceRegistrar 同级)。 /// 需在 Inspector 中绑定场景中唯一的 WorldStateRegistry ScriptableObject 资源。 /// /// OnSave:从 Registry 读取 Collectible / Destroyed / Flag 三个分类,写入 SaveData。 /// SavePoint 和 Door 两个分类由各自的 SaveableMonoBehaviour 独立写入,此处跳过。 /// OnLoad:将完整的 SaveData 传递给 Registry,恢复所有分类的运行时缓存。 /// 这是 Registry 从空白变为"知道世界状态"的唯一时机。 /// public class WorldStateRegistrySaver : SaveableMonoBehaviour { [UnityEngine.SerializeField] private WorldStateRegistry _registry; public override void OnSave(SaveData data) { if (_registry == null) return; data.World.CollectedIds.Clear(); foreach (var id in _registry.GetAllIds(WorldObjectCategory.Collectible)) data.World.CollectedIds.Add(id); data.World.DestroyedObjectIds.Clear(); foreach (var id in _registry.GetAllIds(WorldObjectCategory.Destroyed)) data.World.DestroyedObjectIds.Add(id); foreach (var id in _registry.GetAllIds(WorldObjectCategory.Flag)) data.EventChains.WorldFlags[id] = true; } public override void OnLoad(SaveData data) { if (_registry == null) return; _registry.LoadFromSave(data); } } }