前言
武器是大多数拥有战斗元素的游戏中都会存在的对象,为了让武器系统易于整合,GCS提供了GCS_WeaponInterface
并在参考项目中提供了BP_GCS_DemoWeapon
作为默认实现,以帮助你快速上手。
设计图
此设计图描述了武器系统的整体设计。

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

暂时无法在飞书文档外展示此内容
- 对于普通用户:你应该复制
BP_GCS_DemoWeapon
并创建一个新的类,作为你的所有武器的父类,并进行自定义。 - 对整合用户:如果你希望整合其它系统,请参考
BP_GCS_DemoWeapon
,创建一个继承自BP_GCS_Weapon
的武器类作为你的所有武器的父类,并进行自定义。 - 对于高级用户:你可以直接直接继承C++的GCS_WeaponActor,或者完全创建你的武器Actor,并直接实现武器接口(
GCS_WeaponInterface
)
武器默认实现
提供的Demo项目中,也包含了一个武器父类:BP_GCS_DemoWeapon
,你通过新建该蓝图的子类以创建新的武器类型。
该武器蓝图同时支持SkeletalMesh和StaticMesh。
武器的默认参数

Active/Inactive Sockets: 武器会有激活和未激活状态,你可以指定武器在两种状态时分别需要挂载到角色Mesh的哪个插槽上。
WeaponAbilitySets: 你可以为武器添加多个技能集,当武器激活时,会将这些技能集应用到角色的技能系统组件上,会在武器取消激活时,将这些技能集从角色的技能系统组件上移除。
AbilityActionSet: 你还可以为武器关联一个技能动作集,这样角色在执行各种技能时,会从武器所关联的技能动作集上查询并选择对应的技能动作。
如果你已经有存在项目,或者对默认实现不太满意,你可以完全新建你自己的Actor/Component/UObject,然后实现GCS_WeaponInterface
(武器接口)
武器碰撞检测设置
武器可以选择不同的碰撞检测实例类型用来进行碰撞检测,因此武器本身无需开启碰撞。

取决于你对武器碰撞检测精准度的需求,你可以选择基于Socket(B_GCS_TraceInstance_SocketBased
)的或者基于形状(B_GCS_TraceInstance_ShapeBased
)的。到这里了解更多。
基于插槽的检测
如果你选择SocketBased
,并将SocketPrefix设置为Socket
,那么你需要在你的武器模型上为其添加以Socket开头的插槽,插槽的数量取决于你对碰撞准确度的要求,以及武器模型本身的设计。

在游戏中,碰撞检测实例会根据插槽的数量进行目标判定。

基于形状的检测
如果你对游戏不需要如此精准的检测,那么你也可以选择ShapeBased
,它在性能上更优越,且无需为Mesh添加一堆插槽,但是你需要为该武器添加Shape组件,并重写武器接口的GetPrimtiveComponent
,将Shape组件返回。

在游戏中,碰撞检测实例会跟Shape组件的位置和朝向进行目标检测。

武器碰撞调试
所有的碰撞检测依赖于GameplayTargetingSystem,你可以通过敲入控制行命令:ts.debug.EnableTargetingDebugging 0/1
来对碰撞检测进行可视化调试。
这里可以查看这里的官方文档了解更多。
武器接口
大多数情况下,你可以通过武器接口GCS_WeaponInterface
获取武器本身相关的各种信息,或者对武器本身的状态进行修改。
对GCS来说,武器只是一个对象(它可以是Actor,也可以是组件,甚至也可以是一个UObject),包含了武器的一些信息和状态。
拓展阅读:
在真实的游戏开发中,武器系统通常是复杂的库存/装备系统的一部分,而根据这些系统的不同,武器可以完全采用不同的制作方式。比如Lyra,它的武器就是UObject,而一个武器可以有多个Actor作为武器的表现部分,比如“双刀”。
默认武器管理组件
提供的Demo项目中,包含了一个简单的武器管理器组件(BC_GCS_DemoWeaponManager),适用于一个角色同时只有一个武器的情况。
你将其挂载到你对战斗Avatar上,并配置1~N个武器信息,并通过简单的API即可完成武器切换。

而BC_DemoCombatCore
组件会通过该武器管理组件返回角色的当前武器。
整合其他的武器管理组件
你可以参考BC_DemoCombatCore
,继承一份BC_GCS_CombatCore
,并在对应的重载函数中通过别的武器/库存系统返回指定的武器对象,只要该对象实现了GCS_WeaponInterface
即可。