UE5/Gameplay Abilities

[UE5] 파이어볼 생성 구현

Mini_96 2024. 6. 9. 22:26

* 발사체주문 클래스 생성

AGA 상속받은 클래스 생성 => 모든능력상속가능 (ex. 태그)

 

* 발사체주문 클래스에 뭐가 필요한지 생각

GA 살펴보기

* 능력활성화 함수 Test (c++ , BP)

class AURA_API UAuraProjectileSpell : public UAuraGameplayAbility
{
    GENERATED_BODY()

protected:
    virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo,
       const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData) override;
    
};

 

일단 로그만 찍어보자

 

// Fill out your copyright notice in the Description page of Project Settings.


#include "AbilitySystem/Abilities/AuraProjectileSpell.h"

#include "Kismet/KismetSystemLibrary.h"

void UAuraProjectileSpell::ActivateAbility(const FGameplayAbilitySpecHandle Handle,
                                           const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo,
                                           const FGameplayEventData* TriggerEventData)
{
    Super::ActivateAbility(Handle, ActorInfo, ActivationInfo, TriggerEventData);

    //BP의 PrintString과 동일함
    UKismetSystemLibrary::PrintString(this,FString("ActivatedAbility C++"), true, true,FLinearColor::Yellow, 3);
}

를 상속받은 GA BP 생성 //발사체스펠은 GA 를 상속받았음
GA에 (시작)태그추가
캐릭터 능력에 GA_FireBolt 추가!

 

결과 : 적을 LMB로 클릭하면 능력이 활성화 되는 모습

 

* 발사체 주문함수 구현

- 일단 발차세클래스를 변수로 가져야함 (의존성주입은 BP에서)

UPROPERTY(EditAnywhere, BlueprintReadOnly)
TSubclassOf<AAuraProjectile> ProjectileClass;

- 우리는 발사체를 서버에서 생성하고 , 클라로 복사함(클라는 복사본을 보게될것임)

발사체클래스에서 복사 켜주기

AAuraProjectile::AAuraProjectile()
{
    PrimaryActorTick.bCanEverTick = false;
    bReplicates=true; //발사체 서버에서 클라로 복사

 

발사체가 서버에있는지 알려주는 함수

발사체 생성하는 함수구현

void UAuraProjectileSpell::ActivateAbility(const FGameplayAbilitySpecHandle Handle,
                                           const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo,
                                           const FGameplayEventData* TriggerEventData)
{
    Super::ActivateAbility(Handle, ActorInfo, ActivationInfo, TriggerEventData);

    //발사체는 서버에서생성, 클라는 복제본을 보게될거임
    //발사체가 서버에있는지 어케암?
    const bool bIsServer = HasAuthority(&ActivationInfo);
    if(! bIsServer) return ; //발사체가 서버있는경우만 발사체 생성

    FTransform SpanwTransform; //발사체생성할 위치 == 지팡이끝 / but, 캐릭터에의존하면안됨, 전투인터페이스에서 소켓위치를 반환받으면 좋겠음.
    //<생성하고자하는타입> (클래스, 날아갈 회전값, 수행자, 수행할폰, 충돌-겹침 상관없이 항상생성)
    GetWorld()->SpawnActorDeferred<AAuraProjectile>(
       ProjectileClass,
       SpanwTransform,
       GetOwningActorFromActorInfo(),
       Cast<APawn>(GetOwningActorFromActorInfo()),
       ESpawnActorCollisionHandlingMethod::AlwaysSpawn);
}

 

* 문제 : 발사체를 생성할위치를 정하는데, 캐릭에 의존안하고 전투인터페이스에서 소켓위치를 리턴받고자함

전투인터페이스에 달아주고, 구현은 상속받은 캐릭베이스에서 하셈 ㅋ

구현
FVector AAuraCharacterBase::GetCombatSocketLocation()
{
    return Weapon->GetSocketLocation(WeaponTipSocketName);
}

 

- 할일 :에디터에서 WeaponTipSocketName 설정

캐릭터 > 무기에서 지팡이를 찾음
찾아보니 이름이 TipSocket임
그걸로 설정 (의존성주입)

아래코드가 실행될거임

FVector AAuraCharacterBase::GetCombatSocketLocation()
{
    return Weapon->GetSocketLocation("TipSocket");
}

 

* 크래쉬 발생

원인 : 얘가 널임

해결 : GA에서 발사체 클래스 뭘 사용할건지 의존성주입 해주면됨  //우리가만든 BP_FireBolt 사용

 

* Test

버그 1 : 클릭한 고블린 방향으로 불이 나가야됨

해결 : 회전을 설정해주면됨

버그2 : 클릭을 똇는데 타게팅이 안사라짐