碰撞检测系统

概述

简单来说,碰撞检测系统是一个组件,用于管理多个碰撞检测实例。

每一个碰撞检测实例只干一件事情:它绑定一个PrimitiveComponent(碰撞体,Mesh等),并通过GameplayTargetingSystem获取、过滤、排序目标Actor,使用者可以绑定碰撞检测实例上的事件获取到目标结果,并进行处理。

它解决什么问题

  1. 角色的双手可以绑定两个碰撞检测实例,实现手部目标检测。并在使用拳击/抓取相关技能时激活并利用它们获取目标。
  2. Projectile可以根据其形状创建碰撞检测实例,并在飞行过程中用它获取击中目标。
  3. 技能可以通过它获取技能的目标。
  4. 可以随着激活时间或者技能等级,动态调整目标检测逻辑。如检测半径随着激活时间变大变小。

玩法集成

创建/移除碰撞检测实例

碰撞检测系统.001

如果你的游戏有一个精英Boss,它会有两只手抓取玩家的技能,那么你应该在角色BeginPlay时,为其创建两个碰撞检测实例(采用球形检测的TargetingPreset),分别是LeftHand和RightHand,并将Mesh绑定到实例上。

当实例激活时,这两个实例会以左手/右手 Socket为中心进行目标检测。

激活/禁用碰撞检测实例

碰撞检测系统.002

在GCS中,使用ANS_GCS_AttackTrace来自动激活/禁用检测实例,BP_GCS_Projectile自身也会根据情况自动激活/禁用实例,你一般很少会直接用到这些API。

监听命中目标

碰撞检测系统.003

碰撞检测实例

它是一个UObject,有自己的生命周期。它由对象池管理,所以性能高,且游戏中其它系统可以随时调用以激活/关闭某个检测实例。

检测信息(TraceInformation)

每一个检测实例在激活时,都会携带有效的TarceInformation,它是GameplayEventData结构体,其中:

  • Instigator:是激活此实例的来源Actor(取决于调用者,它可能是AvatarActor,武器,或者子弹)
  • OptionalObject:是攻击请求对象。

其余未列出的字段没有使用,会在今后使用到。

内置碰撞检测实例类型

碰撞检测系统.004

GCS默认提供三个类型的碰撞检测蓝图能够满足大部分常见需求。

ShapedBased需要传入的PrimitiveComponent是ShapeComponent或其子类(Box,Capsule以及Sphere),并基于这个形状进行目标检测。

SocketBased需要传入的PrimitiveComponent是Mesh,且具备由PrimitiveComponentSocketNames指定的插槽名称,并根据插槽数量和位置进行目标检测。

新增碰撞检测实例类型

GCS_CollisionTraceInstance 通过蓝图/C++,从它创建一个子类即可。