六一的部落格


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




说明

  • 我们可以在Tick函数中, 根据时间间隔 Delta 改变Actor位置; 本节在于介绍榴弹类运动组件
  • 为榴弹类添加抛物运动组件, 给组件设置速度, 使榴弹对象以恒定速度运动 UProjectileMovementComponent

概览

  • 为榴弹类添加抛物运动组件, 并添加相关接口和数据成员
  • 重新实现榴弹类创建榴弹对象逻辑
  • 在榴弹类中, 计算并配置榴弹运动方向
  • 设置榴弹蓝图类抛物运动组件相关参数
  • 为榴弹对象添加销毁定时器
  • 提供参数期待值

抛物运动组件

UProjectileMovementComponent

  • 根据组件参数, 计算Actor位置, 在Tick函数中进行设置
  • 游戏角色运动逻辑在UCharacterMovementComponent,榴弹类有UProjectileMovementComponent, 二者有共同的基类UMovementComponent, 具有改变Actor在空间中位置的能力
  • 可以用来实现寻的导弹 Homing Missile ; 可以设置与其他物体发生碰撞时的反弹次数
  • 我们希望榴弹以恒定速度运动, 主要使用以下参数
    -
    Velocity 矢量, 方向 + 标量
    InitialSpeed 可配置的初始速度
    ProjectileGravityScale 默认值为1, 受到重力影响; 设置为0
  • 注意到InitialSpeed是组件自带的属性, 我们认为所有的运动信息应该储存在运动组件中
  • 纯逻辑组件

为榴弹类添加抛物运动组件


添加数据成员存放运动方向

private

ShootThemUp: Weapon/STUProjectile.h

1FVector ShotDirection;

提供设置运动方向的接口

public

ShootThemUp: Weapon/STUProjectile.h

1void SetShotDirection(const FVector& Direction) { ShotDirection = Direction; }           

添加抛物运动组件

protected

ShootThemUp: Weapon/STUProjectile.h

1class UProjectileMovementComponent;
2
3UPROPERTY(VisibleDefaultsOnly)
4UProjectileMovementComponent *MovementComponent;

初始化抛物运动组件

ShootThemUp: Weapon/STUProjectile.cpp

  1. 初始化组件
    1#include "GameFramework/ProjectileMovementComponent.h"
    2
    3// Constructor
    4MovementComponent = CreateDefaultSubobject<UProjectileMovementComponent>("ProjectileMovementComponent");
  2. 设置速度
    1// BeginPlay
    2
    3check(MovementComponent);
    4MovementComponent->Velocity = ShotDirection * MovementComponent->InitialSpeed;

榴弹发射器类的射击逻辑


重新实现动态创建榴弹对象逻辑

  • UGameplayStatics::BeginDeferredActorSpawnFromClass返回指向Actor对象的指针, 使用Actor派生类对象前需进行转换
  • UWorld::SpawnActorDeferred返回指向Actor派生类对象的指针
  • 屏蔽UGamePlayStatics头文件

ShootThemUp: Weapon/STULauncherWeapon.cpp

1if (!GetWorld()) return;
2
3ASTUProjectile *Projectile = GetWorld()->SpawnActorDeferred<ASTUProjectile>(ProjectileClass, SpawnTransform);
4if (Projectile)
5{
6    // 设置Projectile参数
7    Projectile->FinishSpawning(SpawnTransform);
8}

设置榴弹对象运动方向


榴弹真实轨迹

参考ASTUBaseWeapon::GetTraceData, 游戏角色Camera组件的位置+旋转

ShootThemUp: Weapon/STUBaseWeapon.cpp


榴弹呈现的运动方向

  • 修改起始位置为枪口, 根据最终位置计算其运动方向
  • 参考ASTURifleWeapon::MakeShot中绘制子弹轨迹

    ShootThemUp: Weapon/STURifleWeapon.cpp
