Combat Interface Problem
개요
능력 부여 및 시작 시 효과(Gameplay Effect) 적용 로직에서, 효과 컨텍스트(Effect Context)의 소스 객체(Source Object)가 제대로 설정되지 않아, MMC(Modifier Magnitude Calculation) 코드 내에서 전투 인터페이스(ICombatInterface)를 찾지 못하는 문제가 발생했습니다.
기존 코드
이 코드의 MakeEffectContext()는 소스 정보를 제대로 설정하지 못하여, MMC 코드에서 다음과 같은 부분에서 문제가 발생했습니다.
ICombatInterface* CombatInterface = Cast<ICombatInterface>(Spec.GetContext().GetSourceObject());
Spec.GetContext().GetSourceObject()가 ICombatInterface를 구현하는 객체를 반환하지 못했기 때문에 CombatInterface는 nullptr이 되었고, 이후 로직에서 오류를 야기했습니다.
문제 원인 분석
시작 시 효과(Gameplay Effect)를 초기화하는 주체는 데이터 에셋(Data Asset)입니다. 이 데이터 에셋의 외부 객체(Outer)는 캐릭터의 경우 플레이어 스테이트(Player State)이고, 적의 경우 캐릭터입니다. 기존에는 GetOuter()를 사용하여 소스 객체를 가져오려고 시도했지만, 이러한 차이 때문에 일관성 있는 소스 객체 설정이 불가능했습니다. 즉, GetOuter()는 상황에 따라 다른 객체를 반환하므로, 항상 ICombatInterface를 구현하는 객체를 보장할 수 없었습니다.
해결 방안
효과 컨텍스트의 소스 객체를 설정하는 방식을 변경하여, 항상 올바른 객체를 참조하도록 수정했습니다. ASC(Ability System Component)의 GetAvatarActor() 함수를 사용하여 효과를 적용하는 대상 캐릭터를 직접 가져오도록 했습니다.
수정된 코드는 다음과 같습니다.
GetAvatarActor()는 효과가 적용되는 대상 액터, 즉 ICombatInterface를 구현하는 캐릭터를 반환합니다. 이렇게 수정함으로써, MMC 코드에서 항상 유효한 ICombatInterface 포인터를 얻을 수 있게 되었습니다.
결론
GetOuter()의 사용으로 인해 발생했던 효과 컨텍스트의 소스 객체 불일치 문제를 GetAvatarActor()를 사용하여 해결했습니다. 이를 통해 MMC 코드에서 ICombatInterface를 정상적으로 획득할 수 있게 되었고, 관련 로직이 정상적으로 작동하게 되었습니다. 이 수정은 캐릭터의 종류(플레이어, 적)에 관계없이 일관된 방식으로 효과 컨텍스트를 설정할 수 있도록 합니다.