Files
ChildHood/Source/ChildHood/Collection/CollectionManager.h
T
2026-06-15 05:13:28 +08:00

85 lines
3.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// ChildHood Project - 收集系统逻辑核心(v1.0 架构解耦)
// 对应技术方案: docs/technical/收集系统-技术方案.md 第3节(类设计)+ 第5节(数据结构)+ 第6节(行为规则实现)
// 职责:品类检查、去重判定、记录持久化、完成判定、缓存 Presentation 数据
// 架构:普通 C++ 类(非 UObject、非 UActorComponent),由 ASystemDriver 值持有。
// 纯事件驱动无 Tick,不持有任何 UObject 强引用(与 FInteractionManager/FEffectManager 模式一致)。
#pragma once
#include "CoreMinimal.h"
#include "Collection/CollectionTypes.h"
class UPersistenceSubsystem;
/**
* FCollectionManager
*
* 收集系统逻辑核心。追踪单一品类「杂物」的收集进度(执行案 v0.1 范围)。
*
* 数据流(技术方案第9节):
* FEffectManager AddToBackpack Action
* → ASystemDriver 回调 OnItemAdded(ItemId, DisplayName, Category)
* → OnItemObtained()
* ├─ 步骤1: 查品类 (Category == Config.TrackedCategory?)
* ├─ 步骤2: 查重复 (CollectedIDs.Contains?)
* ├─ 步骤3: 记录 (CollectedIDs.Add + Progress = Num()) + SaveStateToPersistence()
* ├─ 步骤4: 刷新 Presentation 缓存(RefreshCachedInfo)
* └─ 步骤5: 完成判定 (Progress >= TotalCount) → bJustCompleted
*
* Presentation 层(UCollectionHUDComponent)每帧 Tick 只读 GetCachedInfo(),
* 通过比较 LastSeenProgress 检测变化驱动 UI,绝不访问 Manager 内部状态或 Subsystem。
*/
class FCollectionManager
{
public:
// === 初始化 ===
/** 重置本地运行时状态(由 ASystemDriver::BeginPlay 调用,先于 RestoreFromPersistence) */
void Initialize();
/** 从持久层恢复收集状态,并缓存 PersistenceSubsystem 弱引用(供后续写入用)。
* v0.1 单场景:持久层为空数据,等效于初始化为 0(技术方案第12节)。 */
void RestoreFromPersistence(UPersistenceSubsystem* Subsystem);
// === 物品事件入口(由 ASystemDriver 回调触发)===
/** 物品获得事件 — 执行查品类→查重复→记录→完成判定(技术方案步骤1-5) */
void OnItemObtained(FName ItemId, const FString& DisplayName, const FName& Category);
// === Presentation 层访问(只读)===
/** 获取 Presentation 缓存(HUDComponent 每帧只读) */
const FCollectionCachedInfo& GetCachedInfo() const { return CachedInfo; }
/** 获取配置参数(HUDComponent 读取通知/动画参数) */
const FCollectionConfig& GetConfig() const { return Config; }
private:
// === 配置 ===
FCollectionConfig Config;
// === 运行时状态 ===
int32 Progress = 0; // 当前已收集数(= CollectedIDs.Num(),权威值)
TSet<FName> CollectedIDs; // 已收集物品 ID 集合(仅追踪品类)
bool bIsComplete = false; // 是否全部收集完成
// === Presentation 缓存(供 HUDComponent 只读)===
FCollectionCachedInfo CachedInfo;
// === 持久层弱引用(RestoreFromPersistence 时设置,SaveStateToPersistence 用)===
TWeakObjectPtr<UPersistenceSubsystem> PersistencePtr;
// === 内部方法 ===
/** 处理新收集:记录 + 持久化 + 刷新缓存 + 完成判定(步骤2-5) */
void ProcessNewCollection(FName ItemId, const FString& DisplayName);
/** 刷新 Presentation 缓存(更新进度、生成通知文本)— 保持技术方案签名(DisplayName) */
void RefreshCachedInfo(const FString& DisplayName);
/** 将当前状态写入持久层(记录后 + 完成判定后调用) */
void SaveStateToPersistence();
};