로그다.
지난 글에서도 잠깐 설명한 적 있지만 로그라고 생각하면 편하다.
GE가 적용될 때 Ability로 적용한 건지, 그렇다면 Ability를 사용한 건 누구인지, 어떤 Ability인지 등등을 확인할 수 있다.
단, Ability 발동 순간에 직접 생성 및 값을 할당해줘야 한다.
Context 내부에 선언되어있는 Instigator와 EffectCauser는 각각 OwnerActor, AvatarAcotr로 이미 할당되어있으나, Ability, Actors, HitResult 등은 직접 할당해줘야 한다.
그런데 일반적인 로그와 다른 점은 '런타임에 뭔가 반영하기 위해' 사용하는 로그다.
로그는 본래 디버깅 용도이며, 의도대로 프로그램이 굴러갔는지 확인하기 위해 사용한다.
하지만 Context는 앞서 말했던 정보들을 가져와 로직을 구현하기 위해 사용한다.
또한 Ability 시작 이후 그로 인해 발생하는 모든 GE에 대해 동일한 Context가 연결된다.
커스텀해서 사용할 수도 있다.
Source가 Target에게 데미지를 주는 상황이라고 가정하자.
이때 데미지가 크리티컬 히트였는지를 Exec 외부, AttributeSet이나 UI에서도 알고 싶다면 Context를 커스텀해서 정보를 전달하는 방식이 적합하다.
먼저, FGameplayEffectContext
를 상속한 커스텀 Context 클래스를 만든다.
여기에 bIsCriticalHit
같은 변수를 선언한다.
ExecCalculation 클래스에서 데미지를 계산할 때
EffectSpec.GetContext()
를 통해 커스텀 Context로 캐스팅한 뒤
계산 결과에 따라 bIsCriticalHit = true
등을 설정한다.
이후, AttributeSet의 PostGameplayEffectExecute()
함수에서
EffectSpec.GetContext()
를 다시 가져와 크리티컬 여부를 확인할 수 있다.
이렇게 하면 Exec 내부의 계산 결과를 다른 시스템(애니메이션, UI 등)과 공유할 수 있다.
물론 이렇게 한다고 바로 쓸 수 있는 건 아니고, NetSerialize 재정의, Getter Setter 정의 등의 과정이 필요하다.