언리얼엔진5 GAS - 기본 공격 Gameplay Effect 적용

조창근·2024년 7월 30일
0

언리얼엔진5 GAS

목록 보기
7/8

본 편을 읽기 전에 게임공격판정방법을 읽고 오는 것을 추천합니다.

Gameplay Effect 적용하기

1. Gameplay Effect란?

  1. Gameplay Effect는 캐릭터의 속성에 변화를 주는 설정입니다.

  2. GE는 즉시 적용되는 Instant 효과, 일정 시간 동안 유지되는 Duration 효과, 무한히 지속되는 Infinite 효과로 나눌 수 있습니다.

  3. GE는 수치적 변화(예: 체력 회복, 데미지 증가)와 상태 변화(예: 스턴, 슬로우) 등을 포함합니다.

  4. 적용된 캐릭터의 GameplayTags를 변경시킬 수 있습니다(후에 디버프,스턴 등 태그를 사용하여 구현할 때 유용함)

->게임에서 공격 충돌데메지,체력회복,스킬 쿨타임등 다양한 부분에서 효과적으로 사용할 수 있으며 직접 구현하는 것보다 효율적이고 안전적으로 구현할 수 있습니다.
-> GamePlayEffect는 AttributeSet,GameplayAbility,GameplayCue,AbilitySystemComponent와 상호작용을 하는 중요한 것이라는 것을 알 수 있습니다.

2. Gameplay Effect 생성하기

  1. GameplayEffect를 상속받아 GE_Damage블루프린트를 생성해줍니다.
  1. GE_Damage 요소들을 구성해줍니다.
    1. GE는 지속시간에 대해서 Instant, Duration, Infinite 까지 총 3가지 타입을 사용하는데 우리는 즉시 데미지를 입히므로 instant를 사용합니다.
    2. 상대의 체력을 감소시켜야하므로 모디파이어를 추가해주고 Health Attribute를 선택해준 뒤 Add를 통해 이펙트가 적용될 때 상대의 체력이 감소할 수 있도록 설정해줍니다.

->이로써 기본적인 이펙트 설정을 완료했습니다.

3.C++에서 Gameplay Effect 적용하기

  
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);
           }   
        }
                                
 }
  1. FGameplayEffectContextHandle EffectContext = ASC->MakeEffectContext();
    EffectContext는 GameplayEffect의 Context 객체입니다. 여기서는 ASC (Ability System Component)를 사용하여 새로운 효과 Context를 생성합니다. EffectContext는 효과가 어디에서 유래되었는지, 어떤 객체가 연관되어 있는지를 포함할 수 있습니다.

  2. EffectContext.AddSourceObject(Owner);:
    EffectContext에 Owner를 추가합니다. Owner는 효과의 소유자입니다. 이 정보를 통해 GameplayEffect가 누가 시전했는지를 알 수 있습니다.

  3. FGameplayEffectSpecHandle SpecHandle = ASC->MakeOutgoingSpec(AttackDamageEffect, 1.0f, EffectContext);:
    SpecHandle는 GameplayEffet의 Spec을 나타내는 객체입니다. ASC를 사용하여 AttackDamageEffect에 대한 새로운 Spec을 생성합니다.

  1. FActiveGameplayEffectHandle ActiveGEHandle = ASC->ApplyGameplayEffectSpecToTarget(*SpecHandle.Data.Get(), ASC);:
    SpecHandle에서 실제 스펙 데이터를 가져와 타겟에 효과를 적용합니다. ASC는 타겟의 Ability System Component를 나타내며, 이 타겟에게 공격 데미지 효과를 적용합니다. 이로 인해 타겟은 위에서 정의한 공격 데미지 효과를 받게 됩니다.

4. 게임에 적용된 최종 결과 확인하기

  1. 이펙트 적용 전
  1. 이펙트 적용 후

->최종적으로 체력이 줄어드는 것을 확인해볼 수 있었다.

5. 요약 정리

  1. GameplayEffect는 캐릭터의 스탯,능력등을 관리하는 중요한 요소이다.
  2. FGameplayEffectSpecHandle을 통해 GameplayEffect를 적용하고 관리한다는 것을 알 수 있습니다.
  3. GameplayEffect는 AttributeSet,GameplayAbility,GameplayCue,AbilitySystemComponent와 모두 상호작용하므로 유용하게 사용할 수 있습니다.

0개의 댓글