持续射击和瞄准偏离
2023年8月19日 2024年1月11日
说明
- 当前: 按下鼠标左键触发武器组件的回调函数, 其会调用武器的Fire接口; 只发射一次子弹
- 为发射子弹添加定时器, 鼠标左键按下开启定时器, 进行持续射击, 松开时关闭定时器
概览
- 恢复Camera组件位置
- 为武器发射子弹添加定时器
- 修改武器组件和游戏角色相关逻辑
- 实现瞄准偏离
恢复Camera组件位置, 使之拍摄游戏角色背面
BP_STUBaseCharacter
-
设置Camera组件变换属性
Camera > Details > Transform > Rotation > Yaw = 0
-
在SpringArm组件细节面板设置Camera组件的Socket Offset
SpringArm > Details > Camera > Socket Offset > X = 0 Y = 100
持续射击
修改武器发射子弹逻辑
Stub
ShootThemUp: Weapon/STUBaseWeapon.h
- 定时器
private
1FTimerHandle ShotTimerHandle;
- 定时器间隔
protected
1UPROPERTY(VisibleAnywhere, BlueprintReadWrite) 2float TimeBetweenShots = 0.1f;
- 回调函数使用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);
查看
-
按下鼠标左键数秒, 不移动鼠标, 子弹轨迹成束
-
遗留问题: 游戏角色射击时死亡, 射击定时器未关闭
- 测试方法: 在模拟榴弹爆炸的球内进行持续射击; 在MakeShot添加进入打印
- 进入MakeShot函数后, 因为游戏角色已被销毁, 不会继续处理
- 测试方法: 在模拟榴弹爆炸的球内进行持续射击; 在MakeShot添加进入打印