跳转到正文

如何集成

本文讲述如何集成通用游戏系统(GGS)的交互系统。

作

作者

作者

创建时间: 2025年5月15日更新时间: 2026年10月19日

目录

概述

通用游戏系统(GGS)的交互系统仅提供代码,本节提供集成交互系统的指引。

  • 适用场景:专为复杂、高级交互功能设计,不适合简单单机游戏需求(如“玩家叠加后触发事件”)。
  • 用途:支持多人交互、动态 UI 构建及网络复制,适用于需要复杂交互逻辑的项目。

启用插件

交互系统依赖以下插件:

  • GameplayAbilities:所有交互行为封装在 GameplayAbility 中。
  • SmartObject:可交互物体为 SmartObject,通过其定义配置交互入口规则(提示、输入等)。
  • GameplayBehavior:每个交互入口通过 GameplayBehavior 定义触发行为,GameplayAbility 通过其赋予并触发。
  • GenericGameSystem:插件提供交互组件、候选/选项状态与交互生命周期;项目 Ability 或其他项目逻辑执行 Trace、Overlap 或 Targeting 搜索,再把结果传入组件。

前提:需对上述系统有基本了解。

配套项目中的交互资产

当前 GenericGame 项目的 InteractionCore 中有 GA_GGS_Interaction(交互 Ability 示例)、TP_QueryPotentialSmartObjects(Targeting Preset)和 WB_GGS_InteractionBox(交互提示 Widget)。下方 Blueprint 案例展示了项目如何通过 Targeting System 执行候选搜索,再把结果交给插件组件;这些 Blueprint 资产属于项目 Content,不在代码插件中。完整路径见配套项目内容与示例资产。

关系图

下图阐述交互系统、GameplayAbility、智能对象及 UI 之间的关系:

注意

别被吓到,困难的部分已经实现。经过设置后,你只需要关心如何配置具体的可交互Actor,以及通过GA编写具体的交互逻辑(用脚踢开门,或者用钥匙开门)。

交互系统组件

所有主动交互的玩家需在 Pawn 上添加 GGS_InteractionSystemComponent。

该组件功能:

  • 维护潜在交互对象的引用、当前选中目标及交互对象总数,支持网络复制。
  • 通过 DefaultRequestFilter 指定搜索的可交互对象类型(可选,视实现方式而定)。
  • 仅维护状态,通过事件通知外部状态变化。
  • 根据状态变化,通过交互接口通知当前可交互对象。

主交互技能

需创建继承自 GGS_GameplayAbility_Interaction 的 GameplayAbility。 该技能:

  • 作为玩家、交互系统和 UI 之间的通信桥梁。
  • ReplicationPolicy 设为 Replicate,支持 RPC 通信。
  • 配套示例 Ability 可在服务端执行 Targeting 查询、将候选传入组件,并按权威规则处理交互;实际搜索实现属于该 Ability/项目逻辑。
  • 客户端负责创建交互 UI 及与其通信。

案例:

Loading Blueprint

Initializing BlueprintUE renderer...

交互对象的搜索和选择

案例中使用 UE5 的 Gameplay Targeting System 搜索并排序目标,将结果 Actors 传递给交互系统组件。 其他方式:

  • 基于玩家相机镜头选择。
  • 由可交互 Actor 主动加入潜在交互列表。

构建 UI

最简单通用的方式是构建交互选项列表 UI,关键功能:

  • 根据交互系统当前选中的交互对象选项列表,生成一组按钮。
  • 根据智能对象槽是否可用,按钮相应禁用或隐藏。
  • 按钮点击时通过 Index 通知交互技能以启动交互。
  • 可通知交互系统在潜在交互对象间切换。

案例:

参考蓝图:

Loading Blueprint

Initializing BlueprintUE renderer...

刷新选项:

Loading Blueprint

Initializing BlueprintUE renderer...

此案例可在我的其他付费系统配套项目中找到。

可交互接口

若希望可交互 Actor 响应交互事件,可实现 GGS_InteractableInterface。 案例:通用库存系统中商人的交互接口实现。

Loading Blueprint

Initializing BlueprintUE renderer...