언리얼 엔진 - 게임 프로젝트/GAS 프레임워크 RPG 프로젝트

GameplayEffect - 1) GameplayEffect란?

monstro 2025. 7. 13. 16:48
728x90
반응형

- 개요

본격적으로 GameplayEffect를 프로젝트에 사용한다

GameplayEffectAttrbuteSet의 Attribute에 영향을 주기 위해 사용하며

GameplayTag를 사용하여 설계자가 원하는 시점에서 사용하도록 제어할 수 있다

 

- GameplayEffect에 대한 정리

GameplayEffect에 대해 정리하면 다음과 같이 나타낼 수 있다

  • Data Only 방식으로 동작하여 로직이 아닌 데이터(값)을 설정하여 정의한다
  • UGameplayEffect 클래스에서 상속되지만, C++ 클래스가 아닌 블루 프린트로 정의하여 사용한다
  • ModifierExecutions의 2가지 방식을 사용하여 Attribute를 수정한다

 

1) GameplayEffect의 적용 방식 - Modifier

GE에서 사용하는 Modifier의 옵션은 다음의 4가지로 구분하여 사용한다

각각의 역할은 다음과 같다

  • Add : Attribute의 값에 설정한 값을 더한다
  • Multiply : Attribute의 값에 설정한 값을 곱한다
  • Divide : Attribute의 값에 설정한 값을 나눈다
  • Override : Attribute의 값에 설정한 값을 덮어씌운다

 

Modifier를 통해 적용하는 값의 크기를 설정하기 위해서는 Magnitude Caculation Type을 설정해야 한다

다음의 4가지로 구분되어 있으며, 각각의 역할은 다음과 같다

  • Scalable Float : 설정한 실수 값만큼의 크기를 설정
  • Attrbute Based : Attribute의 값을 기반으로 크기를 설정
  • Custom Calculation Class : GameplayModMagnitudeCalculation 클래스를 통해 크기를 설정
  • Set By Caller : 설정한 GameplayTag가 활성화되면 크기를 설정

 

2) GameplayEffect의 적용 방식 - Executions

ModifierGameplayEffect의 블루 프린트에서 설정할 수 있는 옵션들을 통해 GE를 사용하지만,

ExecutionsGameplayEffectExecutionCalculation 클래스를 통해 GE를 사용한다

Modifier 방식과 다르게 로직을 직접 구성해야 하지만,

사용자가 원하는 방식으로 동작시킬 수 있는 자율성을 보장한다

 

3) GameplayEffect의 적용 주기

GameplayEffect에는 Duration Policy가 존재하고 이를 통해 GE가 적용되는 주기를 설정할 수 있다

총 3개로 구성되어 있으며 각각 다음과 같다

  • Instant : 일시적으로 적용되는 GameplayEffect
  • Has Duration : 설정한 주기만큼만 적용되는 GameplayEffect
  • Infinite : 영구히 적용되는 GameplayEffect

 

- GameplayEffectSpec과 GameplayEffectContext

GameplayEffectC++에서 편하게 사용할 수 있도록 돕는 래퍼 클래스가 존재한다

GameplayEffectSpec해당 래퍼 클래스로서, GameplayEffect를 그대로 사용하기보다

한번 래핑하여 Spec의 형태로 사용하는 것을 권장한다

 

1) GameplayEffectSpec

GameplayEffectSpec런타임에서 생성되는 GameplayEffect의 인스턴스로서

GameplayEffectSpec을 통해 실제 GameplayEffect의 적용이 이뤄진다

또한 런타임에서 수정이 가능한 이점이 존재한다

 

2) GameplayEffectContext

GameplayEffectContextGameplayEffectSpec에 관련한 정보를 저장한다

대표적으로 GESpec의 Instigator나 GESpec의 Target과 같은 정보가 해당된다

따라서 GameplayEffectSpec을 생성하기 위해서는 GameplayEffectContext를 인자로 넘겨줘야 한다

 

 

 

위와 같이 GameplayEffect에 대해 간단하게 정리해보았다

이제 이를 바탕으로 기존의 EffectActor를 수정하여 GameplayEffect를 적용할 수 있도록 수정한다

 

- AuraEffectActor 클래스 : GameplayEffect의 적용

 

1개의 함수2개의 프로퍼티를 추가하였다

ApplyEffectToTarget 함수를 통해 프로퍼티로 갖고 있는 GameplayEffect를 대상에 적용한다

 

2개의 프로퍼티는 각각 다음과 같다

  • InstantGameplayEffectClass : 일시적인 GESpec을 생성하기 위한 클래스
  • ActorLevel : GESpec을 만들기 위해 필요한 실수값

 

 

ApplyEffectToTarget 함수는 위와 같이 구성하였다

우선, GE의 Target으로부터 ASC를 가져온다

이후의 로직은 다음과 같다

  • 인자로 넣어준 GE가 유효한지 확인
  • 빨간색 : GESpec의 정보를 저장할 GEContext의 핸들을 생성
  • 파란색 : 생성한 GEContext의 핸들필요한 인자를 넘겨주어 GESpec의 핸들을 생성
  • 초록색 : GESpec의 핸들로부터 GESpec의 정보를 가져오고 정보를 바탕으로 Target에게 GE를 적용
728x90
반응형