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

49 lines
2.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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);
}
}
}