관리 메뉴

Mini

[UE5] 데미지 입히기 구현 // fix : 시작시불쏘는버그, 불에서벗어나도 체력깍이는버그 본문

UE5/Ability Tasks

[UE5] 데미지 입히기 구현 // fix : 시작시불쏘는버그, 불에서벗어나도 체력깍이는버그

Mini_96 2024. 6. 16. 07:28

* GE 만들기

GE만들기
수정자 설정

* SpecHandle 만들기

포인터가아니므로, .h를 인클루드해야함

class AURA_API AAuraProjectile : public AActor
{
    ...

    UPROPERTY(BlueprintReadWrite,meta = (ExposeOnSpawn=true)) //BP 노드에 노출
    FGameplayEffectSpecHandle DamageEffectSpecHandle;

스펠(GA 화염구)에서 사용할 GE 변수를 만듬

class AURA_API UAuraProjectileSpell : public UAuraGameplayAbility
{
    ...
    UPROPERTY(EditDefaultsOnly,BlueprintReadOnly)
    TSubclassOf<UGameplayEffect> DamageEffectClass; //데미지줄 GE

화염구에서 사용

발사체의 specHandle을 set

//TODO: 발사체에게 Gameplay Effect Spec 부여 => 데미지 주기위해
//1. SpecHandle 만들기
UAbilitySystemComponent* SourceASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(GetAvatarActorFromActorInfo());
FGameplayEffectSpecHandle SpecHandle = SourceASC->MakeOutgoingSpec(DamageEffectClass, GetAbilityLevel(),SourceASC->MakeEffectContext());
Projectile->DamageEffectSpecHandle=SpecHandle; //set

GE 적용하기

void AAuraProjectile::OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,
                                      UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
    ...

    //서버에있는경우 
	if(HasAuthority())
	{
		if(auto TargetASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(OtherActor))
		{
			//GE 적용하기
			TargetASC->ApplyGameplayEffectSpecToSelf(*DamageEffectSpecHandle.Data.Get());
		}
		
		Destroy(); //파괴 => 클라에복제안되게
	}

-AS에 디버깅용 코드 추가

void UAuraAttributeSet::PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data)
{
    Super::PostGameplayEffectExecute(Data);

    FEffectProperties Props;
    SetEffectProperties(Data,Props);

    if(Data.EvaluatedData.Attribute==GetHealthAttribute())
    {
       SetHealth(FMath::Clamp(GetHealth(),0.f,GetMaxHealth()));
       UE_LOG(LogTexture, Warning, TEXT("Changed Health on %s Health: %f"),*Props.TargetAvatarActor->GetName(),GetHealth());

 

* 적 속성 초기화하기

적의 부모인 캐릭베이스에 3가지속성이있음

초기화 함수도 있음

void AAuraCharacterBase::InitializeDefaultAttributes() const
{
    ApplyEffectToSelf(DefaultPrimaryAttributes, 1.f);
    ApplyEffectToSelf(DefaultSecondaryAttributes, 1.f);
    ApplyEffectToSelf(DefaultVitalAttributes, 1.f);
}

사용만 하면됨

void AAuraEnemy::InitAbilityActorInfo()
{
    ...

    InitializeDefaultAttributes();
}

일단 아우라껄로 셋팅
결과 : 체력이 0인 버그?

-해결 : 비긴플레이에서 함수호출 안하고있었음..

void AAuraEnemy::BeginPlay()
{
    Super::BeginPlay();
    InitAbilityActorInfo();
}

결과 : good!

 

* 시작시 불쏘는 버그 고치기

맵에 GA_firebolt가 배치되있었음 -> 삭제

 

* 불에서 벗어나도 체력 깍이는 버그 고치기

버그
관찰 : 겹칠때는 -10, 나가면 -5

효과가 2번적용되는걸로 추정

원인 : 캐릭의 캡슐, 매쉬에 2번 겹쳐서 그런거임

해결 : 캡슐에서 오버랩 이벤트꺼줌

- cpp 에서도 수정

// Sets default values
AAuraCharacterBase::AAuraCharacterBase()
{
    // Set this character to call Tick() every frame.
    // You can turn this off to improve performance if you don't need it.
    PrimaryActorTick.bCanEverTick = false; //틱마다 tick함수 실행하지마

    //캐릭겹치면 카메라 줌인 해결 : 캡슐, 매시가 카메라 무시하도록
    GetCapsuleComponent()->SetCollisionResponseToChannel(ECC_Camera,ECR_Ignore);
    GetCapsuleComponent()->SetGenerateOverlapEvents(false);

 

https://github.com/DongHoonYu96/GameplayAbilitySystem_Aura/commit/9a8053991fd959e9d027db2523d275fc0f823c20

 

feat : 데미지 입히기 구현 · DongHoonYu96/GameplayAbilitySystem_Aura@9a80539

fix : 시작시불쏘는버그, 불에서 벗어나도 체력깍이는버그

github.com