六一的部落格


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




说明

  • 榴弹发射器 Grenade Launcher 发射榴弹
  • 榴弹没有对应网格体,也不属于某个粒子系统 Particle System

概览

  • 为榴弹发射器网格体添加MuzzleSocket
  • 创建榴弹类, 为其添加球体组件
  • 初始化STULauncherWeapon; 发射时, 动态生成榴弹对象
  • 创建基于榴弹类的蓝图类
  • 创建用于榴弹类的材质类和材质实例类

球体组件

USphereComponent Spherical Collision

UCapsuleComponent Capsule Collision

  • 外形是球, 提供碰撞功能
  • 球体组件的碰撞相较Capsule组件的碰撞更为简单

为网格体Launcher添加MuzzleSocket

虚幻编辑器

  1. 打开Contents/ExternalContent/Weapon/Weapons/Launcher

  2. 选中LauncherRoot, 右键, 选择Add Socket

  3. 选中Socket, 去到Details页面, 进行设置

    -
    SocketName MuzzleSocket
    Location (0, -15, 65)
    Rotation (-90, 90, 0)

    图示Relative Rotation > Y错误: 应为90, 失误填成9



创建榴弹类


创建C++类STUProjectile

虚幻编辑器

Tools > New C++ Class..

-
基类 Actor
上级目录 Weapon
访问属性 Public
类名 STUProjectile

调整框架

C++

  1. 每帧调用false
  2. 无Tick

ShootThemUp: Weapon/STUProjectile.h

ShootThemUp: Weapon/STUProjectile.cpp


添加球体组件, 提供碰撞功能

C++

  1. 添加组件

    protected

    ShootThemUp: Weapon/STUProjectile.h
    1class USphereComponent;
    2
    3UPROPERTY(VisibleDefaultsOnly)
    4USphereComponent *CollisionComponent;
  2. 初始化组件: 碰撞半径为5, 设为根组件

    ShootThemUp: Weapon/STUProjectile.cpp
     1#include "Components/SphereComponent.h"
     2
     3// Constructor
     4
     5CollisionComponent = CreateDefaultSubobject<USphereComponent>("SphereComponent");
     6
     7// set collision radius
     8CollisionComponent->InitSphereRadius(5.0f);
     9
    10SetRootComponent(CollisionComponent);

初始化STULauncherWeapon

覆写虚函数FireStart和MakeShot

  1. ShootThemUp: Weapon/STULauncherWeapon.h
    1// public
    2virtual void FireStart() override;
    3
    4// protected
    5virtual void MakeShot() override;
  2. 在FireStart中调用MakeShot

    ShootThemUp: Weapon/STULauncherWeapon.cpp
    1void ASTULauncherWeapon::FireStart()
    2{
    3    MakeShot();
    4}
    5
    6void ASTULauncherWeapon::MakeShot()
    7{ }

榴弹发射器发射榴弹时, 动态生成榴弹对象


添加榴弹类属性

protected

ShootThemUp: Weapon/STULauncherWeapon.h

1class ASTUProjectile;
2
3UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
4TSubclassOf<ASTUProjectile> ProjectileClass;

在MakeShot动态创建榴弹对象

  1. 榴弹初始位置在枪口
  2. 之后需要对榴弹进行参数配置, 延后调用BeginPlay

ShootThemUp: Weapon/STULauncherWeapon.cpp

 1#include "Weapon/STUProjectile.h"
 2#include "Kismet/GameplayStatics.h"
 3#include "Engine/World.h"
 4
 5void ASTULauncherWeapon::MakeShot()
 6{
 7    const FTransform SpawnTransform(FRotator::ZeroRotator, GetMuzzleWorldLocation());
 8    auto Projectile = UGameplayStatics::BeginDeferredActorSpawnFromClass(GetWorld(), ProjectileClass, SpawnTransform);
 9    // 设置榴弹参数
10    UGameplayStatics::FinishSpawningActor(Projectile, SpawnTransform);
11}

创建基于STUProjectile的蓝图类

虚幻编辑器

  1. 选中C++ Classed > ShootThemUp > Public > Weapon > STUProjectile, 右键, 选择Create Blueprint class based on STUProjectile
  2. 命名为BP_STUProjectile, 保存到Content/Weapon

查看BP_STUProjectile

有CollisionComponent



添加静态网格体组件

  1. 点击Add, 搜索Sphere, 选择Basic Shapes > Sphere


  2. 选中Sphere, 去到细节面板, 设置缩放属性, 与碰撞大小匹配

    -
    Transfrom > Scale (0.095, 0.095, 0.095)



设置BP_STULauncherWeapon的榴弹类属性为BP_STUProjectile



为榴弹类应用材质


创建材质类

  1. 创建文件夹Content/Materials

  2. 在材质目录创建材质类


  3. 命名为M_BaseColor



设置材质类

  1. 双击打开M_BaseColor

  2. 在Material Graph空白处点击鼠标左键, 同时按下数字4, 创建四维常量, 作为Base Color的输入


  3. 右键四维常量, 将其转换为参数, 命名为Color



创建材质实例类

  1. 选中M_BaseColor, 右键


  2. 命名为MI_RedColor


配置材质实例类

  1. 双击打开MI_RedColor

  2. 在细节面板勾选Color参数



  3. 设置Color参数



为BP_STUProjectile设置材质

  1. 选择Sphere

  2. 去到Details > Materials, 设置Element 0



查看

点击鼠标左键射击, 榴弹发射器发射红色小球


