Building Cost Evaluator¶
UBuildingCostEvaluator 是建筑成本系统的扩展入口,用于将插件对接到项目自己的背包、货币、属性或资源系统。
该类是抽象类,不能直接使用。项目需要通过蓝图或 C++ 创建派生类,并实现成本检查、资源消耗和 UI 评估逻辑。
基本信息¶
| 项目 | 说明 |
|---|---|
| 类名 | UBuildingCostEvaluator |
| 基类 | UObject |
| 类型 | 抽象类 |
| 蓝图支持 | 支持继承和重写 |
| 主要用途 | 对接项目自己的资源系统 |
| 推荐状态 | 保持无状态 |
| 实际资源消耗 | 应由服务器执行 |
主要职责¶
| 接口 | 说明 |
|---|---|
CanAfford |
检查当前是否能够支付成本。 |
Consume |
实际消耗对应资源。 |
EvaluateForUI |
生成建造界面需要的成本信息。 |
创建 Evaluator¶
蓝图¶
创建一个继承自以下类型的蓝图:
然后根据项目需求重写:
C++¶
// Copyright 2026 Zhiying Li. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Cost/BuildingCostEvaluator.h"
#include "MyBuildingCostEvaluator.generated.h"
UCLASS()
class UMyBuildingCostEvaluator : public UBuildingCostEvaluator
{
GENERATED_BODY()
public:
virtual FBuildingCostResult CanAfford_Implementation(
const FBuildingCostContext& Context,
const FBuildingCostEntry& Entry
) const override;
virtual FBuildingCostResult Consume_Implementation(
const FBuildingCostContext& Context,
const FBuildingCostEntry& Entry
) const override;
virtual FBuildingBuildCheckResult EvaluateForUI_Implementation(
const FBuildingCostContext& Context,
const FBuildingCostEntry& Entry
) const override;
};
CanAfford¶
检查当前玩家是否能够支付指定成本。
// Copyright 2026 Zhiying Li. All Rights Reserved.
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Building|Cost")
FBuildingCostResult CanAfford(
const FBuildingCostContext& Context,
const FBuildingCostEntry& Entry
) const;
| 类型 | 名称 | 数据类型 | 说明 |
|---|---|---|---|
| Param | Context |
const FBuildingCostContext& |
当前成本检查需要的运行时上下文。 |
| Param | Entry |
const FBuildingCostEntry& |
当前 Evaluator 需要处理的成本条目。 |
| Return | Result |
FBuildingCostResult |
是否能够支付成本以及失败原因。 |
CanAfford 只能执行检查,不应修改任何运行时数据。
不应在该接口中:
- 移除背包物品
- 扣除货币
- 修改角色属性
- 修改共享仓库
- 写入其他持久化数据
Consume¶
检查并实际消耗指定成本。
// Copyright 2026 Zhiying Li. All Rights Reserved.
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Building|Cost")
FBuildingCostResult Consume(
const FBuildingCostContext& Context,
const FBuildingCostEntry& Entry
) const;
| 类型 | 名称 | 数据类型 | 说明 |
|---|---|---|---|
| Param | Context |
const FBuildingCostContext& |
当前资源消耗需要的运行时上下文。 |
| Param | Entry |
const FBuildingCostEntry& |
当前需要消耗的成本条目。 |
| Return | Result |
FBuildingCostResult |
消耗是否成功以及失败原因。 |
Consume 应在修改资源前再次检查可用数量。
即使之前已经调用过 CanAfford,资源状态也可能已经发生变化,例如:
- 玩家同时进行了其他消费
- 背包物品被移除
- 货币数量发生变化
- 共享仓库被其他玩家使用
多人游戏中,实际资源消耗应由服务器执行。
EvaluateForUI¶
生成建造界面需要的成本信息。
// Copyright 2026 Zhiying Li. All Rights Reserved.
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Building|Cost")
FBuildingBuildCheckResult EvaluateForUI(
const FBuildingCostContext& Context,
const FBuildingCostEntry& Entry
) const;
| 类型 | 名称 | 数据类型 | 说明 |
|---|---|---|---|
| Param | Context |
const FBuildingCostContext& |
UI 评估使用的运行时上下文。 |
| Param | Entry |
const FBuildingCostEntry& |
当前需要显示的成本条目。 |
| Return | Result |
FBuildingBuildCheckResult |
成本显示内容和当前可建造状态。 |
该接口可以用于生成:
- 成本名称
- 所需数量
- 当前数量
- 是否满足要求
- 资源不足提示
- 建造失败信息
EvaluateForUI 只负责读取和生成显示数据,不应消耗或修改资源。
接口职责¶
| 接口 | 检查资源 | 修改资源 | 生成 UI 信息 |
|---|---|---|---|
CanAfford |
是 | 否 | 可选 |
Consume |
是 | 是 | 否 |
EvaluateForUI |
是 | 否 | 是 |
相关数据类型¶
| 类型 | 说明 |
|---|---|
FBuildingCostContext |
提供玩家、世界和项目运行时对象。 |
FBuildingCostEntry |
描述当前需要检查或消耗的成本。 |
FBuildingCostResult |
表示检查或消耗是否成功。 |
FBuildingBuildCheckResult |
表示 UI 成本评估和建造检查结果。 |
Evaluator 状态¶
Evaluator 通常应保持无状态。
运行时信息应从 FBuildingCostContext 获取,例如:
- Player Controller
- Player State
- Pawn
- Inventory Component
- Currency Component
- 项目自己的资源管理对象
成本目标和数量应从 FBuildingCostEntry 获取。
不建议在 Evaluator 中长期保存:
- 玩家对象引用
- 背包组件引用
- 当前 Cost Entry
- 当前建筑数据
- 上一次检查结果
- 世界 Actor 引用
这样可以避免不同玩家或多次建造操作之间共享错误状态。
注册 Evaluator¶
Evaluator 可以通过以下方式使用:
| 方式 | 说明 |
|---|---|
| Cost Entry 直接指定 | 当前成本条目直接使用指定的 Evaluator。 |
| 项目默认规则 | 根据成本类型从 Default Evaluators 中查找 Evaluator。 |
项目默认 Evaluator 在以下位置配置:
成本系统配置请参阅 成本系统。
蓝图实现注意事项¶
| 接口 | 要求 |
|---|---|
CanAfford |
只读取资源并返回检查结果。 |
Consume |
再次验证资源,然后执行消耗。 |
EvaluateForUI |
生成成本文本和失败信息,不修改资源。 |
蓝图 Evaluator 中应通过 Context 查找当前玩家对应的资源组件,而不是使用固定玩家或全局对象。
多人游戏¶
| 操作 | 推荐执行位置 |
|---|---|
| UI 成本评估 | 本地客户端 |
| 本地可支付预检查 | 本地客户端 |
| 最终成本检查 | 服务器 |
| 实际资源消耗 | 服务器 |
| 建筑创建 | 服务器 |
客户端的检查结果只用于界面显示和本地反馈。
服务器必须重新执行成本检查,不能直接信任客户端提交的结果。
常见问题¶
| 问题 | 检查内容 |
|---|---|
| 建筑始终显示资源不足 | 检查 Context 是否能够找到正确的玩家资源对象。 |
| UI 没有显示成本 | 检查是否实现 EvaluateForUI。 |
| 可以建造但没有扣除资源 | 检查服务器是否调用 Consume。 |
| 一次建造扣除多次 | 检查 Consume 是否只在服务器确认阶段执行。 |
| 检查成功但消耗失败 | 资源可能在两次调用之间发生变化。 |
| 不同玩家读取到相同资源 | 检查 Evaluator 是否错误保存了玩家引用。 |
| 蓝图无法创建 Evaluator | 检查父类是否选择 Building Cost Evaluator。 |
| 找不到对应 Evaluator | 检查 Cost Entry 或 Default Evaluators 配置。 |