Files
ChildHood/Source/ChildHood/Interaction/PersistenceSubsystem.h
T

90 lines
3.0 KiB
C++

// ChildHood Project - 跨场景持久化子系统
// 对应技术方案: docs/technical/交互系统-技术方案.md 第12节(跨场景持久化设计)
#pragma once
#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "PersistenceSubsystem.generated.h"
/**
* UPersistenceSubsystem
*
* UGameInstanceSubsystem,跨场景持久数据持有者。
* UE5 的 OpenLevel() 会销毁整个旧 World(包括所有 Actor 和 Component),
* 因此将持久数据放在 GameInstanceSubsystem 中,与 World 生命周期解耦。
*
* 当前持有:
* - ConsumedInteractableIDs: 已消耗交互物 ID 集合(一次性交互物防重复触发)
* - DoorStates: 门开关状态映射
*/
UCLASS()
class UPersistenceSubsystem : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
// === 交互物消耗状态 ===
/** 查询指定交互物是否已被消耗(跨场景持久,一次性交互物防重复触发) */
UFUNCTION(BlueprintCallable, Category = "Persistence")
bool IsInteractableConsumed(FName InteractableId) const;
/** 标记指定交互物为已消耗(写入持久层) */
UFUNCTION(BlueprintCallable, Category = "Persistence")
void MarkInteractableConsumed(FName InteractableId);
// === 门状态 ===
/** 查询指定门的开关状态(跨场景持久),未记录的门默认为关闭 */
UFUNCTION(BlueprintCallable, Category = "Persistence")
bool IsDoorOpen(FName DoorId) const;
/** 设置指定门的开关状态(写入持久层) */
UFUNCTION(BlueprintCallable, Category = "Persistence")
void SetDoorOpen(FName DoorId, bool bIsOpen);
// === 重置 ===
/** 重置所有持久数据(新游戏时调用) */
UFUNCTION(BlueprintCallable, Category = "Persistence")
void ResetAll();
// === 收集系统状态 ===
// 下方三个成员记录追踪品类的收集进度(收集系统用,技术方案第12节)。
// 与上方的"交互物消耗状态"是两套完全独立的数据。
/** 获取收集状态(恢复用):追踪品类的已收集 ID 集合、当前进度、是否全部完成 */
UFUNCTION(BlueprintCallable, Category = "Persistence|Collection")
void GetCollectionState(TSet<FName>& OutIDs, int32& OutProgress, bool& OutComplete) const;
/** 设置收集状态(收集时写入) */
UFUNCTION(BlueprintCallable, Category = "Persistence|Collection")
void SetCollectionState(const TSet<FName>& InIDs, int32 InProgress, bool bInComplete);
private:
/** 已消耗交互物 ID 集合(一次性交互物防重复触发) */
UPROPERTY()
TSet<FName> ConsumedInteractableIDs;
/** 门开关状态映射(true=打开,false=关闭) */
UPROPERTY()
TMap<FName, bool> DoorStates;
// === 收集系统数据 ===
/** 追踪品类的已收集物品 ID 集合(收集系统用) */
UPROPERTY()
TSet<FName> CollectionCollectedIDs;
/** 当前收集进度(收集系统用) */
UPROPERTY()
int32 CollectionProgress = 0;
/** 是否已全部收集完成(收集系统用) */
UPROPERTY()
bool bCollectionComplete = false;
};