六一的部落格


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




说明

  • 当前: 按下鼠标左键触发武器组件的回调函数, 其会调用武器的Fire接口; 只发射一次子弹
  • 为发射子弹添加定时器, 鼠标左键按下开启定时器, 进行持续射击, 松开时关闭定时器

概览

  • 恢复Camera组件位置
  • 为武器发射子弹添加定时器
  • 修改武器组件和游戏角色相关逻辑
  • 实现瞄准偏离

恢复Camera组件位置, 使之拍摄游戏角色背面

BP_STUBaseCharacter

  1. 设置Camera组件变换属性

    Camera > Details > Transform > Rotation > Yaw = 0


  2. 在SpringArm组件细节面板设置Camera组件的Socket Offset

    SpringArm > Details > Camera > Socket Offset > X = 0 Y = 100



持续射击


修改武器发射子弹逻辑


Stub

ShootThemUp: Weapon/STUBaseWeapon.h

  1. 定时器

    private
    1FTimerHandle ShotTimerHandle;
  2. 定时器间隔

    protected
    1UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
    2float TimeBetweenShots = 0.1f;
  3. 回调函数使用MakeShot

添加FireStart和FireStop接口

public

ShootThemUp: Weapon/STUBaseWeapon.h

1virtual void FireStart();
2virtual void FireStop();

设置定时器

ShootThemUp: Weapon/STUBaseWeapon.cpp

 1#include "TimerManager.h"
 2void ASTUBaseWeapon::FireStart()
 3{
 4    MakeShot();
 5    GetWorldTimerManager().SetTimer(ShotTimerHandle, this, &ASTUBaseWeapon::MakeShot, TimeBetweenShots, true);
 6}
 7
 8void ASTUBaseWeapon::FireStop()
 9{
10    GetWorldTimerManager().ClearTimer(ShotTimerHandle);
11}

移除Fire接口


修改武器组件发射子弹逻辑


添加回调函数FireStart和FireStop

public

ShootThemUp: Components/STUWeaponComponent.h

1void FireStart();
2void FireStop();

调用武器的FireStart和FireStop接口

ShootThemUp: Components/STUWeaponComponent.cpp

 1void USTUWeaponComponent::FireStart()
 2{
 3    if (!CurrentWeapon) return;
 4    CurrentWeapon->FireStart();
 5}
 6
 7void USTUWeaponComponent::FireStop()
 8{
 9    if (!CurrentWeapon) return;
10    CurrentWeapon->FireStop();
11}

移除Fire接口


修改扣动扳机按键绑定

屏蔽对武器组件Fire接口的绑定, 重新绑定武器组件的FireStart和FireStop接口

ShootThemUp: Player/STUBaseCharacter.cpp

1PlayerInputComponent->BindAction("Fire", IE_Pressed, WeaponComponent, &USTUWeaponComponent::FireStart);
2PlayerInputComponent->BindAction("Fire", IE_Released, WeaponComponent, &USTUWeaponComponent::FireStop);

瞄准目标时, 添加轻微偏离


建模

设想一个圆锥, 给出中心线和偏移角(顶角的一半), 随机返回圆锥内射线, 作为射击方向


添加偏移角

protected

ShootThemUp: Weapon/STUBaseWeapon.h

1UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
2float BulletSpread = 1.5f;

修改射击方向

ShootThemUp: Weapon/STUBaseWeapon.cpp

1// GetTraceData
2
3const auto HalfRad = FMath::DegreesToRadians(BulletSpread);
4const FVector ShootDirection = FMath::VRandCone(ViewRotation.Vector(), HalfRad);

查看

  1. 按下鼠标左键数秒, 不移动鼠标, 子弹轨迹成束


  2. 遗留问题: 游戏角色射击时死亡, 射击定时器未关闭

    • 测试方法: 在模拟榴弹爆炸的球内进行持续射击; 在MakeShot添加进入打印
    • 进入MakeShot函数后, 因为游戏角色已被销毁, 不会继续处理