榴弹类



说明

  • 榴弹发射器 Grenade Launcher 发射榴弹
  • 榴弹没有对应网格体,也不属于某个粒子系统 Particle System

概览

  • 为榴弹发射器网格体添加MuzzleSocket
  • 创建榴弹类, 为其添加球体组件
  • 初始化STULauncherWeapon; 发射时, 动态生成榴弹对象
  • 创建基于榴弹类的蓝图类
  • 创建用于榴弹类的材质类和材质实例类

球体组件

USphereComponent Spherical Collision

UCapsuleComponent Capsule Collision

  • 外形是球, 提供碰撞功能
  • 球体组件的碰撞相较Capsule组件的碰撞更为简单

为网格体Launcher添加MuzzleSocket

虚幻编辑器

  1. 打开Contents/ExternalContent/Weapon/Weapons/Launcher

  2. 选中LauncherRoot, 右键, 选择Add Socket

  3. 选中Socket, 去到Details页面, 进行设置

    -
    SocketName MuzzleSocket
    Location (0, -15, 65)
    Rotation (-90, 90, 0)

    图示Relative Rotation > Y错误: 应为90, 失误填成9



创建榴弹类


创建C++类STUProjectile

虚幻编辑器

Tools > New C++ Class..

-
基类 Actor
上级目录 Weapon
访问属性 Public
类名 STUProjectile

调整框架

C++

  1. 每帧调用false
  2. 无Tick

ShootThemUp: Weapon/STUProjectile.h

ShootThemUp: Weapon/STUProjectile.cpp


添加球体组件, 提供碰撞功能

C++

  1. 添加组件

    protected

    ShootThemUp: Weapon/STUProjectile.h
    1class USphereComponent;
    2
    3UPROPERTY(VisibleDefaultsOnly)
    4USphereComponent *CollisionComponent;
  2. 初始化组件: 碰撞半径为5, 设为根组件

    ShootThemUp: Weapon/STUProjectile.cpp
     1#include "Components/SphereComponent.h"
     2
     3// Constructor
     4
     5CollisionComponent = CreateDefaultSubobject<USphereComponent>("SphereComponent");
     6
     7// set collision radius
     8CollisionComponent->InitSphereRadius(5.0f);
     9
    10SetRootComponent(CollisionComponent);

初始化STULauncherWeapon

覆写虚函数FireStart和MakeShot

  1. ShootThemUp: Weapon/STULauncherWeapon.h
    1// public
    2virtual void FireStart() override;
    3
    4// protected
    5virtual void MakeShot() override;
  2. 在FireStart中调用MakeShot

    ShootThemUp: Weapon/STULauncherWeapon.cpp
    1void ASTULauncherWeapon::FireStart()
    2{
    3    MakeShot();
    4}
    5
    6void ASTULauncherWeapon::MakeShot()
    7{ }

榴弹发射器发射榴弹时, 动态生成榴弹对象


添加榴弹类属性

protected

ShootThemUp: Weapon/STULauncherWeapon.h

1class ASTUProjectile;
2
3UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
4TSubclassOf<ASTUProjectile> ProjectileClass;

在MakeShot动态创建榴弹对象

  1. 榴弹初始位置在枪口
  2. 之后需要对榴弹进行参数配置, 延后调用BeginPlay

ShootThemUp: Weapon/STULauncherWeapon.cpp

 1#include "Weapon/STUProjectile.h"
 2#include "Kismet/GameplayStatics.h"
 3#include "Engine/World.h"
 4
 5void ASTULauncherWeapon::MakeShot()
 6{
 7    const FTransform SpawnTransform(FRotator::ZeroRotator, GetMuzzleWorldLocation());
 8    auto Projectile = UGameplayStatics::BeginDeferredActorSpawnFromClass(GetWorld(), ProjectileClass, SpawnTransform);
 9    // 设置榴弹参数
10    UGameplayStatics::FinishSpawningActor(Projectile, SpawnTransform);
11}

创建基于STUProjectile的蓝图类

虚幻编辑器

  1. 选中C++ Classed > ShootThemUp > Public > Weapon > STUProjectile, 右键, 选择Create Blueprint class based on STUProjectile
  2. 命名为BP_STUProjectile, 保存到Content/Weapon

查看BP_STUProjectile

有CollisionComponent



添加静态网格体组件

  1. 点击Add, 搜索Sphere, 选择Basic Shapes > Sphere


  2. 选中Sphere, 去到细节面板, 设置缩放属性, 与碰撞大小匹配

    -
    Transfrom > Scale (0.095, 0.095, 0.095)



设置BP_STULauncherWeapon的榴弹类属性为BP_STUProjectile



为榴弹类应用材质


创建材质类

  1. 创建文件夹Content/Materials

  2. 在材质目录创建材质类


  3. 命名为M_BaseColor



设置材质类

  1. 双击打开M_BaseColor

  2. 在Material Graph空白处点击鼠标左键, 同时按下数字4, 创建四维常量, 作为Base Color的输入


  3. 右键四维常量, 将其转换为参数, 命名为Color



创建材质实例类

  1. 选中M_BaseColor, 右键


  2. 命名为MI_RedColor


配置材质实例类

  1. 双击打开MI_RedColor

  2. 在细节面板勾选Color参数



  3. 设置Color参数



为BP_STUProjectile设置材质

  1. 选择Sphere

  2. 去到Details > Materials, 设置Element 0



查看

点击鼠标左键射击, 榴弹发射器发射红色小球