-
起点 枪口位置
终点 碰撞点或计算得到的终点
运动方向 终点 - 起点
  1. 计算榴弹运动方向

    ShootThemUp: Weapon/STULauncherWeapon.cpp
     1// MakeShot
     2
     3FVector TraceStart, TraceEnd;
     4if (!GetTraceData(TraceStart, TraceEnd)) return;         
     5
     6FHitResult HitResult;
     7MakeHit(HitResult, TraceStart, TraceEnd);
     8
     9const FVector EndPoint = HitResult.bBlockingHit ? HitResult.ImpactPoint : TraceEnd;
    10const FVector Direction = (EndPoint - GetMuzzleWorldLocation()).GetSafeNormal();
  2. 设置榴弹对象的运动方向

    ShootThemUp: Weapon/STULauncherWeapon.cpp
    1// MakeShot
    2Projectile->SetShotDirection(Direction);

设置BP_STUProjectile


新增ProjectileMovementComponent



InitialSpeed默认值为0, 榴弹发射器射击时, 榴弹做自由落体运动




设置IntialSpeed为2000, 榴弹在垂直方向受到重力的影响

MovementComponent > Details > Projectile > Initial Speed, 设置为2000




ProjectileGravityScale默认为1



设置ProjectileGravityScale为0, 使榴弹不受重力影响, 可以经过绿色瞄准十字

MovementComponent > Details > Projectile Gravity Scale, 设置为0




注意到除非发生碰撞, 榴弹会一直运动


创建榴弹后, 开启销毁定时器

ShootThemUp: Weapon/STULauncherWeapon.cpp

1Projectile->SetLifeSpan(5.0f);

榴弹创建后5s消失


在代码中设置抛物运动组件

  • 开发时, 抛物运动组件有其合适的参数. 为避免在虚幻编辑器做出不当设置, 我们可以在BeginPlay中进行检查
  • 在这之前, 需要在初始化组件时, 给出期待值

    ShootThemUp: Weapon/STUProjectile.cpp
    1// Constructor
    2
    3MovementComponent->InitialSpeed = 2000.0f;
    4MovementComponent->ProjectileGravityScale = 0.0f;

为榴弹类添加运动



说明

  • 我们可以在Tick函数中, 根据时间间隔 Delta 改变Actor位置; 本节在于介绍榴弹类运动组件
  • 为榴弹类添加抛物运动组件, 给组件设置速度, 使榴弹对象以恒定速度运动 UProjectileMovementComponent

概览

  • 为榴弹类添加抛物运动组件, 并添加相关接口和数据成员
  • 重新实现榴弹类创建榴弹对象逻辑
  • 在榴弹类中, 计算并配置榴弹运动方向
  • 设置榴弹蓝图类抛物运动组件相关参数
  • 为榴弹对象添加销毁定时器
  • 提供参数期待值

抛物运动组件

UProjectileMovementComponent

  • 根据组件参数, 计算Actor位置, 在Tick函数中进行设置
  • 游戏角色运动逻辑在UCharacterMovementComponent,榴弹类有UProjectileMovementComponent, 二者有共同的基类UMovementComponent, 具有改变Actor在空间中位置的能力
  • 可以用来实现寻的导弹 Homing Missile ; 可以设置与其他物体发生碰撞时的反弹次数
  • 我们希望榴弹以恒定速度运动, 主要使用以下参数
    -
    Velocity 矢量, 方向 + 标量
    InitialSpeed 可配置的初始速度
    ProjectileGravityScale 默认值为1, 受到重力影响; 设置为0
  • 注意到InitialSpeed是组件自带的属性, 我们认为所有的运动信息应该储存在运动组件中
  • 纯逻辑组件

为榴弹类添加抛物运动组件


添加数据成员存放运动方向

private

ShootThemUp: Weapon/STUProjectile.h

1FVector ShotDirection;

提供设置运动方向的接口

public

ShootThemUp: Weapon/STUProjectile.h

1void SetShotDirection(const FVector& Direction) { ShotDirection = Direction; }           

添加抛物运动组件

protected

ShootThemUp: Weapon/STUProjectile.h

