From b3c87c5f9c8d14f5b5faf8335a96dc509a4e3f70 Mon Sep 17 00:00:00 2001 From: starmen1265 Date: Wed, 17 Jun 2026 18:12:30 +0800 Subject: [PATCH] =?UTF-8?q?refactor(interaction):=20PersistenceSubsystem?= =?UTF-8?q?=E8=AF=AD=E4=B9=89=E4=BF=AE=E6=AD=A3=E6=B6=88=E8=80=97=E7=8A=B6?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Interaction/InteractableComponent.cpp | 4 ++-- .../Interaction/PersistenceSubsystem.cpp | 12 ++++++------ .../ChildHood/Interaction/PersistenceSubsystem.h | 16 ++++++++-------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Source/ChildHood/Interaction/InteractableComponent.cpp b/Source/ChildHood/Interaction/InteractableComponent.cpp index e423276..5e01402 100644 --- a/Source/ChildHood/Interaction/InteractableComponent.cpp +++ b/Source/ChildHood/Interaction/InteractableComponent.cpp @@ -99,7 +99,7 @@ void UInteractableComponent::Consume_Implementation() { if (UPersistenceSubsystem* Persistence = GI->GetSubsystem()) { - Persistence->MarkItemCollected(Data.ItemId); + Persistence->MarkInteractableConsumed(Data.ItemId); } } @@ -125,7 +125,7 @@ void UInteractableComponent::RestorePersistentState(UPersistenceSubsystem* Persi if (!Persistence) return; // oneShot 物品:已消耗 → 隐藏 + 禁用检测 - if (Data.bOneShot && Persistence->IsItemCollected(Data.ItemId)) + if (Data.bOneShot && Persistence->IsInteractableConsumed(Data.ItemId)) { bIsConsumed = true; if (DetectionSphere) diff --git a/Source/ChildHood/Interaction/PersistenceSubsystem.cpp b/Source/ChildHood/Interaction/PersistenceSubsystem.cpp index 7b35a89..9481d9a 100644 --- a/Source/ChildHood/Interaction/PersistenceSubsystem.cpp +++ b/Source/ChildHood/Interaction/PersistenceSubsystem.cpp @@ -7,15 +7,15 @@ // 物品消耗状态 // ============================================================================ -bool UPersistenceSubsystem::IsItemCollected(FName ItemId) const +bool UPersistenceSubsystem::IsInteractableConsumed(FName InteractableId) const { - return CollectedItemIDs.Contains(ItemId); + return ConsumedInteractableIDs.Contains(InteractableId); } -void UPersistenceSubsystem::MarkItemCollected(FName ItemId) +void UPersistenceSubsystem::MarkInteractableConsumed(FName InteractableId) { - CollectedItemIDs.Add(ItemId); - UE_LOG(LogChildHood, Log, TEXT("PersistenceSubsystem: 物品已收集: %s"), *ItemId.ToString()); + ConsumedInteractableIDs.Add(InteractableId); + UE_LOG(LogChildHood, Log, TEXT("PersistenceSubsystem: 交互物已消耗: %s"), *InteractableId.ToString()); } // ============================================================================ @@ -61,7 +61,7 @@ void UPersistenceSubsystem::SetCollectionState(const TSet& InIDs, int32 I void UPersistenceSubsystem::ResetAll() { - CollectedItemIDs.Empty(); + ConsumedInteractableIDs.Empty(); DoorStates.Empty(); CollectionCollectedIDs.Empty(); CollectionProgress = 0; diff --git a/Source/ChildHood/Interaction/PersistenceSubsystem.h b/Source/ChildHood/Interaction/PersistenceSubsystem.h index 238cbfb..5fcecf6 100644 --- a/Source/ChildHood/Interaction/PersistenceSubsystem.h +++ b/Source/ChildHood/Interaction/PersistenceSubsystem.h @@ -15,7 +15,7 @@ * 因此将持久数据放在 GameInstanceSubsystem 中,与 World 生命周期解耦。 * * 当前持有: - * - CollectedItemIDs: 已收集物品 ID 集合 + * - ConsumedInteractableIDs: 已消耗交互物 ID 集合(一次性交互物防重复触发) * - DoorStates: 门开关状态映射 */ UCLASS() @@ -27,13 +27,13 @@ public: // === 物品消耗状态 === - /** 查询指定物品是否已被收集(跨场景持久) */ + /** 查询指定交互物是否已被消耗(跨场景持久,一次性交互物防重复触发) */ UFUNCTION(BlueprintCallable, Category = "Persistence") - bool IsItemCollected(FName ItemId) const; + bool IsInteractableConsumed(FName InteractableId) const; - /** 标记指定物品为已收集(写入持久层) */ + /** 标记指定交互物为已消耗(写入持久层) */ UFUNCTION(BlueprintCallable, Category = "Persistence") - void MarkItemCollected(FName ItemId); + void MarkInteractableConsumed(FName InteractableId); // === 门状态 === @@ -52,8 +52,8 @@ public: void ResetAll(); // === 收集系统状态 === - // 与上方 CollectedItemIDs 区分:CollectedItemIDs 记录交互物消耗状态(交互系统用), // 下方三个成员记录追踪品类的收集进度(收集系统用,技术方案第12节)。 + // 与上方的"交互物消耗状态"是两套完全独立的数据。 /** 获取收集状态(恢复用):追踪品类的已收集 ID 集合、当前进度、是否全部完成 */ UFUNCTION(BlueprintCallable, Category = "Persistence|Collection") @@ -65,9 +65,9 @@ public: private: - /** 已收集物品 ID 集合 */ + /** 已消耗交互物 ID 集合(一次性交互物防重复触发) */ UPROPERTY() - TSet CollectedItemIDs; + TSet ConsumedInteractableIDs; /** 门开关状态映射(true=打开,false=关闭) */ UPROPERTY()