存档完善和修复
This commit is contained in:
@@ -17,8 +17,9 @@ namespace BaseGames.World
|
||||
|
||||
/// <summary>
|
||||
/// 运行时世界状态缓存。ScriptableObject,通过 [SerializeField] 注入各组件。
|
||||
/// SaveManager.SaveAsync 调用 GetAllFlags();
|
||||
/// SaveManager.LoadAsync 调用 LoadFromSave(data.World)。
|
||||
/// WorldStateRegistrySaver(ISaveable)负责将本对象与存档管道连接:
|
||||
/// SaveAsync → WorldStateRegistrySaver.OnSave → 写出全部分类到 SaveData;
|
||||
/// LoadAsync → WorldStateRegistrySaver.OnLoad → 调用 LoadFromSave(data) 恢复缓存。
|
||||
/// </summary>
|
||||
[CreateAssetMenu(menuName = "BaseGames/World/WorldStateRegistry")]
|
||||
public class WorldStateRegistry : ScriptableObject
|
||||
@@ -77,37 +78,34 @@ namespace BaseGames.World
|
||||
|
||||
// ── Persistence ───────────────────────────────────────────────────────
|
||||
|
||||
/// <summary>从存档数据恢复全部状态。由 SaveManager.LoadAsync 调用。</summary>
|
||||
public void LoadFromSave(WorldSaveData data)
|
||||
/// <summary>
|
||||
/// 从存档数据恢复全部状态。由 WorldStateRegistrySaver.OnLoad 调用。
|
||||
/// </summary>
|
||||
public void LoadFromSave(SaveData data)
|
||||
{
|
||||
_states.Clear();
|
||||
|
||||
if (data == null) return;
|
||||
|
||||
foreach (var id in data.CollectedIds) Mark(WorldObjectCategory.Collectible, id);
|
||||
foreach (var id in data.ActivatedSavePoints) Mark(WorldObjectCategory.SavePoint, id);
|
||||
foreach (var id in data.OpenedDoors) Mark(WorldObjectCategory.Door, id);
|
||||
foreach (var id in data.DestroyedObjectIds) Mark(WorldObjectCategory.Destroyed, id);
|
||||
foreach (var id in data.World.CollectedIds) Mark(WorldObjectCategory.Collectible, id);
|
||||
foreach (var id in data.World.ActivatedSavePoints) Mark(WorldObjectCategory.SavePoint, id);
|
||||
foreach (var id in data.World.OpenedDoors) Mark(WorldObjectCategory.Door, id);
|
||||
foreach (var id in data.World.DestroyedObjectIds) Mark(WorldObjectCategory.Destroyed, id);
|
||||
|
||||
if (data.Switches != null)
|
||||
foreach (var kv in data.Switches)
|
||||
if (data.EventChains?.WorldFlags != null)
|
||||
foreach (var kv in data.EventChains.WorldFlags)
|
||||
if (kv.Value) Mark(WorldObjectCategory.Flag, kv.Key);
|
||||
}
|
||||
|
||||
/// <summary>获取所有通用标记,供 SaveManager 持久化。</summary>
|
||||
public HashSet<string> GetAllFlags()
|
||||
/// <summary>
|
||||
/// 返回指定分类中所有已标记的 ID(快照副本)。
|
||||
/// 由 WorldStateRegistrySaver.OnSave 调用,将运行时状态写入 SaveData。
|
||||
/// </summary>
|
||||
public IReadOnlyCollection<string> GetAllIds(WorldObjectCategory category)
|
||||
{
|
||||
if (_states.TryGetValue(WorldObjectCategory.Flag, out var flags))
|
||||
return new HashSet<string>(flags);
|
||||
return new HashSet<string>();
|
||||
}
|
||||
|
||||
/// <summary>获取所有已摧毁对象 ID,供 SaveManager 持久化。</summary>
|
||||
public HashSet<string> GetAllDestroyedIds()
|
||||
{
|
||||
if (_states.TryGetValue(WorldObjectCategory.Destroyed, out var set))
|
||||
if (_states.TryGetValue(category, out var set))
|
||||
return new HashSet<string>(set);
|
||||
return new HashSet<string>();
|
||||
return System.Array.Empty<string>();
|
||||
}
|
||||
|
||||
/// <summary>重置所有状态(开始新游戏时调用)。</summary>
|
||||
|
||||
Reference in New Issue
Block a user