90 lines
3.0 KiB
C++
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;
|
|
};
|