Niagara Component in C++?

I am trying to replicate the VR Pawn with a C++ class. I’ve nativized a 4.26 BP to study its code, but I can’t seem to get my 5.0 version working.

My pawn class has a “TObjectPtr TeleportTrace”, and in the constructor, I do this:

	static ConstructorHelpers::FObjectFinder<UNiagaraSystem> Trace(TEXT("/Game/VRTemplate/VFX/NS_TeleportTrace.NS_TeleportTrace"));

	TeleportTrace = CreateDefaultSubobject<UNiagaraComponent>(TEXT("TeleportTrace"));
	TeleportTrace->SetupAttachment(MotionControllerRight);

	TeleportTrace->SetAsset(Trace.Object);
	TeleportTrace->SetRelativeLocation(FVector(0.0));
	TeleportTrace->SetTickBehavior(ENiagaraTickBehavior::UsePrereqs);
	TeleportTrace->SetAllowScalability(true);
	TeleportTrace->SetAutoActivate(true);
	TeleportTrace->SetVisibility(false, false);

	TArray<FVector> TracePoints;
	TracePoints.Add(FVector(0.0, 0.0, 0.0));
	TracePoints.Add(FVector(20.0, 0.0, 10.0));
	TracePoints.Add(FVector(40.0, 0.0, 0.0));
	TracePoints.Add(FVector(60.0, 0.0, -20.0));
	TracePoints.Add(FVector(80.0, 0.0, -50.0));
	UNiagaraDataInterfaceArrayFunctionLibrary::SetNiagaraArrayVector(TeleportTrace, FName(TEXT("User.PointArray")), TracePoints);

And then when I want to see it I just do “TeleportTrace->SetVisibility(true, false);”. But I never see it! What am I doing wrong?

Ah. Primarily the issue was the points not being sufficient. The following works:

In class header:

	TObjectPtr<UNiagaraSystem> TraceSystem;
	TObjectPtr<UNiagaraComponent> TraceComponent;
	TArray<FVector> TeleportPath;

In class constructor:

	static ConstructorHelpers::FObjectFinder<UNiagaraSystem> Trace(TEXT("/Game/VRTemplate/VFX/NS_TeleportTrace.NS_TeleportTrace"));

	TraceSystem = Trace.Object;

In BeginPlay:

	TraceComponent = UNiagaraFunctionLibrary::SpawnSystemAttached(TraceSystem, MotionControllerRight, FName(TEXT("TraceComponent")), FVector(0), FRotator(), EAttachLocation::Type::KeepRelativeOffset, true, true);

In Tick:

		FVector start = TraceComponent->GetComponentLocation();
		FPredictProjectilePathParams params(0.0f, start, TraceComponent->GetForwardVector() * 650.0, 4.0f, UEngineTypes::ConvertToObjectType(ECC_WorldStatic));
		FPredictProjectilePathResult result;
		if(UGameplayStatics::PredictProjectilePath(GetWorld(), params, result))
		{
			if(TeleportPath.Num() != result.PathData.Num() + 1)
				TeleportPath.SetNumUninitialized(result.PathData.Num() + 1);
			TeleportPath[0] = start;
			for(int i = 0; i < result.PathData.Num(); i++)
				TeleportPath[i + 1] = result.PathData[i].Location;

			UNiagaraDataInterfaceArrayFunctionLibrary::SetNiagaraArrayVector(TraceComponent, FName(TEXT("User.PointArray")), TeleportPath);
		}