0. 개요
이전 포스트에서 각 액터들에 대해 투사체의 충돌 반응을 설정했다.
이제 투사체에 기본적인 데미지를 부여하는 게임플레이 이펙트를 적용한다.
1. 투사체에 기본 데미지 게임플레이 이펙트 적용하기
(1) 게임플레이 이펙트 생성
기본적인 데미지를 입히는 게임플레이 이펙트인 GE_Damage를 생성한다.
단순하게 체력 속성을 10 깎도록 설정한다.
(2) 게임플레이 이펙트 핸들 멤버 변수로 정의하기 - AuraProjectile
투사체를 발사할 때 게임플레이 이펙트가 아니라 경량화된 데이터를 가진 게임플레이 이펙트 핸들을 가지고 있게 설정하려고 한다.
public:
AAuraProjectile();
UPROPERTY(VisibleAnywhere)
TObjectPtr<UProjectileMovementComponent> ProjectileMovement;
UPROPERTY(BlueprintReadWrite, meta=(ExposeOnSpawn = true))
FGameplayEffectSpecHandle DamageEffectSpecHandle;
#include "GameplayEffectTypes.h"
투사체가 생성될 때 데미지 이펙트 스펙 핸들을 설정할 것이다.
(3) 투사체에 데미지 이펙트 스팩 핸들 전달 - AuraProjectileSpell
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
TSubclassOf<UGameplayEffect> DamageEffectClass;
#include "GameplayEffect.h"
#include "AbilitySystemBlueprintLibrary.h"
#include "AbilitySystemComponent.h"
// TODO : 투사체에 게임플레이 이펙트 스펙 붙이기 - 데미지 부여
const UAbilitySystemComponent* SourceASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(GetAvatarActorFromActorInfo());
const FGameplayEffectSpecHandle SpecHandle = SourceASC->MakeOutgoingSpec(DamageEffectClass, GetAbilityLevel(), SourceASC->MakeEffectContext());
Projectile->DamageEffectSpecHandle = SpecHandle;
Projectile->FinishSpawning(SpawnTransform);
}
}
투사체 스펠 어빌리티를 사용하는 액터의 어빌리티 시스템 컴포넌트를 가져와 데미지 이펙트 스펙 핸들을 생성한다.
생성된 스펙 핸들을 투사체에 전달한다.
(4) 투사체 겹침 데미지 판정 - AuraProjectile
void AAuraProjectile::OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
UGameplayStatics::PlaySoundAtLocation(this, ImpactSound, GetActorLocation(), FRotator::ZeroRotator);
UNiagaraFunctionLibrary::SpawnSystemAtLocation(this, ImpactEffect, GetActorLocation());
LoopingSoundComponent->Stop();
if (HasAuthority())
{
// 데미지 판정 - Gameplay Effect Handle
if (auto* TargetASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(OtherActor))
{
TargetASC->ApplyGameplayEffectSpecToSelf(*DamageEffectSpecHandle.Data.Get());
}
Destroy();
}
else
{
bHit = true;
}
}
대상의 ASC를 가져와 스스로에게 게임플레이 이펙트 스펙을 적용하게 한다.
이 때, 스펙 핸들의 Data에 접근해 Get을 하면 핸들의 포인터가 반환되므로 '*'를 사용하여 데이터를 가져와야 한다.
- 해당 클래스에서 컴파일 오류가 발생한다면 아래 첨부를 헤더 파일에 작성한다.
#include "GameplayEffectTypes.h"
(5) 체력 속성 변화 디버그 - AuraAttributeSet
투사체 공격으로 체력 속성에 변화가 발생하면 로그를 출력하도록 설정한다.
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(LogTemp, Warning, TEXT("%s의 체력: %f"), *Props.TargetAvatarActor->GetName(), GetHealth());
}
if (Data.EvaluatedData.Attribute == GetManaAttribute())
{
SetMana(FMath::Clamp(GetMana(), 0.f, GetMaxMana()));
}
}
(6) 몬스터의 속성 초기화 - AuraEnemy
void AAuraEnemy::InitAbilityActorInfo()
{
AbilitySystemComponent->InitAbilityActorInfo(this, this);
Cast<UAuraAbilitySystemComponent>(AbilitySystemComponent)->AbilityActorInfoSet();
InitializeDefaultAttributes();
}
InitializeDefaultAttributes 함수는 AuraCharacterBase에 정의되어 있고 내용은 아래와 같다.
void AAuraCharacterBase::InitializeDefaultAttributes() const
{
ApplyEffectToSelf(DefaultPrimaryAttributes, 1.f);
ApplyEffectToSelf(DefaultSecondaryAttributes, 1.f);
ApplyEffectToSelf(InitializeVitalAttributes, 1.f);
}
(7) 블루프린트 설정
(7-1) 게임플레이 어빌리티 - GA_FireBolt
파이어볼트 주문에 데미지 이펙트를 적용한다.
(7-2) 몬스터에 속성 설정 - BP_EnemyBase
몬스터 액터에 데미지를 적용하기 위해 AttributeSet를 초기화한다.
2. 버그 수정- 불 영역에서 빠져나와도 데미지를 지속적으로 입음
(1) BP_AuraCharacter
투사체의 충돌을 처리하면서 캐릭터의 메쉬에 오버랩 이벤트가 발생하도록 설정했다.
그런데 이미 캐릭터의 캡슐 컴포넌트도 오버랩 이벤트가 발생하기 때문에 불 영역 게임플레이 이펙트가 지속적으로 발생하는 것으로 보인다(두 개의 컴포넌트가 같이 영향을 받음).
따라서 캡슐 컴포넌트의 오버랩 이벤트 생성을 제거한다.
(2) AuraCharacterBase
C++ 코드에서도 수정한다.
AAuraCharacterBase::AAuraCharacterBase()
{
PrimaryActorTick.bCanEverTick = false;
GetCapsuleComponent()->SetCollisionResponseToChannel(ECC_Camera, ECR_Ignore);
GetCapsuleComponent()->SetGenerateOverlapEvents(false);
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
9-11. UI - (7) 줄어드는 체력 바 효과, 체력 바 숨기기 (0) | 2024.12.17 |
---|---|
9-10. UI - (6) 몬스터 체력 바 (0) | 2024.12.13 |
9-8. 투사체 - (4) 투사체 콜리전 채널 설정 (0) | 2024.12.13 |
9-7. 투사체 - (3) 적중 시 효과 재생, 몽타주에서 소리 재생 (0) | 2024.12.13 |
9-6. 투사체 - (2) 투사체 정렬(Orienting), 모션 워핑(Motion Warping) (0) | 2024.12.11 |