How to spawn a particle system

Boutta Be Banned
Mon, 13 Jul 2020 17:52:24 +0000
FX

I am trying to spawn an emitter using the explosion effect given in the starter content folder of UE4. I am trying to use static ConstructorHelpers::FObjectFinder<UParticleSystem> explosion(TEXT("/Game/FirstPerson/Particles/P_Explosion.P_Explosion"));

but it gives me the error

G:\UE_4.24\Engine\Source\Runtime\CoreUObject\Public\UObject/ConstructorHelpers.h(110) : error C2664: ‘void ConstructorHelpers::ValidateObject(UObject *,const FString &,const TCHAR *)’: cannot convert argument 1 from ‘T *’ to ‘UObject *’

I have tried a lot of different solutions and have researched for hours on end trying to solve this, but I haven’t been able to and so I’d really appreciate it if someone could help me out.

Projectile.h

#pragma once

#include "CoreMinimal.h"
#include "ParticleDefinitions.h"
#include "GameFramework/Actor.h"
#include "Runtime/Engine/Classes/Kismet/GameplayStatics.h"
#include "Runtime/Engine/Classes/Kismet/KismetSystemLibrary.h"
#include "FirstShooterProjectile.generated.h"


UCLASS(config=Game)
class AFirstShooterProjectile : public AActor
{
	GENERATED_BODY()

	/** Sphere collision component */
	UPROPERTY(VisibleDefaultsOnly, Category=Projectile)
	class USphereComponent* CollisionComp;

	/** Projectile movement component */
	UPROPERTY(VisibleAnywhere, Category = Movement, meta = (AllowPrivateAccess = "true"))
	class UProjectileMovementComponent* ProjectileMovement;

public:
	AFirstShooterProjectile();
	/** called when projectile hits something */
	UFUNCTION()
	void OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);

	/** Returns CollisionComp subobject **/
	FORCEINLINE class USphereComponent* GetCollisionComp() const { return CollisionComp; }
	/** Returns ProjectileMovement subobject **/
	FORCEINLINE class UProjectileMovementComponent* GetProjectileMovement() const { return ProjectileMovement; }
	void FireInDirection(const FVector& ShootDirection, float rocketCharge);
	UPROPERTY(EditAnywhere)
	UParticleSystem* explosiveSpawn;


};

Projectile.cpp

#include "FirstShooterProjectile.h"
#include "GameFramework/ProjectileMovementComponent.h"
#include "Components/SphereComponent.h"
#include "UObject/ConstructorHelpers.h"
#include "Engine/World.h"
#include "Runtime/Engine/Classes/Kismet/GameplayStatics.h"
#include "Runtime/Engine/Classes/Kismet/KismetSystemLibrary.h"
#include "Runtime/Engine/Classes/Kismet/GameplayStaticsTypes.h"



AFirstShooterProjectile::AFirstShooterProjectile()
{

	// Use a sphere as a simple collision representation
	CollisionComp = CreateDefaultSubobject<USphereComponent>(TEXT("SphereComp"));
	CollisionComp->InitSphereRadius(5.0f);
	CollisionComp->BodyInstance.SetCollisionProfileName("Projectile");
	CollisionComp->OnComponentHit.AddDynamic(this, &AFirstShooterProjectile::OnHit);		// set up a notification for when this component hits something blocking

	// Players can't walk on it
	CollisionComp->SetWalkableSlopeOverride(FWalkableSlopeOverride(WalkableSlope_Unwalkable, 0.f));
	CollisionComp->CanCharacterStepUpOn = ECB_No;

	// Set as root component
	RootComponent = CollisionComp;

	// Use a ProjectileMovementComponent to govern this projectile's movement
	ProjectileMovement = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("ProjectileComp"));
	ProjectileMovement->UpdatedComponent = CollisionComp;
	ProjectileMovement->bRotationFollowsVelocity = true;
	ProjectileMovement->bShouldBounce = false;
	ProjectileMovement->ProjectileGravityScale = 0;

	// Die after 10 seconds by default
	InitialLifeSpan = 10.0f;
	static ConstructorHelpers::FObjectFinder<UParticleSystem> explosion(TEXT("/Game/FirstPerson/Particles/P_Explosion.P_Explosion"));
	explosiveSpawn = explosion.Object;

}

void AFirstShooterProjectile::OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit)
{
	// Only add impulse and destroy projectile if we hit a physics
	if ((OtherActor != this) && (OtherComp != NULL))
	{
		//Get World
		UWorld* world = GetWorld();
		FActorSpawnParameters SpawnParams;
		FRotator rotator = Hit.ImpactNormal.Rotation();
		FVector spawnLocation = Hit.ImpactPoint;
		UGameplayStatics::SpawnEmitterAtLocation(world, explosiveSpawn, spawnLocation, rotator, true);











		Destroy();
	}
}

void AFirstShooterProjectile::FireInDirection(const FVector& ShootDirection, float rocketCharge)
{
	ProjectileMovement->Velocity = ShootDirection * (rocketCharge * 10000.0f);
}

I provided the entirety of the files involved in case that helps. This is my first post, so sorry if I'm missing any common practices or formalities.

6 posts - 1 participant