Is this what you want?
PuzzleCrystal.h
#pragma once
#include "GameFramework/Actor.h"
#include "PuzzleCrystal.generated.h"
UCLASS()
class APuzzleCrystal : public AActor
{
GENERATED_BODY()
public:
APuzzleCrystal();
// Called when the game starts or when spawned
virtual void BeginPlay() override;
// Called every frame
virtual void Tick(float DeltaSeconds) override;
UPROPERTY(EditAnywhere, Category = General)
TSubclassOf<AActor> WhatToSpawn;
UPROPERTY(Category = Block, VisibleDefaultsOnly, BLueprintReadOnly, meta = (AllowPrivateAccess = "true"))
TWeakObjectPtr<AActor> Crystal;
private:
UPROPERTY()
class USceneComponent *Root;
UPROPERTY()
class UBillboardComponent *Billboard;
};
PuzzleCrystal.cpp
#include "PuzzleFromZiro.h"
#include "PuzzleCrystal.h"
#include "Components/BillboardComponent.h"
// Sets default values
APuzzleCrystal::APuzzleCrystal()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
struct FConstructorStatics
{
ConstructorHelpers::FObjectFinderOptional<UBlueprint> CrystalRed;
ConstructorHelpers::FObjectFinderOptional<UBlueprint> CrystalBlue;
ConstructorHelpers::FObjectFinderOptional<UBlueprint> CrystalGreen;
ConstructorHelpers::FObjectFinderOptional<UBlueprint> CrystalYellow;
FConstructorStatics()
:CrystalRed(TEXT("/Game/Objects/Crystal/Blueprint/Red.Red"))
, CrystalBlue(TEXT("/Game/Objects/Crystal/Blueprint/Blue.Blue"))
, CrystalGreen(TEXT("/Game/Objects/Crystal/Blueprint/Green.Green"))
, CrystalYellow(TEXT("/Game/Objects/Crystal/Blueprint/Yellow.Yellow"))
{
}
};
static FConstructorStatics ConstructorStatics;
Root = CreateDefaultSubobject<USceneComponent>(TEXT("Root"));
RootComponent = Root;
Billboard = CreateDefaultSubobject<UBillboardComponent>(TEXT("Billboard"));
Billboard->AttachTo(RootComponent);
UBlueprint *CrystalType = nullptr;
switch (rand() % 4)
{
case 0:CrystalType = ConstructorStatics.CrystalRed.Get();
break;
case 1:CrystalType = ConstructorStatics.CrystalBlue.Get();
break;
case 2:CrystalType = ConstructorStatics.CrystalGreen.Get();
break;
case 3:CrystalType = ConstructorStatics.CrystalYellow.Get();
break;
}
if (CrystalType)
WhatToSpawn = (UClass*)CrystalType->GeneratedClass;
}
// Called when the game starts or when spawned
void APuzzleCrystal::BeginPlay()
{
Super::BeginPlay();
if (WhatToSpawn != NULL)
{
FActorSpawnParameters SpawnParametrs;
SpawnParametrs.Owner = this;
SpawnParametrs.bNoFail = true;
UWorld* const World = GetWorld();
if (World)
{
Crystal = World->SpawnActor<AActor>(WhatToSpawn, GetActorLocation(),
{ 90.0, 0.0, -90.0 }, SpawnParametrs);
}
}
}
// Called every frame
void APuzzleCrystal::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}