From 8c66640a6db47335e82f81b250f33e02b0147538 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Wed, 20 May 2026 16:03:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=BC=BA=E5=AD=98=E6=A1=A3?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=92=8C=E6=88=90=E5=B0=B1=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E4=BA=8B=E4=BB=B6=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E4=BB=A5=E6=94=AF=E6=8C=81=E5=87=B9=E6=A7=BD=E6=88=90=E5=B0=B1?= =?UTF-8?q?=E7=9A=84=E5=8A=A8=E6=80=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_Game/Scripts/Core/Save/GameSaveManager.cs | 12 +++++++++++- .../_Game/Scripts/Equipment/EquipmentManager.cs | 17 +++++++++++++++-- .../Scripts/Progression/AchievementManager.cs | 14 +++++++------- 3 files changed, 33 insertions(+), 10 deletions(-) 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})"); }