1. Gameplay Effect Context란?
게임플레이 이펙트 컨텍스트의 설명에는 다음과 같이 나와있다.
Data structure that stores an instigator and related data, such as positions and targets Games can subclass this structure and add game-specific information It is passed throughout effect execution so it is a great place to track transient information about an execution
-번역기 번역-
선동자와 위치 및 대상 게임과 같은 관련 데이터를 저장하는 데이터 구조. 이 구조를 하위 분류하고 게임별 정보를 추가할 수 있습니다. 효과 실행 전체에 전달되므로 실행에 대한 일시적인 정보를 추적하기에 좋은 장소입니다
주요 용도:
- 효과를 적용한 원천 추적(Source Tracking):
- 누가 효과를 적용했는지(캐릭터, AI 등)를 확인할 수 있습니다.
- FGameplayEffectContext 내부에서 Instigator와 EffectCauser를 통해 이를 추적합니다.
- 위치 및 방향 정보 저장:
- 효과가 발생한 위치(Origin)와 방향 정보(Direction)를 저장합니다.
- 이를 활용해 범위 기반 효과나 특정 지점을 타겟팅할 때 사용합니다.
- 히트 결과 전달(Hit Result):
- 공격이나 충돌과 같은 이벤트에 의해 효과가 적용된 경우 FHitResult를 포함시켜 세부 정보를 전달할 수 있습니다.
- 커스텀 데이터 저장:
- 개발자가 특정 정보를 추가로 저장해야 할 경우, 확장하여 커스텀 데이터를 포함할 수 있습니다.
2. 커스텀 게임플레이 이펙트 컨텍스트 만들기
이펙트 컨텍스트에는 기본적으로 다양한 정보를 담을 수 있지만 우리가 특별히 원하는 정보가 있을 수 있고 그러기 위해서는 커스텀 게임플레이 이펙트 컨텍스트를 만들어야 할 것이다.
헤더파일과 Cpp파일을 만들자. 비주얼 스튜디오에서 새로운 파일을 만들때는 임시 폴더에 저장이 안되게 경로를 지정 잘 지정해야 한다.
헤더파일에서 구조체를 하나 만들자.
#include "GameplayEffectTypes.h"
USTRUCT(BlueprintType)
struct FAuraGameplayEffectContext : public FGameplayEffectContext
{
GENERATED_BODY()
public:
protected:
};
해당 구조체는 언리얼에서 제공해주는 게임플레이 이펙트 컨텍스트 구조체 대신 쓰일 구조체이다.
이제 이 구조체에 몇몇 함수를 오버라이드 할 것이다.
virtual UScriptStruct* GetScriptStruct() const override
{
return FGameplayEffectContext::StaticStruct();
}
virtual bool NetSerialize(FArchive& Ar, class UPackageMap* Map, bool& bOutSuccess) override;
NetSerialize
위의 함수는 데이터를 직렬화/역 직렬화 하는데 필요한 함수이다.
매개변수:
- FArchive& Ar
- 데이터 직렬화(쓰기) 또는 역직렬화(읽기)를 처리하는 객체입니다.
- 네트워크 전송 시 데이터를 읽거나 씁니다.
- UPackageMap* Map
- 네트워크 복제를 위해 액터나 오브젝트를 매핑하는 데 사용됩니다.
- 네트워크에서 전송된 데이터와 게임 내 오브젝트를 매핑하는 데 유용합니다.
- bool& bOutSuccess
- 직렬화가 성공했는지 여부를 반환합니다.
GetScriptStruct
위의 함수는 언리얼 엔진에서 USTRUCT에 대한 메타데이터를 반환하는 함수라고 한다.
두 함수 모두 서브 클래스에서 반드시 오버라이드 해야하는 함수들이다.
해당함수는 다음에 구현하기로 하고 이제 이곳에서 우리가 필요로 하는 변수들을 선언해보자.
bool IsBlockedHit() const { return bIsBlockHit; }
bool IsCriticalHit() const { return bIsCrticalHit; }
void SetIsBlockedHit(bool bInIsBlockedHit ) { bIsBlockHit = bInIsBlockedHit; }
void SetIsCriticalHit(bool bInIsCriticalHit) { bIsCrticalHit = bInIsCriticalHit; }
protected:
UPROPERTY()
bool bIsBlockHit = false;
UPROPERTY()
bool bIsCrticalHit = false;
게터와 세터는 퍼블릭 영역에 넣는다.
진짜 마지막으로 중요한 헤더파일을 추가하자.
#include "AuraAbilityTypes.generated.h"
GENERATED_BODY() 매크로를 사용하기 위해서 해당 헤더파일을 필수적으로 가져와야 한다.
'게임프로그래밍 > 실습2' 카테고리의 다른 글
[실습2] 54. 커스텀 게임플레이 이펙트 컨텍스트 사용하기 (0) | 2024.12.07 |
---|---|
[실습2] 53. 네트워크 직렬화 (0) | 2024.12.07 |
[실습2] 51. UGameplayEffectExecutionCalculation 클래스 (0) | 2024.12.06 |
[실습2] 50. 에너미가 죽을때 디졸브 적용하기 (0) | 2024.12.06 |
[실습2] 49. Set by Coller로 데미지 설정하기 (0) | 2024.12.05 |