본 편을 읽기 전에 게임공격판정방법을 읽고 오는 것을 추천합니다.
Gameplay Effect는 캐릭터의 속성에 변화를 주는 설정입니다.
GE는 즉시 적용되는 Instant 효과, 일정 시간 동안 유지되는 Duration 효과, 무한히 지속되는 Infinite 효과로 나눌 수 있습니다.
GE는 수치적 변화(예: 체력 회복, 데미지 증가)와 상태 변화(예: 스턴, 슬로우) 등을 포함합니다.
적용된 캐릭터의 GameplayTags를 변경시킬 수 있습니다(후에 디버프,스턴 등 태그를 사용하여 구현할 때 유용함)
->게임에서 공격 충돌데메지,체력회복,스킬 쿨타임등 다양한 부분에서 효과적으로 사용할 수 있으며 직접 구현하는 것보다 효율적이고 안전적으로 구현할 수 있습니다.
-> GamePlayEffect는 AttributeSet,GameplayAbility,GameplayCue,AbilitySystemComponent와 상호작용을 하는 중요한 것이라는 것을 알 수 있습니다.
- GE는 지속시간에 대해서 Instant, Duration, Infinite 까지 총 3가지 타입을 사용하는데 우리는 즉시 데미지를 입히므로 instant를 사용합니다.
- 상대의 체력을 감소시켜야하므로 모디파이어를 추가해주고 Health Attribute를 선택해준 뒤 Add를 통해 이펙트가 적용될 때 상대의 체력이 감소할 수 있도록 설정해줍니다.
->이로써 기본적인 이펙트 설정을 완료했습니다.
void UEnableCollisionNotifyState::MakeLineTrace(AActor* Owner)
{
...라인트레이스를 통해 hitresult를 찾는 코드
...hit된 캐릭터의 AbilitySystemComponent를 찾는 코드
// 게임 이펙트 적용하기
if (AttackDamageEffect)
{
FGameplayEffectContextHandle EffectContext = ASC->MakeEffectContext();
EffectContext.AddSourceObject(Owner);
FGameplayEffectSpecHandle SpecHandle = ASC->MakeOutgoingSpec(AttackDamageEffect, 1.0f, EffectContext);
if (SpecHandle.IsValid())
{
FActiveGameplayEffectHandle ActiveGEHandle = ASC->ApplyGameplayEffectSpecToTarget(*SpecHandle.Data.Get(), ASC);
}
}
}
FGameplayEffectContextHandle EffectContext = ASC->MakeEffectContext();
EffectContext는 GameplayEffect의 Context 객체입니다. 여기서는 ASC (Ability System Component)를 사용하여 새로운 효과 Context를 생성합니다. EffectContext는 효과가 어디에서 유래되었는지, 어떤 객체가 연관되어 있는지를 포함할 수 있습니다.
EffectContext.AddSourceObject(Owner);:
EffectContext에 Owner를 추가합니다. Owner는 효과의 소유자입니다. 이 정보를 통해 GameplayEffect가 누가 시전했는지를 알 수 있습니다.
FGameplayEffectSpecHandle SpecHandle = ASC->MakeOutgoingSpec(AttackDamageEffect, 1.0f, EffectContext);:
SpecHandle는 GameplayEffet의 Spec을 나타내는 객체입니다. ASC를 사용하여 AttackDamageEffect에 대한 새로운 Spec을 생성합니다.
->최종적으로 체력이 줄어드는 것을 확인해볼 수 있었다.