武器系统

此文档解释GCS中的武器设计,以及如何新建武器等内容。

Cover.GCS
罗传月武(YueWu)

作者

罗传月武(YueWu)

专注游戏开发和Web技术。

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

目录

前言

武器是大多数拥有战斗元素的游戏中都会存在的对象,为了让武器系统易于整合,GCS提供了GCS_WeaponInterface

并在参考项目中提供了BP_GCS_DemoWeapon作为默认实现,以帮助你快速上手。

设计图

此设计图描述了武器系统的整体设计。

武器系统.001

如何实现武器

在GCS中,你有如下几种方式实现武器。下图是武器类的继承结构图。

武器系统.002
  • 对于普通用户:你应该复制BP_GCS_DemoWeapon并创建一个新的类,作为你的所有武器的父类,并进行自定义。
  • 对整合用户:如果你希望整合其它系统,请参考BP_GCS_DemoWeapon,创建一个继承自BP_GCS_Weapon的武器类作为你的所有武器的父类,并进行自定义。
  • 对于高级用户:你可以直接直接继承C++的GCS_WeaponActor,或者完全创建你的武器Actor,并直接实现武器接口(GCS_WeaponInterface)

武器默认实现

提供的Demo项目中,也包含了一个武器父类:BP_GCS_DemoWeapon,你通过新建该蓝图的子类以创建新的武器类型。

该武器蓝图同时支持SkeletalMesh和StaticMesh。

武器的默认参数

武器系统.003

Active/Inactive Sockets: 武器会有激活和未激活状态,你可以指定武器在两种状态时分别需要挂载到角色Mesh的哪个插槽上。

WeaponAbilitySets: 你可以为武器添加多个技能集,当武器激活时,会将这些技能集应用到角色的技能系统组件上,会在武器取消激活时,将这些技能集从角色的技能系统组件上移除。

AbilityActionSet: 你还可以为武器关联一个技能动作集,这样角色在执行各种技能时,会从武器所关联的技能动作集上查询并选择对应的技能动作。

如果你已经有存在项目,或者对默认实现不太满意,你可以完全新建你自己的Actor/Component/UObject,然后实现GCS_WeaponInterface(武器接口)

武器碰撞检测设置

武器可以设置多个碰撞追踪定义用于碰撞检测,因此武器本身无需开启碰撞。

武器系统.Trace定义
  • 取决于你对武器碰撞检测精准度的需求,你可以选择合适的Trace形状,以及Tick方式。你也可以设置多个Trace定义表示武器的不同部位的hitbox。
  • 当武器激活状态变化时,会往武器Owner的TraceSystem添加移除对应的追踪实例,并以武器本身作为追踪的源对象。查看碰撞追踪系统了解更多。

基于插槽的检测

在武器的TraceDefinition设置中,你可以选择SocketBased的检测形状,它会在Trace的SourceComponent中,基于指定的MeshSocketStart/MeshSocketEnd来动态构建胶囊体。

武器系统.基于Socket配置
注意:我在GetSourceComponentForTrace中指定了Mesh用作Trace的SourceComponent,而不是使用Capsule组件。
武器系统.基于Socket

在静态网格编辑器中中定义了用于MeshSocketStart/MeshSocketEnd的具体Socket。

在游戏中,它则会基于Mesh的Socket形成动态的胶囊体。

基于形状的检测

你也可以选择ShapeBased的检测形状,且无需为Mesh添加一堆插槽,但是你需要为该武器添加Shape组件,并重写武器的GetSourceComponentForTrace,将Shape组件返回。

武器系统.基于Shape配置

选择的碰撞形状必须与SourceComponent类型匹配,这样形状的宽度/大小由Shape组件决定。

你仍然可以定义形状的位置和旋转偏移(相对于Shape组件的坐标空间)

在游戏中,碰撞检测系统会根据Shape组件的形状/大小进行检测。

武器碰撞调试

所有的武器碰撞检测依赖于碰撞追踪系统,你可以通过敲入控制行命令:gcs.debug.EnableTraceDebugging true/false来对武器检测进行可视化调试。

武器接口

大多数情况下,你可以通过武器接口GCS_WeaponInterface获取武器本身相关的各种信息,或者对武器本身的状态进行修改。

对GCS来说,武器只是一个对象(它可以是Actor,也可以是组件,甚至也可以是一个UObject),包含了武器的一些信息和状态。

拓展阅读:

在真实的游戏开发中,武器系统通常是复杂的库存/装备系统的一部分,而根据这些系统的不同,武器可以完全采用不同的制作方式。比如Lyra,它的武器就是UObject,而一个武器可以有多个Actor作为武器的表现部分,比如“双刀”。

默认武器管理组件

提供的Demo项目中,包含了一个简单的武器管理器组件(BC_GCS_DemoWeaponManager),适用于一个角色同时只有一个武器的情况。

你将其挂载到你对战斗Avatar上,并配置1~N个武器信息,并通过简单的API即可完成武器切换。

武器系统.009

而BC_DemoCombatEntity组件会通过该武器管理组件返回角色的当前武器。

整合其他的武器管理组件

你可以参考BC_DemoCombatEntity,继承一份BC_GCS_CombatEntity,并在对应的重载函数中通过别的武器/库存系统返回指定的武器对象,只要该对象实现了GCS_WeaponInterface即可。