开火功能思路介绍
对于开火功能,我们需要一个按键事件,这个事件是绑定的鼠标左键,如下图:

对于这个功能的思路就是,我们触发了我们的开火事件,然后在我们的枪口位置动态生成我们的发射物,而我们的发射物已经设置了初速度,然后以这个速度往前发射,进行物理模拟。根据以上思路我们来看FirstProjectCharacter.h中所定义的内容
public:
// 发射物的模板
UPROPERTY(EditDefaultsOnly, Category=Projectile)
TSubclassOf<class AFirstProjectProjectile> ProjectileClass;
// 开火音效资源指针
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Gameplay)
class USoundBase* FireSound;
// 开火动画资源指针
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Gameplay)
class UAnimMontage* FireAnimation;
protected:
// 开火事件
void OnFire();
于是在FirstProjectCharacter.cpp中:
// SetupPlayerInputComponent()绑定输入事件
PlayerInputComponent->BindAction("Fire", IE_Pressed, this, &AFirstProjectCharacter::OnFire);
void AFirstProjectCharacter::OnFire(){
// 发射物是否为空
if (ProjectileClass != NULL){
// 获得世界
UWorld* const World = GetWorld();
// 世界不为空
if (World != NULL){
// 获得控制器的旋转
const FRotator SpawnRotation = GetControlRotation();
// 获得发射位置
const FVector SpawnLocation = ((FP_MuzzleLocation != nullptr) ? FP_MuzzleLocation->GetComponentLocation() : GetActorLocation()) + SpawnRotation.RotateVector(GunOffset);
// 设置碰撞相关
FActorSpawnParameters ActorSpawnParams;
ActorSpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButDontSpawnIfColliding;
// 动态生成发射物,传入的参数分别为发射物的类型,初始位置,旋转,发射物碰撞参数
World->SpawnActor<AFirstProjectProjectile>(ProjectileClass, SpawnLocation, SpawnRotation, ActorSpawnParams);
}
}
// 播放音效
if (FireSound != NULL){
UGameplayStatics::PlaySoundAtLocation(this, FireSound, GetActorLocation());
}
// 播放动画
if (FireAnimation != NULL){
// 获取动画蓝图
UAnimInstance* AnimInstance = Mesh1P->GetAnimInstance();
if (AnimInstance != NULL){
AnimInstance->Montage_Play(FireAnimation, 1.f);
}
}
}
其最主要的是SpawnActor方法动态生成物体,它的用法如下:
/*
AFirstProjectProjectile:生成物的类型
ProjectileClass:生成物的模板类
SpawnLocation:生成的位置
SpawnRotation:物体生成后的旋转属性
ActorSpawnParams:碰撞相关参数
*/
World->SpawnActor<AFirstProjectProjectile>(ProjectileClass, SpawnLocation, SpawnRotation, ActorSpawnParams);