1class UProjectileMovementComponent;
2
3UPROPERTY(VisibleDefaultsOnly)
4UProjectileMovementComponent *MovementComponent;

初始化抛物运动组件

ShootThemUp: Weapon/STUProjectile.cpp

  1. 初始化组件
    1#include "GameFramework/ProjectileMovementComponent.h"
    2
    3// Constructor
    4MovementComponent = CreateDefaultSubobject<UProjectileMovementComponent>("ProjectileMovementComponent");
  2. 设置速度
    1// BeginPlay
    2
    3check(MovementComponent);
    4MovementComponent->Velocity = ShotDirection * MovementComponent->InitialSpeed;

榴弹发射器类的射击逻辑


重新实现动态创建榴弹对象逻辑

  • UGameplayStatics::BeginDeferredActorSpawnFromClass返回指向Actor对象的指针, 使用Actor派生类对象前需进行转换
  • UWorld::SpawnActorDeferred返回指向Actor派生类对象的指针
  • 屏蔽UGamePlayStatics头文件

ShootThemUp: Weapon/STULauncherWeapon.cpp

1if (!GetWorld()) return;
2
3ASTUProjectile *Projectile = GetWorld()->SpawnActorDeferred<ASTUProjectile>(ProjectileClass, SpawnTransform);
4if (Projectile)
5{
6    // 设置Projectile参数
7    Projectile->FinishSpawning(SpawnTransform);
8}

设置榴弹对象运动方向


榴弹真实轨迹

参考ASTUBaseWeapon::GetTraceData, 游戏角色Camera组件的位置+旋转

ShootThemUp: Weapon/STUBaseWeapon.cpp


榴弹呈现的运动方向

  • 修改起始位置为枪口, 根据最终位置计算其运动方向
  • 参考ASTURifleWeapon::MakeShot中绘制子弹轨迹

    ShootThemUp: Weapon/STURifleWeapon.cpp
-
起点 枪口位置
终点 碰撞点或计算得到的终点
运动方向 终点 - 起点
  1. 计算榴弹运动方向

    ShootThemUp: Weapon/STULauncherWeapon.cpp
     1// MakeShot
     2
     3FVector TraceStart, TraceEnd;
     4if (!GetTraceData(TraceStart, TraceEnd)) return;         
     5
     6FHitResult HitResult;
     7MakeHit(HitResult, TraceStart, TraceEnd);
     8
     9const FVector EndPoint = HitResult.bBlockingHit ? HitResult.ImpactPoint : TraceEnd;
    10const FVector Direction = (EndPoint - GetMuzzleWorldLocation()).GetSafeNormal();
  2. 设置榴弹对象的运动方向

    ShootThemUp: Weapon/STULauncherWeapon.cpp
    1// MakeShot
    2Projectile->SetShotDirection(Direction);

设置BP_STUProjectile


新增ProjectileMovementComponent



InitialSpeed默认值为0, 榴弹发射器射击时, 榴弹做自由落体运动




设置IntialSpeed为2000, 榴弹在垂直方向受到重力的影响

MovementComponent > Details > Projectile > Initial Speed, 设置为2000




ProjectileGravityScale默认为1



设置ProjectileGravityScale为0, 使榴弹不受重力影响, 可以经过绿色瞄准十字

MovementComponent > Details > Projectile Gravity Scale, 设置为0




注意到除非发生碰撞, 榴弹会一直运动


创建榴弹后, 开启销毁定时器

ShootThemUp: Weapon/STULauncherWeapon.cpp

1Projectile->SetLifeSpan(5.0f);

榴弹创建后5s消失


在代码中设置抛物运动组件

  • 开发时, 抛物运动组件有其合适的参数. 为避免在虚幻编辑器做出不当设置, 我们可以在BeginPlay中进行检查
  • 在这之前, 需要在初始化组件时, 给出期待值

    ShootThemUp: Weapon/STUProjectile.cpp
    1// Constructor
    2
    3MovementComponent->InitialSpeed = 2000.0f;
    4MovementComponent->ProjectileGravityScale = 0.0f;