为榴弹类添加运动
2023年8月22日 2024年1月11日
说明
- 我们可以在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#include "GameFramework/ProjectileMovementComponent.h" 2 3// Constructor 4MovementComponent = CreateDefaultSubobject<UProjectileMovementComponent>("ProjectileMovementComponent");
- 设置速度
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
- | |
---|---|
起点 | 枪口位置 |
终点 | 碰撞点或计算得到的终点 |
运动方向 | 终点 - 起点 |
- 计算榴弹运动方向
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();
- 设置榴弹对象的运动方向
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;