Files
zeling_v2/Assets/_Game/Scripts/World/WorldStateRegistrySaver.cs
2026-05-20 15:10:35 +08:00

43 lines
1.7 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 / Flag 三个分类,写入 SaveData。
/// SavePoint 和 Door 两个分类由各自的 SaveableMonoBehaviour 独立写入,此处跳过。
/// 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);
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);
}
}
}