게임플레이 어트리뷰트 및 게임플레이 이펙트

Gameplay Ability System 안의 Attribute 및 Effect 에 대한 개요입니다.

Windows
MacOS
Linux

Gameplay Ability System (게임플레이 어빌리티 시스템)과 상호작용하는 액터에는 보통 숫자 프로퍼티 세트가 있어야 이를 시스템에서 액세스 및 수정하여 게임플레이 로직에 영향을 주고 게임에서 벌어진 일을 추적할 수 있습니다. 이 프로퍼티를 일컬어 Gameplay Attribute (게임플레이 어트리뷰트, 줄여서 어트리뷰트)라 하며, Gameplay Effect (게임플레이 이펙트)에 의해 (임시 또는 영원히) 수정됩니다.

UE4 프로젝트에서의 구성 방식은 ARPG 의 어트리뷰트와 이펙트 문서를 참고하세요.

게임플레이 어트리뷰트

Gameplay Attribute (게임플레이 어트리뷰트)에는 부동소수점 값 하나로 규정할 수 있는 액터의 현재 상태에 대한 측정치를 몇 개든 포함할 수 있습니다. 예로 생명력, 힘, 이동 속도, 마법 저항력 등입니다. 어트리뷰트는 Attribute Sets (어트리뷰트 세트) 안에 FGameplayAttribute 유형 UProperties 로 선언합니다. 이 세트는 어트리뷰트를 포함하면서 그에 대한 수정 시도를 감독하기도 합니다.

어트리뷰트와 어트리뷰트 세트는 네이티브 코드로 생성해야 하며, 블루프린트로는 생성할 수 없습니다.

어트리뷰트 세트 생성

어트리뷰트 세트를 생성하려면, UAttributeSet 를 생성하고 Gameplay Attribute Data (게임플레이 어트리뷰트 데이터) 멤버를 추가하여 UPROPERTY 태그를 붙입니다. 예를 들어 "health" 어트리뷰트만 들어있는 어트리뷰트 세트는 다음과 같습니다.

UCLASS()
class USimpleAttributeSet : public UAttributeSet
{
    GENERATED_BODY()
public:
    /** 기본값을 설정합니다. 예를 들어, Health 는 양수로 설정해야 합니다. */
    USimpleAttributeSet();
    /** 죽기 전까지 흡수할 수 있는 대미지 양을 측정합니다. */
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Attributes")
    FGameplayAttributeData Health;
};

최소 어트리뷰트 세트로, 어트리뷰트가 단 하나입니다.

어트리뷰트 세트를 만들었으면, Ability System Component (어빌리티 시스템 컴포넌트)로 등록해야 합니다. 그러기 위해서는 어트리뷰트 세트를 어빌리티 시스템 컴포넌트의 오너 액터의 서브오브젝트로 추가하거나, 어빌리티 시스템 컴포넌트의 GetOrCreateAttributeSubobject 함수에 전달해야 합니다.

게임플레이 이펙트

Gameplay Effect (게임플레이 이펙트)는 게임플레이 어빌리티 시스템에서 어트리뷰트를 변경하기 위한 방편입니다. 여기에는 다음이 포함됩니다.

  • 어트리뷰트의 기본 값에 대한 직접 변경으로, 피해를 받은 액터에서 생명력을 줄이는 것입니다.

  • 임시 변경(보통 "버프" 또는 "디버프"라는 것)으로, 몇 초 동안 이동 속도를 증폭하는 것입니다.

  • 시간에 따라 적용되는 지속 변화로, 일정 기간 동안 (또는 항상) 초당 마나를 얼마씩 재생하는 것입니다.

게임플레이 이펙트는 (베이스 클래스가 UGameplayEffect 인) 데이터 전용 블루프린트로 구현하여 어빌리티 시스템 컴포넌트와 상호작용하고 적합한 경우 시전 도중 저장할 수 있습니다.

주요 프로퍼티

