概述
碰撞追踪系统是对虚幻引擎Trace系统的进一步封装和强化,是通用战斗系统(GCS)中处理武器、子弹、法术命中检测的主要方式。
核心特点:
- 支持稳定帧率及基于距离/角度变化的碰撞检测。
- 灵活定义碰撞检测方式和形状。
- 以高性能、多线程方式聚合管理 Trace,减少性能消耗,执行更多 Trace。
本文介绍基础用法,上层系统(如武器、法术)请查看相关文档。
使用场景
- 双手目标检测:角色双手可关联两个碰撞追踪,用于拳击/抓取技能时激活并获取目标。
- 投射物检测:Projectile 根据形状创建追踪实例,在飞行中获取命中目标。
- 动态形状调整:支持随激活时间动态调整检测形状(如半径随时间变化)。
基础配置
Trace系统组件
为需要碰撞检测的 Actor 添加 GCS_TraceSystemComponent,用于管理关联 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。
玩法集成
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 创建新碰撞形状,覆盖相关函数实现逻辑。
示例:根据激活时长返回动态半径球形。
1 virtual FCollisionShape GetDynamicCollisionShape(const UPrimitiveComponent* SourceComponent, const float& Time) const;
GCS 提供多种内置 TraceShape,通常满足大多数需求。
Note
在你想要过度设计,或者“感觉”自己需要更动态的碰撞形状前,不妨先尝试将子弹系统与Trace系统结合用用看。有时候,简单的工具,通过组合,也能去实现复杂的结果。
多人游戏注意事项
- 独立系统:每个客户端拥有独立 Trace 子系统。
- 独立实例:每个端的 Trace 实例互不相关,仅生成事件和命中结果。
- 服务端/客户端分离:同一对象在服务端和客户端拥有独立 Trace 实例。
武器示例:
- 服务端和客户端版本的武器各有 Trace,挥舞时分别触发命中事件:
- 服务端:执行关键游戏逻辑(如应用 GameplayEffect)。
- 客户端:执行本地表现逻辑,减少延迟反馈。
- 客户端预测:支持 HitReaction 预测。
- 灵活性:可选择仅在服务端创建 Trace,控制权由开发者决定。
