I did this for my project and it seems to work pretty well. Basically, just raycast straight out from the camera location, then use the hit location to calculate a rotation offset for the projectile. I implemented it in code, but maybe you could use it to create a blueprint version.
// Setup raycast query parameters used in this function
FCollisionQueryParams queryParams;
queryParams.bTraceComplex = true;
queryParams.AddIgnoredActor(this);
queryParams.AddIgnoredActor(GetOwner());
// Calculate reticle target
FHitResult hitResult;
queryParams.TraceTag = FName(TEXT("ReticleTarget"));
FVector maxReticleTargetExtent = GetTargetingSystemLocation() + GetTargetingSystemDirection() * maxTargetingDist;
bool bHit = w->LineTraceSingleByProfile(
hitResult,
GetTargetingSystemLocation(),
maxReticleTargetExtent,
projectileCollisionProfile,
queryParams);
FVector reticleTargetLocation = bHit ? hitResult.ImpactPoint : maxReticleTargetExtent;
#if !UE_BUILD_SHIPPING
if (AProjectile::bDebugProjectiles)
{
DrawDebugSphere(w, reticleTargetLocation, 100.f, 8.f, FColor::Red, true, 1.f);
}
#endif //!UE_BUILD_SHIPPING
// Calculate projectile spawn rotation
FName muzzleSocket = *FString::Printf(TEXT("Muzzle%d"), muzzleIndex);
FVector muzzleLocation = mesh->GetSocketLocation(muzzleSocket);
FRotator projectileRotation = (reticleTargetLocation - muzzleLocation).Rotation();