게임플레이 이펙트는 게임플레이 어빌리티 시스템의 다른 대부분과 달리 보통 UGameplayEffect 베이스 클래스를 네이티브로도 블루프린트 코드로도 오버라이드하지 않습니다. 대신 게임플레이 이펙트는 순전히 변수를 통해 설정하도록 설계되었습니다. 다음은 조정할 수 있는 게임플레이 이펙트의 주요 프로퍼티 중 일부입니다.

  • Duration: 기간 - 게임플레이 이펙트 적용 기간은 즉시 (공격받을 때의 생명력 감소), 또는 제한된 시간 동안 (몇 초 동안 지속되는 이동 속도 버프), 또는 무한 (시간에 따라 자연 재생되는 캐릭터의 마나) 등입니다. 추가로 기간이 즉시가 아닌 이펙트는 간격을 다르게 해서 적용할 수도 있습니다. 게임플레이 측면에서 이펙트의 작동 방식 변경뿐 아니라, 오디오 또는 비주얼 이펙트 반복같은 타이밍 구성에도 좋습니다.

  • Modifiers and Executions: 모디파이어 및 엑시큐션 - 모디파이어는 게임플레이 이펙트가 어트리뷰트와 작용하는 방식을 결정합니다. 여기에는 "방어도 5 프로 상승"과 같은 어트리뷰트 자체에 대한 수학 연산은 물론, 이펙트 실행에 필수인 게임플레이 태그도 포함됩니다. 게임플레이 이펙트에 모디파이어가 지원하는 것 이상의 무언가가 필요할 때는 엑시큐션이 좋을 수 있습니다. 엑시큐션은 UGameplayEffectExecutionCalculation 를 사용하여 실행 시 게임플레이 이펙트가 가질 커스텀 작동방식을 정의합니다. 모디파이어로는 제대로 다룰 수 없는 복잡한 방정식을 정의할 때 특히 좋습니다.

  • Application Requirements: 적용 요건 - 여기에 포함된 게임플레이 태그 세트가 있어야 (또는 없어야) 게임플레이 이펙트를 적용하도록 또는 무작위로 게임플레이 이펙트를 적용하지 않도록 할 수 있습니다. 이러한 요건이 게임의 요구에 충족되지 않으면, UGameplayEffectCustomApplicationRequirement 베이스 클래스에서 데이터 오브젝트를 파생한 뒤, 거기에 복잡한 적용 규칙을 임의로 정의하는 네이티브 코드를 작성할 수 있습니다.

  • Granted Abilities: 부여된 어빌리티 - 게임플레이 이펙트는 적용되면 게임플레이 태그뿐 아니라 어빌리티도 부여할 수 있습니다. 엑시큐션과 함께 사용하면, 매우 구체적인 게임플레이 조합을 구성할 수 있습니다. 예를 들어 화염 테마의 게임플레이 이펙트에 액터가 맞았는데, 그 액터가 기름에 젖었음을 나타내는 게임플레이 태그 또는 어트리뷰트가 있는 상태였다면, "On Fire" (소각) 어빌리티가 생기면서 다음 10 초 동안 주변 액터에게 수동 피해를 입히고 파티클 및 다이내믹 라이트로 된 비주얼 이펙트가 생기는 식입니다.

  • Stacking: 스태킹 - 이미 어떤 버프 또는 디버프(, 이 경우 게임플레이 이펙트)를 가진 대상에게 다시 적용하는 것은 물론 어떤 상황을 처리하는 정책을 말합니다. 그 상황 중에는 Overflow (오버플로우)라는 것이 있는데, 원래 대상에 있던 게임플레이 이펙트가 포화 상태에 달하면 새로운 게임플레이 이펙트가 생기는 것을 말합니다 (예를 들어 중독 게이지가 쌓이다가 오버플로우가 되었을 때만 독 지속 피해를 입히는 경우입니다). 시스템에서 지원하는 스태킹 방식은 여러가지 다양합니다. 중첩될 때마다 지속 기간을 갱신하면서 "스택 수"를 유지하다 최대치를 넘으면 어떤 일정 기간 이펙트의 지속 기간이 리셋 또는 추가되도록 하거나, 그냥 이펙트의 여러 인스턴스에 개별 타이머를 독립적으로 적용할 수도 있습니다.

  • Gameplay Cue Display: 게임플레이 큐 디스플레이 - Gameplay Cues (게임플레이 큐)는 파티클이나 사운드같은 장식성 이펙트를 관리하는 네트워크 효율을 위한 방식이며, 게임플레이 어빌리티 시스템으로 제어할 수 있습니다. 게임플레이 어빌리티와 게임플레이 이펙트로 발동시킬 수 있으며, 주로 On Active (시전 시), While Active (시전 도중), Removed (제거 시), Executed (실행 시, 게임플레이 이펙트 전용)과 같은 네 가지 방식으로 작동하지만 네이티브 또는 블루프린트 코드에서 오버라이드 가능합니다. 모든 게임플레이 큐에는 "GameplayCue"로 시작하는 게임플레이 태그를 붙여야 합니다. 예: "GameplayCue.ElectricalSparks", "GameplayCue.WaterSplash.Big".

    Gameplay Cue Manager (게임플레이 큐 매니저)는 게임플레이 큐를 실행합니다. IGameplayCueInterface 를 구현하고 게임플레이 큐의 태그와 같은 이름으로 된 함수가 있는 액터는 게임플레이 큐에 반응할 수 있습니다. 독립형 Gameplay Cue Notify 블루프린트 역시 게임플레이 큐에 반응할 수 있습니다.

