4fc4a39aa6
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
85 lines
3.6 KiB
C++
85 lines
3.6 KiB
C++
// 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();
|
||
};
|