前言
武器是大多数拥有战斗元素的游戏中都会存在的对象,为了让武器系统易于整合,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(武器接口)
武器碰撞检测设置
武器可以设置多个碰撞追踪定义用于碰撞检测,因此武器本身无需开启碰撞。

- 取决于你对武器碰撞检测精准度的需求,你可以选择合适的Trace形状,以及Tick方式。你也可以设置多个Trace定义表示武器的不同部位的hitbox。
- 当武器激活状态变化时,会往武器Owner的TraceSystem添加移除对应的追踪实例,并以武器本身作为追踪的源对象。查看碰撞追踪系统了解更多。
基于插槽的检测
在武器的TraceDefinition设置中,你可以选择SocketBased的检测形状,它会在Trace的SourceComponent中,基于指定的MeshSocketStart/MeshSocketEnd来动态构建胶囊体。

注意:我在GetSourceComponentForTrace中指定了Mesh用作Trace的SourceComponent,而不是使用Capsule组件。
在静态网格编辑器中中定义了用于MeshSocketStart/MeshSocketEnd的具体Socket。
在游戏中,它则会基于Mesh的Socket形成动态的胶囊体。
基于形状的检测
你也可以选择ShapeBased的检测形状,且无需为Mesh添加一堆插槽,但是你需要为该武器添加Shape组件,并重写武器的GetSourceComponentForTrace,将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即可完成武器切换。

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