持续射击和瞄准偏离



说明

  • 当前: 按下鼠标左键触发武器组件的回调函数, 其会调用武器的Fire接口; 只发射一次子弹
  • 为发射子弹添加定时器, 鼠标左键按下开启定时器, 进行持续射击, 松开时关闭定时器

概览

  • 恢复Camera组件位置
  • 为武器发射子弹添加定时器
  • 修改武器组件和游戏角色相关逻辑
  • 实现瞄准偏离

恢复Camera组件位置, 使之拍摄游戏角色背面

BP_STUBaseCharacter

  1. 设置Camera组件变换属性

    Camera > Details > Transform > Rotation > Yaw = 0


  2. 在SpringArm组件细节面板设置Camera组件的Socket Offset

    SpringArm > Details > Camera > Socket Offset > X = 0 Y = 100



持续射击


修改武器发射子弹逻辑


Stub

ShootThemUp: Weapon/STUBaseWeapon.h

  1. 定时器

    private
    1FTimerHandle ShotTimerHandle;
  2. 定时器间隔

    protected
    1UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
    2float TimeBetweenShots = 0.1f;
  3. 回调函数使用MakeShot

添加FireStart和FireStop接口

public

ShootThemUp: Weapon/STUBaseWeapon.h

1virtual void FireStart();
2virtual void FireStop();

设置定时器

ShootThemUp: Weapon/STUBaseWeapon.cpp

 1#include "TimerManager.h"
 2void ASTUBaseWeapon::FireStart()
 3{
 4    MakeShot();
 5    GetWorldTimerManager().SetTimer(ShotTimerHandle, this, &ASTUBaseWeapon::MakeShot, TimeBetweenShots, true);
 6}
 7
 8void ASTUBaseWeapon::FireStop()
 9{
10    GetWorldTimerManager().ClearTimer(ShotTimerHandle);
11}

移除Fire接口


修改武器组件发射子弹逻辑


添加回调函数FireStart和FireStop

public

ShootThemUp: Components/STUWeaponComponent.h

1void FireStart();
2void FireStop();

调用武器的FireStart和FireStop接口

ShootThemUp: Components/STUWeaponComponent.cpp

 1void USTUWeaponComponent::FireStart()
 2{
 3    if (!CurrentWeapon) return;
 4    CurrentWeapon->FireStart();
 5}
 6
 7void USTUWeaponComponent::FireStop()
 8{
 9    if (!CurrentWeapon) return;
10    CurrentWeapon->FireStop();
11}

移除Fire接口


修改扣动扳机按键绑定

屏蔽对武器组件Fire接口的绑定, 重新绑定武器组件的FireStart和FireStop接口

ShootThemUp: Player/STUBaseCharacter.cpp

1PlayerInputComponent->BindAction("Fire", IE_Pressed, WeaponComponent, &USTUWeaponComponent::FireStart);
2PlayerInputComponent->BindAction("Fire", IE_Released, WeaponComponent, &USTUWeaponComponent::FireStop);

瞄准目标时, 添加轻微偏离


建模

设想一个圆锥, 给出中心线和偏移角(顶角的一半), 随机返回圆锥内射线, 作为射击方向


添加偏移角

protected

ShootThemUp: Weapon/STUBaseWeapon.h

1UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
2float BulletSpread = 1.5f;

修改射击方向

ShootThemUp: Weapon/STUBaseWeapon.cpp

1// GetTraceData
2
3const auto HalfRad = FMath::DegreesToRadians(BulletSpread);
4const FVector ShootDirection = FMath::VRandCone(ViewRotation.Vector(), HalfRad);

查看

  1. 按下鼠标左键数秒, 不移动鼠标, 子弹轨迹成束


  2. 遗留问题: 游戏角色射击时死亡, 射击定时器未关闭

    • 测试方法: 在模拟榴弹爆炸的球内进行持续射击; 在MakeShot添加进入打印
    • 进入MakeShot函数后, 因为游戏角色已被销毁, 不会继续处理