diff --git a/Assets/_Game/Scripts/Core/Save/GameSaveManager.cs b/Assets/_Game/Scripts/Core/Save/GameSaveManager.cs
index 551b6bf..70cf6c5 100644
--- a/Assets/_Game/Scripts/Core/Save/GameSaveManager.cs
+++ b/Assets/_Game/Scripts/Core/Save/GameSaveManager.cs
@@ -51,7 +51,17 @@ namespace BaseGames.Core.Save
}
// ── ISaveable 注册 ────────────────────────────────────────────────────
- public void Register(ISaveable s) => _saveables.Add(s);
+ ///
+ /// 注册 ISaveable。若当前已有存档数据(_current != null),
+ /// 立即对该组件补发 OnLoad,使跨场景延迟注册的组件也能正确恢复状态。
+ ///
+ public void Register(ISaveable s)
+ {
+ if (!_saveables.Add(s)) return;
+ if (_current != null)
+ s.OnLoad(_current);
+ }
+
public void Unregister(ISaveable s) => _saveables.Remove(s);
// ── 游玩时间追踪 ──────────────────────────────────────────────────────
diff --git a/Assets/_Game/Scripts/Equipment/EquipmentManager.cs b/Assets/_Game/Scripts/Equipment/EquipmentManager.cs
index d60c3ce..4cf0841 100644
--- a/Assets/_Game/Scripts/Equipment/EquipmentManager.cs
+++ b/Assets/_Game/Scripts/Equipment/EquipmentManager.cs
@@ -26,16 +26,29 @@ namespace BaseGames.Equipment
[SerializeField] private CharmEventChannelSO _onCharmUnequipped;
[SerializeField] private VoidEventChannelSO _onEquipmentChanged;
+ [Tooltip("AchievementManager 解锁授予凹槽成就时发布;订阅后调用 IncreaseNotches(1)。")]
+ [SerializeField] private VoidEventChannelSO _onAchievementNotchGranted;
+
private readonly List _equipped = new(4);
private readonly List _collected = new(32);
private int _currentNotchCapacity;
private int _usedNotches;
private EquipmentContext _ctx;
+ private readonly CompositeDisposable _subs = new();
// ── 生命周期 ──────────────────────────────────────────────────────────
- private void OnEnable() => ServiceLocator.GetOrDefault()?.Register(this);
- private void OnDisable() => ServiceLocator.GetOrDefault()?.Unregister(this);
+ private void OnEnable()
+ {
+ ServiceLocator.GetOrDefault()?.Register(this);
+ _onAchievementNotchGranted?.Subscribe(() => IncreaseNotches(1)).AddTo(_subs);
+ }
+
+ private void OnDisable()
+ {
+ ServiceLocator.GetOrDefault()?.Unregister(this);
+ _subs.Clear();
+ }
private void Awake()
{
diff --git a/Assets/_Game/Scripts/Progression/AchievementManager.cs b/Assets/_Game/Scripts/Progression/AchievementManager.cs
index abd4a6e..0d3313f 100644
--- a/Assets/_Game/Scripts/Progression/AchievementManager.cs
+++ b/Assets/_Game/Scripts/Progression/AchievementManager.cs
@@ -29,9 +29,11 @@ namespace BaseGames.Progression
[Header("事件频道")]
[SerializeField] private AchievementEventChannelSO _onAchievementUnlocked;
+ [Tooltip("成就授予凹槽时发布;EquipmentManager 订阅后调用 IncreaseNotches(1)。")]
+ [SerializeField] private VoidEventChannelSO _onNotchGranted;
+
// ── 运行时状态 ─────────────────────────────────────────────────────────
private readonly Dictionary _states = new();
- private SaveData _saveRef;
private void Awake()
@@ -104,7 +106,6 @@ namespace BaseGames.Progression
///
public void EvaluateAll(SaveData save)
{
- _saveRef = save;
foreach (var state in _states.Values)
{
if (state.IsUnlocked) continue;
@@ -151,11 +152,10 @@ namespace BaseGames.Progression
ServiceLocator.Get()?.UnlockAchievement(state.Achievement.achievementId);
#endif
- // 若成就授予凹槽,写入存档数值
- if (state.Achievement.grantsNotch && _saveRef != null)
- {
- _saveRef.Equipment.MaxNotches++;
- }
+ // 若成就授予凹槽,通过事件通知 EquipmentManager 更新运行时状态;
+ // 不直接写 SaveData,避免与 EquipmentManager.OnSave 的数据竞争。
+ if (state.Achievement.grantsNotch)
+ _onNotchGranted?.Raise();
Debug.Log($"[Achievement] 解锁:{state.Achievement.displayName} ({state.Achievement.achievementId})");
}