碰撞追踪系统

GCS 碰撞追踪系统是对虚幻引擎Trace系统的进一步封装和强化,是通用战斗系统(GCS)中处理武器、子弹、法术命中检测的主要方式。

Cover.GCS
罗传月武(YueWu)

作者

罗传月武(YueWu)

专注游戏开发和Web技术。

创建时间: 2025年9月23日更新时间: 2026年9月15日

目录

概述

碰撞追踪系统是对虚幻引擎Trace系统的进一步封装和强化,是通用战斗系统(GCS)中处理武器、子弹、法术命中检测的主要方式。

核心特点:

  • 支持稳定帧率及基于距离/角度变化的碰撞检测。
  • 灵活定义碰撞检测方式和形状。
  • 以高性能、多线程方式聚合管理 Trace,减少性能消耗,执行更多 Trace。

本文介绍基础用法,上层系统(如武器、法术)请查看相关文档。

使用场景

  1. 双手目标检测:角色双手可关联两个碰撞追踪,用于拳击/抓取技能时激活并获取目标。
  2. 投射物检测:Projectile 根据形状创建追踪实例,在飞行中获取命中目标。
  3. 动态形状调整:支持随激活时间动态调整检测形状(如半径随时间变化)。

基础配置

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 创建新碰撞形状,覆盖相关函数实现逻辑。

示例:根据激活时长返回动态半径球形。

cpp
1 virtual FCollisionShape GetDynamicCollisionShape(const UPrimitiveComponent* SourceComponent, const float& Time) const;

GCS 提供多种内置 TraceShape,通常满足大多数需求。

Note

在你想要过度设计,或者“感觉”自己需要更动态的碰撞形状前,不妨先尝试将子弹系统与Trace系统结合用用看。有时候,简单的工具,通过组合,也能去实现复杂的结果。

多人游戏注意事项

  • 独立系统:每个客户端拥有独立 Trace 子系统。
  • 独立实例:每个端的 Trace 实例互不相关,仅生成事件和命中结果。
  • 服务端/客户端分离:同一对象在服务端和客户端拥有独立 Trace 实例。

武器示例:

  • 服务端和客户端版本的武器各有 Trace,挥舞时分别触发命中事件:
    • 服务端:执行关键游戏逻辑(如应用 GameplayEffect)。
    • 客户端:执行本地表现逻辑,减少延迟反馈。
  • 客户端预测:支持 HitReaction 预测。
  • 灵活性:可选择仅在服务端创建 Trace,控制权由开发者决定。