43 lines
1.7 KiB
C#
43 lines
1.7 KiB
C#
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);
|
||
}
|
||
}
|
||
}
|