目录
前言
上一章节中创建了父类、角色类和敌人类。父类是抽象类,其中元素都可以被角色类和敌人类继承。
这一章节中我们会丰富角色类,为其添加武器和基本的动作蓝图。使用蓝图可以加速实现,节省效率。
角色类蓝图
为了使角色能够使用武器,需要为角色添加一个骨骼网络组件(Skeletal Mesh),这个骨骼网络组件需要附着在角色骨骼的一个插槽(Socket)上。
武器成员变量
由于角色和敌人都可以拥有武器,所以将其定义在父类中最为合适。在 AuraCharacterBase.h 中 Protected 部分定义一个 TObjectPtr 指针,名为 Weapon 的成员变量,也就是武器变量指针。
使用 TObjectPtr 动态指针作为武器变量类型有许多好处,与原始指针行为一致,但在编辑器中它有访问跟踪和延迟加载(可选)的功能。其中访问跟踪可以让我们监控指针被访问或解引用的频率,延迟加载就是在程序需要或使用前,不对其进行加载。因此,现在的标准也逐渐转向使用 TObjectPtr 作为成员变量。之后我们也会遵循该标准。
武器变量使用 TObjectPtr 进行包装,类型为 USkeletalMeshComponent。由于我们将在蓝图中引用该成员变量,所以需要将标注为 UPROPERTY(EditAnywhere, Category="Combat"),Category为归类,名称自定义。
c
UPROPERTY(EditAnywhere, Category = "Combat")
TObjectPtr<USkeletalMeshComponent> Weapon;
然后构造方法中创建成员变量,然后将附着到当前类的骨骼网络的插槽上,插槽命名为 WeaponHandSocket,并设置其碰撞体积为无碰撞体积(NoCollision)。
c
Weapon = CreateDefaultSubobject<USkeletalMeshComponent>("Weapon");
Weapon->SetupAttachment(GetMesh(), FName("WeaponHandSocket"));
Weapon->SetCollisionEnabled(ECollisionEnabled::NoCollision);
上面用的 GetMesh() 方法是从 ACharacter 类继承而来,直接调用可获得当前 Character 的骨骼网络。所以第三行意思是将武器变量绑定到拥有命名 WeaponHandSocket 插槽的骨骼网络上。
之后我们基于角色类和敌人类创建的蓝图就会有武器骨骼网络组件,以及对其设置。
角色蓝图
创建角色蓝图前,先点击运行,启动 UE5,在UE5中 Content 目录下依次新建 Blueprints - Character - Aura 目录,然后在该目录下创建蓝图。


角色蓝图文件命名为 BP_AuraCharacter。
创建完成后,双击打开角色蓝图。设置其 Mesh 的骨骼素材,调整高度、朝向等。朝向我们设置右转90 度。然后是为其添加武器组件,但前提要先有插槽。有人可能会疑问,之前不是在角色类中添加了武器变量并将绑定到了角色骨骼网络的手柄上了么?这里说明一下,在 UE 中,类是类,蓝图是蓝图,二者需要交互相互配合运作,所以二者及其属性之间要相互对应,且命名要一致,假如我们想在类中操控蓝图武器组件实现某些数值调整,或执行某个动作,但在蓝图中没有同命名的组件,是无法实现的。
所以需要在蓝图角色骨骼网络中新建一个插槽,并将其命名为类中定义的名字 WeaponHandSocket。
打开角色蓝图的骨骼网络文件(可以在 Content - Assets - Characters - Aura 目录下查找,或者通过角色的 Mesh 节点的浏览资源文件定位)。


现在的问题是,我们是想要角色右手执武器还是左手,由于角色动画都是以左手为基础制作,所以我们需要将其配置在左手。
打开角色的骨骼网络资源文件 SKM_Aura,找到 hand_l 节点,右键,选择 Add Socket,命名为 WeaponHandSocket,命名一定要与角色类中的一致。

然后再右键插槽 WeaponHandSocket,选择 Add Preview Asset,搜索 SKM_Staff,并选择。然后对其进行位置和角度的调整,具体调整细节不再赘述,由个人去把控。
回到角色蓝图,选中 Weapon,将其 Mesh 属性的素材同样设置为 SKM_Staff,这样我们就可以在蓝图中预览武器。如上图所示。
敌人蓝图
敌人蓝图创建过程与角色类大同小异,不妨作为练习,大家自己去实现。