给游戏角色装载武器
2023年6月11日 2024年1月11日
概览
- 导入武器相关资产
- 创建武器类STUBaseWeapon和BP_STUBaseWeapon
- 为STUBaseWeapon添加骨骼网格体, 绑定武器模型
武器模型 说明 Launcher 发射导弹 Rifle 发射子弹 Shoot Regular Cartridges
- 为游戏角色骨骼网格体添加挂载点, 动态创建武器对象并挂载到游戏角色
导入武器相关资产
虚幻编辑器
- 之前将资产导入到Content/ExternalContent/Animation,有两点需注意
- 资产之前存在相互引用,这个在Migrate过程中,不一定会全无问题
- 我们选择Migrate
ShooterGame/Content/Animations/TTP_Animations
,而实际导出有多个文件夹,里面的内容都和TTP_Animations有关
- 资产之前存在相互引用,这个在Migrate过程中,不一定会全无问题
- 本节需要Migrate的武器资产,其相关内容与之前的内容有重叠; 和之前一样, 在ExternalContent下单独创建一个文件夹,存放本次导入资产
从ShooterGame导出
-
选中Content/Weapons > Migrate
-
相关文件存放在Characters,Environment和Weapons中
-
保存到ShootThemUp/Content
导入到ShootThemUp
- 创建ExternalContent/Weapon,并设置文件夹颜色
- 将资产移动到ExternalContent/Weapon
创建武器类
初始化C++类: STUBaseWeapon
创建C++类: Weapon/STUBaseWeapon
虚幻编辑器
-
Actor
-
公有类
设置头文件路径
C++
ShootThemUp: ShootThemUp.Build.cs
1PublicIncludePaths.AddRange(new string[] 2{ 3 "ShootThemUp/Public/Player", 4 "ShootThemUp/Public/Components", 5 "ShootThemUp/Public/Dev", 6 "ShootThemUp/Public/Weapon" 7});
调整框架
C++
- | |
---|---|
构造函数 | 每帧调用置为false |
Tick | 屏蔽 |
BeginPlay | - |
ShootThemUp: Weapon/STUBaseWeapon.h
ShootThemUp: Weapon/STUBaseWeapon.cpp
添加骨骼网格体组件, 用来绑定武器模型
- 添加组件
protected
ShootThemUp: Weapon/STUBaseWeapon.h
1class USkeletalMeshComponent; 2 3UPROPERTY(VisibleAnywhere, BlueprintReadWrite) 4USkeletalMeshComponent *WeaponMeshComponent;
- 初始化组件
ShootThemUp: Weapon/STUBaseWeapon.cpp
1// 构造函数 2 3WeaponMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("WeaponMeshComponent"); 4SetRootComponent(WeaponMeshComponent);
创建BP_STUBaseWeapon并绑定武器模型
虚幻编辑器
-
创建文件夹: Content/Weapon
-
创建BP_STUBaseWeapon,保存到Content/Weapon
-
为WeaponMeshComponent绑定Rifle
-
因为武器很小,设置Camera Speed为1
为游戏角色的骨骼网格体添加武器挂载点
虚幻编辑器
为骨骼网格体添加挂载点
动态创建武器,并附加到游戏角色骨骼网格体的挂载点
C++
添加武器类型属性, 动态创建Actor时使用
ShootThemUp: Player/STUBaseCharacter.h
protected
1class ASTUBaseWeapon; 2 3UPROPERTY(EditDefaultsOnly) 4TSubclassOf<ASTUBaseWeapon> WeaponClass;
ShootThemUp: Player/STUBaseCharacter.cpp
1#include "Weapon/STUBaseWeapon.h"
动态创建武器Actor
使用了UWorld::SpawnActor,所以我认为应该包含;但没包含编译通过了
1#include "Engine/World.h" 2 3if (!GetWorld()) return; 4const auto Weapon = GetWorld()->SpawnActor<ASTUBaseWeapon>(WeaponClass);
将武器附加到骨骼网格体挂载点
- 获取骨骼网格体:
ACharacter::GetMesh
-
将Actor附加到可变换组件的挂载点
AttachToComponent的第一个参数是USenceComponent类型,而我们传入其派生类USkeletalMeshComponent类型, 所以需要包含Components/SkeletalMeshComponent.h
1FAttachmentTransformRules AttachmentRules(EAttachmentRule::SnapToTarget, false); 2Weapon->AttachToComponent(GetMesh(), AttachmentRules, "WeaponSocket");
完整实现: SpawnWeapon
ShootThemUp: Player/STUBaseCharacter.h
private
1void SpawnWeapon();
ShootThemUp: Player/STUBaseCharacter.cpp
1#include "Engine/World.h" 2#include "Components/SkeletalMeshComponent.h" 3 4void ASTUBaseCharacter::SpawnWeapon() 5{ 6 if (!GetWorld()) return; 7 const auto Weapon = GetWorld()->SpawnActor<ASTUBaseWeapon>(WeaponClass); 8 if (!Weapon) return; 9 10 FAttachmentTransformRules AttachmentRules(EAttachmentRule::SnapToTarget, false); 11 Weapon->AttachToComponent(GetMesh(), AttachmentRules, "WeaponSocket"); 12}
- 游戏角色出现在场景中时, 创建并装载武器: 在BeginPlay中调用SpawnWeapon
查看
虚幻编辑器
-
设置武器类型: 将BP_STUBaseCharacter的WeaponClass设置为BP_STUBaseWeapon
-
效果图