开火功能思路介绍


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


  对于这个功能的思路就是,我们触发了我们的开火事件,然后在我们的枪口位置动态生成我们的发射物,而我们的发射物已经设置了初速度,然后以这个速度往前发射,进行物理模拟。根据以上思路我们来看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);