跳转至

Building Cost Evaluator

UBuildingCostEvaluator 是建筑成本系统的扩展入口,用于将插件对接到项目自己的背包、货币、属性或资源系统。

该类是抽象类,不能直接使用。项目需要通过蓝图或 C++ 创建派生类,并实现成本检查、资源消耗和 UI 评估逻辑。

基本信息

项目 说明
类名 UBuildingCostEvaluator
基类 UObject
类型 抽象类
蓝图支持 支持继承和重写
主要用途 对接项目自己的资源系统
推荐状态 保持无状态
实际资源消耗 应由服务器执行

主要职责

接口 说明
CanAfford 检查当前是否能够支付成本。
Consume 实际消耗对应资源。
EvaluateForUI 生成建造界面需要的成本信息。

创建 Evaluator

蓝图

创建一个继承自以下类型的蓝图:

Building Cost Evaluator

然后根据项目需求重写:

Can Afford
Consume
Evaluate For UI

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 在以下位置配置:

Edit
→ Project Settings
→ Building System
→ Cost
→ Default Evaluators

成本系统配置请参阅 成本系统

蓝图实现注意事项

接口 要求
CanAfford 只读取资源并返回检查结果。
Consume 再次验证资源,然后执行消耗。
EvaluateForUI 生成成本文本和失败信息,不修改资源。

蓝图 Evaluator 中应通过 Context 查找当前玩家对应的资源组件,而不是使用固定玩家或全局对象。

多人游戏

操作 推荐执行位置
UI 成本评估 本地客户端
本地可支付预检查 本地客户端
最终成本检查 服务器
实际资源消耗 服务器
建筑创建 服务器

客户端的检查结果只用于界面显示和本地反馈。

服务器必须重新执行成本检查,不能直接信任客户端提交的结果。

常见问题

问题 检查内容
建筑始终显示资源不足 检查 Context 是否能够找到正确的玩家资源对象。
UI 没有显示成本 检查是否实现 EvaluateForUI
可以建造但没有扣除资源 检查服务器是否调用 Consume
一次建造扣除多次 检查 Consume 是否只在服务器确认阶段执行。
检查成功但消耗失败 资源可能在两次调用之间发生变化。
不同玩家读取到相同资源 检查 Evaluator 是否错误保存了玩家引用。
蓝图无法创建 Evaluator 检查父类是否选择 Building Cost Evaluator
找不到对应 Evaluator 检查 Cost Entry 或 Default Evaluators 配置。