Files
zeling_v2/Assets/_Game/Scripts/World/WorldStateRegistrySaver.cs
T

49 lines
2.0 KiB
C#

using BaseGames.Core.Save;
namespace BaseGames.World
{
/// <summary>
/// 将 WorldStateRegistry 接入 ISaveable 存档管道的桥接组件。
///
/// 挂载位置:Persistent 场景的根 GameObject(与 GameServiceRegistrar 同级)。
/// 需在 Inspector 中绑定场景中唯一的 WorldStateRegistry ScriptableObject 资源。
///
/// OnSave:从 Registry 读取 Collectible / Destroyed / Door / Flag 四个分类,写入 SaveData。
/// 每个分类在写入前先 Clear,确保运行时删除的状态不会残留在存档里。
/// OnLoad:将完整的 SaveData 传递给 Registry,恢复所有分类的运行时缓存。
/// 这是 Registry 从空白变为"知道世界状态"的唯一时机。
/// </summary>
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);
data.World.OpenedDoors.Clear();
foreach (var id in _registry.GetAllIds(WorldObjectCategory.Door))
data.World.OpenedDoors.Add(id);
// 清除所有 Flag 后重写,确保运行时 ClearFlag() 的变更能正确落盘
data.EventChains.WorldFlags.Clear();
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);
}
}
}