Download

[Solved] Spawning an actor via a blueprint in my content folder?

I have a blueprint named “RifleProjectile_BP1” in my Content folder, with a parent class of “Actor”. I want to spawn an instance of this blueprint in the game world (at a specific location) when the player presses the left mouse button. It’s essentially a bullet that I want to spawn when the player fires their weapon.

How can I get C++ to recognize my blueprint class. I think I’m messed up a little bit on the syntax.

Here is my script .h file:



#pragma once

#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "RifleComp1.generated.h"


UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class THIRDPER2_API URifleComp1 : public UActorComponent
{
 GENERATED_BODY()

public:
 // Sets default values for this component's properties
 URifleComp1();

protected:
 // Called when the game starts
 virtual void BeginPlay() override;

public:
 // Called every frame
 virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;


private:
 AActor* MainCharacter;
 APlayerController* MainPlayerController1;

 UPROPERTY(EditAnywhere)
 AActor* RifleMuzzleFlash1;

 UPROPERTY(EditAnywhere)
 AActor* RifleBulletProjectile1;

 UParticleSystemComponent* MuzzleFlashParticleComp1;

};


And here is the .cpp file:



#include "RifleComp1.h"
#include "GameFramework/Actor.h"
#include "Runtime/Engine/Classes/Particles/ParticleSystemComponent.h"
#include "Components/InputComponent.h"
#include "Engine/Blueprint.h"
#include "Engine/World.h"


// Sets default values for this component's properties
URifleComp1::URifleComp1()
{
 // Set this component to be initialized when the game starts, and to be ticked every frame.  You can turn these features
 // off to improve performance if you don't need them.
 PrimaryComponentTick.bCanEverTick = true;

}


// Called when the game starts
void URifleComp1::BeginPlay()
{
 Super::BeginPlay();

 MainCharacter = GetWorld()->GetFirstPlayerController()->GetPawn();
 MainPlayerController1 = GetWorld()->GetFirstPlayerController();

 MuzzleFlashParticleComp1 = RifleMuzzleFlash1->FindComponentByClass<UParticleSystemComponent>();

}


// Called every frame
void URifleComp1::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
 Super::TickComponent(DeltaTime, TickType, ThisTickFunction);

 // If the player presses the "Shoot1" button.
 //if (MainPlayerController1->IsInputKeyDown(EKeys::LeftMouseButton))
 if (MainPlayerController1->WasInputKeyJustPressed(EKeys::LeftMouseButton))
 {
  UE_LOG(LogTemp, Warning, TEXT("LeftMouseWasClicked!"));

  if (MuzzleFlashParticleComp1 != nullptr)
  {
   MuzzleFlashParticleComp1->ActivateSystem(true);

   // Spawn the bullet at the particle system location.  The bullet blueprint (i.e. rifle projectile blueprint)
   // already has a default "ProjectileMovement" script/component on it, so that should make the bullet
   // move automatically when spawned.
   if (RifleBulletProjectile1 != nullptr)
   {
    FActorSpawnParameters SpawnInfo;
    GetWorld()->SpawnActor<AActor>(ARifleProjectile_BP1, MuzzleFlashParticleComp1->GetLocation(), MuzzleFlashParticleComp1->GetRotation(), SpawnInfo);
   }
  }
 }
}


In my .cpp file it will not recognize “RifleProjectile_BP1” as a class. But I don’t know how to get it to recognize it as a class, since it’s a blueprint I’m assuming.

Thanks for any help.

You can use

UPROPERTY(EditAnywhere)
TSubclassOf<class AActor> yourBulletClassName;

Then you can come out to your BP class, chose your BP projectile class there.

That worked! Thanks. :slight_smile: