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 방향으로 날아가는 것을 볼 수 있다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
9-1. 어빌리티 태스크(Ability Tasks) (0) | 2024.12.09 |
---|---|
8-10. 게임플레이 어빌리티 - (3) 투사체 생성 및 발사 (0) | 2024.12.05 |
8-9. 코드 리펙토링 - 메세지 팝업 디버그, RPC (0) | 2024.12.05 |
8-8. 입력 - (5) 클릭해서 캐릭터 이동하기, 길 찾기 (0) | 2024.12.05 |
8-7. 입력 - (4) 입력에 따른 어빌리티 활성화 (0) | 2024.12.03 |