概述
碰撞追踪系统是对虚幻引擎Trace系统的进一步封装和强化,是通用战斗系统(GCS)中处理武器、子弹、法术命中检测的主要方式。
核心特点:
- 支持稳定帧率及基于距离/角度变化的碰撞检测。
- 灵活定义碰撞检测方式和形状。
- 以高性能、多线程方式聚合管理 Trace,减少性能消耗,执行更多 Trace。
本文介绍基础用法,上层系统(如武器、法术)请查看相关文档。
使用场景
- 双手目标检测:角色双手可关联两个碰撞追踪,用于拳击/抓取技能时激活并获取目标。
- 投射物检测:Projectile 根据形状创建追踪实例,在飞行中获取命中目标。
- 动态形状调整:支持随激活时间动态调整检测形状(如半径随时间变化)。
基础配置
Trace系统组件
为需要碰撞检测的 Actor 添加 UGCS_TraceSystemComponent,用于管理 Trace 句柄与事件。世界级 UGCS_TraceSubsystem 持有 TraceState 并执行异步 Sweep;Trace 状态本身不通过网络复制。
- 功能:自动创建并添加追踪实例,SourceComponent 为所属 Actor 的主 Mesh 组件。
- 配置:组件初始化时可配置一组默认追踪定义。
追踪定义
TraceDefinition 是 TraceInstance 的静态数据。
关键配置:TraceTag(追踪的名称)。
扫描设置
非常经典的Sweep设置。
碰撞形状
默认支持四种碰撞形状。
静态
在 SourceComponent 的组件空间内定义静态形状,Offset 和 Orientation 表示相对位置和旋转。
基于插槽
要求 SourceComponent 为 MeshComponent,根据 Start/End 插槽动态构建胶囊体形状及朝向,Radius 控制半径。
基于形状
要求 SourceComponent 为 ShapeComponent(如 Box、Sphere、Capsule),由其驱动碰撞形状。
附加
与静态方式类似,但形状 Transform 基于指定插槽/骨头的世界空间。
Tick类型
支持三种 Tick 类型
默认Tick
基于游戏帧率,可能在低帧率下丢失目标。
基于固定帧率
指定目标帧率,高帧率减帧,低帧率补帧,确保命中率。
基于距离
根据 SourceComponent 的位置和角度变化间隔进行检测。
管理追踪定义
TraceDefinition 继承自 FTableRowBase,可通过 DataTable 管理大量 Trace。TraceSystemComponent 接受 TableRowHandle 作为输入,而非直接 TraceDefinition。
玩法集成
近战 Ability 集成
近战 Ability 可通过 UGCS_AbilityTask_CollisionTrace::HandleCollisionTraces 创建任务,再用 AddMeleeRequest 提交 UGCS_AttackRequest_Melee 和 SourceObject。任务根据请求中的 TracesToControl 标签向 TraceSystem 请求并管理对应 Trace,将命中通过 OnTargetsFound(请求、TraceHandle、HitResult)回传给 Ability;RemoveMeleeRequest 会停止该请求关联的 Trace。任务销毁时会解绑回调并停止剩余 Trace。
动画通知 UGCS_ANS_AttackTrace 只保存一个可编辑的近战请求实例,本身不执行 Trace。需要近战攻击时,由 AbilityTask 管理 Trace 生命周期。参阅战斗攻防流程。
API概述
GCS|TraceSystem 分类提供以下 API:
Loading Blueprint
Initializing BlueprintUE renderer...
添加追踪实例
需提供:
- 追踪定义:包含 TraceTag、碰撞形状、扫描方式、Tick 类型等。
- 源组件:关联的组件(如武器 Mesh、子弹 Sphere)。
- 源对象:区分同类 Trace(如主/副武器的 Weapon 标签)。
成功添加返回 TraceHandle,用于后续操作。
示例:武器激活时,Mesh 作为源组件,武器 Actor 作为源对象,添加到 TraceSystem。
查询追踪实例
你也可以通过Trace的Tag,源组件,以及源对象构建TraceHandle,并通过Handle对Trace进行查询。
激活追踪实例
使用 TraceHandle 控制追踪激活状态。激活时,根据 Tick 类型、扫描设置和形状执行碰撞检测,返回 HitResults。 示例:角色攻击 Montage 中激活武器追踪实例。
调试
绘制命令
以下命令辅助调试碰撞检测:
命令 | 用途 |
|---|---|
gcs.debug.EnableTraceDebugging true/false | 全局开启/关闭 Trace 调试(true/false) |
gcs.debug.OverrideTraceDebuggingLifeTime 0.2 | 控制 Trace 调试绘制时长(>0) |
绘制颜色
绘制颜色
为了更好地进行区分:
在服务端执行的Trace的绘制颜色是红色,命中颜色是绿色。
在客户端执行的Trace的绘制颜色是白色,命中颜色是黑色。
这样你可以同时排查服务端和客户端的轨迹差异。
注意:在编辑器客户端模式下,若只见白色 Trace,说明服务端 Trace 未执行(可能因 SkeletalMeshComponent 在专用服务器禁用 Tick)。
拓展
C++ 用户可继承 FGCS_CollisionShape 创建新碰撞形状,覆盖相关函数实现逻辑。
示例:根据激活时长返回动态半径球形。
virtual FCollisionShape GetDynamicCollisionShape(const UPrimitiveComponent* SourceComponent, const float& Time) const;GCS 提供多种内置 TraceShape,通常满足大多数需求。
Note
在你想要过度设计,或者“感觉”自己需要更动态的碰撞形状前,不妨先尝试将子弹系统与Trace系统结合用用看。有时候,简单的工具,通过组合,也能去实现复杂的结果。
多人游戏注意事项
- Trace 子系统和 Trace 实例不复制;每个 World 独立执行本地创建并启动的实例,命中结果也不会自动同步到其他端。
- 同一武器在服务器和客户端可以拥有各自的 Trace。哪些端实际运行 Trace,取决于调用它的 Actor、Ability 与网络执行策略。
- 服务器应负责权威命中及 GameplayEffect 结算。Trace 本身不会自动提供客户端命中确认。
若需要本地预测受击反馈,必须由支持预测的 Ability / GameplayEffect 路径另行完成;例如预测瞬时效果可使用 UGCS_GEComponent_PredictivelyExecute。这不是 Trace 命中复制提供的能力。子弹预测范围更窄:只预测玩家主动发射的第一批弹道与视觉表现,命中和效果仍由服务器处理,参阅子弹系统。
你也可以只在服务器创建和启动 Trace;应根据所需的权威命中与本地表现选择调用端。