跳转至

建筑成本系统

建筑成本系统用于检查建造条件,并在建筑确认后消耗资源。

插件不限制资源类型。背包物品、金币、角色属性或其他资源,都可以通过自定义 Building Cost Evaluator 接入。

处理流程

读取 Cost Set
→ 检查成本
→ 生成 UI 信息
→ 服务器重新验证
→ 消耗资源
→ 创建建筑

客户端评估仅用于 UI 显示和本地预检查。最终检查与资源消耗应由服务器执行。

Cost Set

Building Cost Set 是建筑使用的成本配置资产,可以包含多个 Cost Entry

例如:

成本 数量
木材 20
石材 10
金币 100

创建后,将其配置到 Building Data AssetCost Set

未配置 Cost Set 时,插件不会执行成本检查,适合创造模式、管理员建造或由项目自行处理成本的情况。

Cost Entry

每个 Cost Entry 表示一项成本。

字段 说明
Evaluator Class 处理当前成本的 Evaluator。
Target Data 资源、物品或其他目标数据。
Amount 需要检查和消耗的数量。

同一个 Evaluator 可以根据 Target Data 处理多个目标,例如 WoodStoneIron,不需要为每种资源创建单独的类。

Evaluator

Building Cost Evaluator 用于对接项目自己的资源系统,主要负责:

操作 说明
Can Afford 检查当前资源是否满足要求。
Consume 建筑确认后消耗资源。
Evaluate for UI 生成 UI 显示内容和失败原因。

项目可以分别创建背包、货币、属性或仓库 Evaluator。

默认 Evaluator

可以在以下位置注册默认 Evaluator:

Edit → Project Settings → Building System → Cost

每条规则包含:

字段 说明
Cost Type Tag 成本类型。
Evaluator Class 对应的默认 Evaluator。

例如:

Cost Type Tag Evaluator Class
Building.Cost.Resource BP_ResourceCostEvaluator
Building.Cost.Currency BP_CurrencyCostEvaluator
Building.Cost.Item BP_ItemCostEvaluator

Cost Entry 未直接指定 Evaluator 时,系统可以根据成本类型查找默认实现。

其他设置请参阅 插件设置

Cost Context

执行成本检查时,Evaluator 会收到当前建造上下文,例如:

  • Player Controller
  • 当前世界
  • Building Data
  • Build Component

Evaluator 需要根据这些信息找到玩家的背包、货币或其他资源数据。

Note

插件不会限制资源组件必须位于 Pawn、Player State 或其他对象中,具体获取方式由 Evaluator 决定。

UI 评估

Evaluate for UI 可以生成:

  • 当前数量
  • 需要数量
  • 成本显示文本
  • 是否满足条件
  • 失败原因

例如:

木材 12 / 20
石材 30 / 10

UI 评估不应消耗资源。

多人游戏

建造确认时,服务器应按照以下顺序处理:

重新检查成本
→ 检查放置是否合法
→ 消耗资源
→ 创建建筑

客户端不能直接决定资源是否足够,也不能执行最终资源消耗。

建筑创建失败时,不应消耗资源。

自定义 Evaluator

自定义 Evaluator 通常需要:

  1. 从 Cost Context 获取玩家。
  2. 从 Cost Entry 读取目标和数量。
  3. 查询项目资源系统。
  4. 返回检查结果和失败原因。
  5. 为 UI 生成显示信息。
  6. 在服务器确认阶段消耗资源。

完成后,可以直接配置到 Cost Entry,或注册为默认 Evaluator。

示例

以下示例通过自定义 Player State 检查并扣除金币。

Can Afford

Can Afford

Consume

Consume

Evaluate for UI

Evaluate for UI

常见问题

问题 检查内容
始终显示资源不足 检查 Evaluator 是否正确获取玩家和资源数据。
找不到 Evaluator 检查 Evaluator Class 和默认 Evaluator 规则。
UI 没有显示成本 检查 Evaluate for UI
建造后没有扣除资源 检查服务器是否执行 Consume
重复扣除资源 确保 Consume 只在服务器确认阶段执行一次。
建造失败仍扣除资源 检查验证、消耗和创建建筑的执行顺序。