六一的部落格


关关难过关关过,前路漫漫亦灿灿。




概览

  • 导入武器相关资产
  • 创建武器类STUBaseWeapon和BP_STUBaseWeapon
  • 为STUBaseWeapon添加骨骼网格体, 绑定武器模型
    武器模型 说明
    Launcher 发射导弹
    Rifle 发射子弹 Shoot Regular Cartridges
  • 为游戏角色骨骼网格体添加挂载点, 动态创建武器对象并挂载到游戏角色

导入武器相关资产

虚幻编辑器

  1. 之前将资产导入到Content/ExternalContent/Animation,有两点需注意
    • 资产之前存在相互引用,这个在Migrate过程中,不一定会全无问题
    • 我们选择Migrate ShooterGame/Content/Animations/TTP_Animations ,而实际导出有多个文件夹,里面的内容都和TTP_Animations有关
  2. 本节需要Migrate的武器资产,其相关内容与之前的内容有重叠; 和之前一样, 在ExternalContent下单独创建一个文件夹,存放本次导入资产

从ShooterGame导出

  1. 选中Content/Weapons > Migrate


  2. 相关文件存放在Characters,Environment和Weapons中


  3. 保存到ShootThemUp/Content


导入到ShootThemUp

  1. 创建ExternalContent/Weapon,并设置文件夹颜色
  2. 将资产移动到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


添加骨骼网格体组件, 用来绑定武器模型

C++

USkeletalMeshComponent

  1. 添加组件

    protected

    ShootThemUp: Weapon/STUBaseWeapon.h
    1class USkeletalMeshComponent;
    2
    3UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
    4USkeletalMeshComponent *WeaponMeshComponent;
  2. 初始化组件

    ShootThemUp: Weapon/STUBaseWeapon.cpp
    1// 构造函数
    2
    3WeaponMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("WeaponMeshComponent");
    4SetRootComponent(WeaponMeshComponent);

创建BP_STUBaseWeapon并绑定武器模型

虚幻编辑器

  1. 创建文件夹: Content/Weapon

  2. 创建BP_STUBaseWeapon,保存到Content/Weapon

  3. 为WeaponMeshComponent绑定Rifle

  4. 因为武器很小,设置Camera Speed为1



为游戏角色的骨骼网格体添加武器挂载点

虚幻编辑器

为骨骼网格体添加挂载点


动态创建武器,并附加到游戏角色骨骼网格体的挂载点

C++


添加武器类型属性, 动态创建Actor时使用

  1. ShootThemUp: Player/STUBaseCharacter.h

    protected
    1class ASTUBaseWeapon;
    2
    3UPROPERTY(EditDefaultsOnly)
    4TSubclassOf<ASTUBaseWeapon> WeaponClass;
  2. 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);

将武器附加到骨骼网格体挂载点

  1. 获取骨骼网格体: ACharacter::GetMesh
  2. 将Actor附加到可变换组件的挂载点

    AttachToComponent的第一个参数是USenceComponent类型,而我们传入其派生类USkeletalMeshComponent类型, 所以需要包含Components/SkeletalMeshComponent.h
1FAttachmentTransformRules AttachmentRules(EAttachmentRule::SnapToTarget, false);
2Weapon->AttachToComponent(GetMesh(), AttachmentRules, "WeaponSocket");

完整实现: SpawnWeapon

  1. ShootThemUp: Player/STUBaseCharacter.h

    private
    1void SpawnWeapon();
  2. 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}
  3. 游戏角色出现在场景中时, 创建并装载武器: 在BeginPlay中调用SpawnWeapon

查看

虚幻编辑器

  1. 设置武器类型: 将BP_STUBaseCharacter的WeaponClass设置为BP_STUBaseWeapon

  2. 效果图


给游戏角色装载武器



概览

  • 导入武器相关资产
  • 创建武器类STUBaseWeapon和BP_STUBaseWeapon
  • 为STUBaseWeapon添加骨骼网格体, 绑定武器模型
    武器模型 说明
    Launcher 发射导弹
    Rifle 发射子弹 Shoot Regular Cartridges
  • 为游戏角色骨骼网格体添加挂载点, 动态创建武器对象并挂载到游戏角色

导入武器相关资产

虚幻编辑器

  1. 之前将资产导入到Content/ExternalContent/Animation,有两点需注意
    • 资产之前存在相互引用,这个在Migrate过程中,不一定会全无问题
    • 我们选择Migrate ShooterGame/Content/Animations/TTP_Animations ,而实际导出有多个文件夹,里面的内容都和TTP_Animations有关
  2. 本节需要Migrate的武器资产,其相关内容与之前的内容有重叠; 和之前一样, 在ExternalContent下单独创建一个文件夹,存放本次导入资产

从ShooterGame导出

  1. 选中Content/Weapons > Migrate


  2. 相关文件存放在Characters,Environment和Weapons中


  3. 保存到ShootThemUp/Content


导入到ShootThemUp

  1. 创建ExternalContent/Weapon,并设置文件夹颜色
  2. 将资产移动到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


添加骨骼网格体组件, 用来绑定武器模型

C++

USkeletalMeshComponent

  1. 添加组件

    protected

    ShootThemUp: Weapon/STUBaseWeapon.h
    1class USkeletalMeshComponent;
    2
    3UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
    4USkeletalMeshComponent *WeaponMeshComponent;
  2. 初始化组件

    ShootThemUp: Weapon/STUBaseWeapon.cpp
    1// 构造函数
    2
    3WeaponMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("WeaponMeshComponent");
    4SetRootComponent(WeaponMeshComponent);

创建BP_STUBaseWeapon并绑定武器模型

虚幻编辑器

  1. 创建文件夹: Content/Weapon

  2. 创建BP_STUBaseWeapon,保存到Content/Weapon

  3. 为WeaponMeshComponent绑定Rifle

  4. 因为武器很小,设置Camera Speed为1



为游戏角色的骨骼网格体添加武器挂载点

虚幻编辑器

为骨骼网格体添加挂载点


动态创建武器,并附加到游戏角色骨骼网格体的挂载点

C++


添加武器类型属性, 动态创建Actor时使用

  1. ShootThemUp: Player/STUBaseCharacter.h

    protected
    1class ASTUBaseWeapon;
    2
    3UPROPERTY(EditDefaultsOnly)
    4TSubclassOf<ASTUBaseWeapon> WeaponClass;
  2. 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);

将武器附加到骨骼网格体挂载点

  1. 获取骨骼网格体: ACharacter::GetMesh
  2. 将Actor附加到可变换组件的挂载点

    AttachToComponent的第一个参数是USenceComponent类型,而我们传入其派生类USkeletalMeshComponent类型, 所以需要包含Components/SkeletalMeshComponent.h
1FAttachmentTransformRules AttachmentRules(EAttachmentRule::SnapToTarget, false);
2Weapon->AttachToComponent(GetMesh(), AttachmentRules, "WeaponSocket");

完整实现: SpawnWeapon

  1. ShootThemUp: Player/STUBaseCharacter.h

    private
    1void SpawnWeapon();
  2. 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}
  3. 游戏角色出现在场景中时, 创建并装载武器: 在BeginPlay中调用SpawnWeapon

查看

虚幻编辑器

  1. 设置武器类型: 将BP_STUBaseCharacter的WeaponClass设置为BP_STUBaseWeapon

  2. 效果图