0. 개요

적을 클릭했을 때 게임플레이 어빌리티가 발동되는 것을 구현했다.

이제 해당 어빌리티 발동 후 발사체를 생성하여 발사하도록 한다.

 

 

1. 투사체 생성

(1) 액터를 부모로 하는 투사체 부모 클래스 생성 - AuraProjectile

이 클래스는 게임 내 투사체의 부모 클래스가 된다.

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "AuraProjectile.generated.h"

class USphereComponent;

UCLASS()
class AURA_API AAuraProjectile : public AActor
{
	GENERATED_BODY()
	
public:	
	AAuraProjectile();

protected:
	virtual void BeginPlay() override;

private:
	UPROPERTY(VisibleAnywhere)
	TObjectPtr<USphereComponent> Sphere;
};

 

 

(2) 구체 정의

모든 투사체를 구형으로 사용할 것이라면 블루프린트에서 지정하는 것이 아니라 C++에서 직접 작성하는 방법도 있다.

#include "Actor/AuraProjectile.h"
#include "Components/SphereComponent.h"

AAuraProjectile::AAuraProjectile()
{
	PrimaryActorTick.bCanEverTick = false;

	Sphere = CreateDefaultSubobject<USphereComponent>("Sphere");
	SetRootComponent(Sphere);
	Sphere->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
	Sphere->SetCollisionResponseToAllChannels(ECR_Ignore);
	Sphere->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap);
	Sphere->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap);
	Sphere->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);
}

void AAuraProjectile::BeginPlay()
{
	Super::BeginPlay();
	Sphere->OnComponentBeginOverlap.AddDynamic(this, &AAuraProjectile::OnSphereOverlap);
}

Sphere를 생성해서 루트 컴포넌트로 만들고, 쿼리에 대한 콜리전을 켜준다.

모든 채널에 대해서 무시로 설정 후 월드 다이나믹, 월드 스태틱, 폰에 대해서 충돌 하도록 채널을 설정한다.

 

 

(3) 오버랩 함수

UFUNCTION()
void OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);

구체의 겹침을 판단하는 함수이다.

 

 

2. 투사체 움직임 컴포넌트(Projectile Movement Component)

이 컴포넌트를 사용하면 투사체를 발사하는 코드를 직접 짜지 않아도 언리얼에서 제공하는 투사체 함수를 사용할 수 있다.

곡선을 따라 날아가는 투사체 또는 유도되는 투사체를 만들 수 있다.

 

(1) 정의

public:	
	AAuraProjectile();

	UPROPERTY(VisibleAnywhere)
	TObjectPtr<UProjectileMovementComponent> ProjectileMovement;
#include "Actor/AuraProjectile.h"
#include "Components/SphereComponent.h"
#include "GameFramework/ProjectileMovementComponent.h"

AAuraProjectile::AAuraProjectile()
{
	PrimaryActorTick.bCanEverTick = false;

	Sphere = CreateDefaultSubobject<USphereComponent>("Sphere");
	SetRootComponent(Sphere);
	Sphere->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
	Sphere->SetCollisionResponseToAllChannels(ECR_Ignore);
	Sphere->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap);
	Sphere->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap);
	Sphere->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);

	ProjectileMovement = CreateDefaultSubobject<UProjectileMovementComponent>("ProjectileMovement");
	ProjectileMovement->InitialSpeed = 550.f;
	ProjectileMovement->MaxSpeed = 550.f;
	ProjectileMovement->ProjectileGravityScale = 0.f;
}

투사체 움직임 컴포넌트의 기본 설정을 생성자에서 정의한다.

이 프로젝트에서 투사체는 중력의 영향을 받지 않는다.

 

 

3. 파이어볼트 투사체 블루프린트 생성

Blueprints - AbilitySystem - GameplayAbilities에 속성 별 폴더를 생성하고, 해당 폴더 내에 어빌리티의 폴더(Fire - FireBolt)를 생성하도록 한다.

AuraProjectile을 상속받는다.

 

(1) 나이아가라 파티클 시스템 컴포넌트(Niagara Particle System Component)

투사체의 형태는 나이아가라 시스템으로 구현되어 있기 때문에 해당 컴포넌트를 사용하여 추가한다.

이제 이 FireBolt를 월드에 놓으면 Foward 방향으로 날아가는 것을 볼 수 있다.