이펙트 및 어트리뷰트 상호작용 프로그래밍

게임플레이 이펙트가 어트리뷰트를 수정 시도하면 어트리뷰트가 반응하는 방식을 처리하기 위해 어트리뷰트 세트가 오버라이드할 수 있는 함수가 많습니다. 예를 들어 USimpleAttributeSet 샘플의 "Health" 어트리뷰트는 부동소수점을 저장할 수 있고, 게임플레이 어빌리티 시스템에서 그 값에 액세스하여 변경할 수 있지만, 생명력이 0 이 되어도 아무런 일도 발생하지 않고, 0 미만으로 떨어지는 것을 막을 수도 없습니다. "Health" 어트리뷰트가 원하는 대로 작동하도록 하려면, 어트리뷰트 세트 자체에서 자신의 어트리뷰트에 대한 수정 시도를 처리하는 여러 가상 함수를 오버라이드하면 됩니다. 어트리뷰트 세트가 흔히 오버라이드하는 함수는 다음과 같습니다.

함수 이름

목적

PreAttributeChange / PreAttributeBaseChange

어트리뷰트에 대한 수정 직전 호출되는 함수입니다. 어트리뷰트의 값에 대한 규칙을 적용하기 위한 것이며, 예로 "Health 값은 0 과 MaxHealth 사이여야 한다"거나, 어트리뷰트 변화에 게임내 반응을 발동하지 않는다던가 식입니다.

PreGameplayEffectExecute

어트리뷰트의 값 수정 직전, 이 함수가 제안된 수정을 거부하거나 변경할 수 있습니다.

PostGameplayEffectExecute

어트리뷰트의 값 수정 직후, 이 함수가 변화에 반응할 수 있습니다. 보통 어트리뷰트 최종 값에 대한 클램핑(범위 제한)이나 새 값에 대한 게임내 반응, 즉 "Health" 어트리뷰트가 0 으로 떨어지면 사망 효과 발동 등이 포함됩니다.

새로운 언리얼 엔진 4 문서 사이트에 오신 것을 환영합니다!

문서 사이트에 대한 의견을 모을 수 있는 피드백 시스템을 포함해서 여러가지 새로운 기능을 준비하고 있습니다. 아래 Documentation Feedback 포럼(영문) 또는 언리얼 엔진 네이버 공식 카페(한글) 중 편하신 곳에 의견이나 문제점을 알려 주세요.

새 시스템이 준비되면 알려 드리겠습니다.

네이버 카페
공식 포럼