武器系统

前言

武器是大多数拥有战斗元素的游戏中都会存在的对象,为了让武器系统易于整合,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(武器接口)

武器碰撞检测设置

武器可以选择不同的碰撞检测实例类型用来进行碰撞检测,因此武器本身无需开启碰撞。

武器系统.004

取决于你对武器碰撞检测精准度的需求,你可以选择基于Socket(B_GCS_TraceInstance_SocketBased)的或者基于形状(B_GCS_TraceInstance_ShapeBased)的。到这里了解更多。

基于插槽的检测

如果你选择SocketBased,并将SocketPrefix设置为Socket,那么你需要在你的武器模型上为其添加以Socket开头的插槽,插槽的数量取决于你对碰撞准确度的要求,以及武器模型本身的设计。

武器系统.005

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

武器系统.006

基于形状的检测

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

武器系统.007

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

武器系统.008

武器碰撞调试

所有的碰撞检测依赖于GameplayTargetingSystem,你可以通过敲入控制行命令:ts.debug.EnableTargetingDebugging 0/1来对碰撞检测进行可视化调试。

这里可以查看这里的官方文档了解更多。

武器接口

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

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

拓展阅读:

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

默认武器管理组件

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

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

武器系统.009

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

整合其他的武器管理组件

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