언리얼 C++클래스 UCLASS()에서 사용하는 Blueprintable와 BlueprintType에 대해~
- Blueprintable - 해당 C++클래스을 블루프린트의 부모 클래스로 사용할 수 있게 해 주는 지정자
- BlueprintType - 해당 C++클래스을 블루프린트의 변수로 사용할 수 있게 해 주는 지정자
UCLASS(BlueprintType, Blueprintable)
class COMPOSURE_API UCompositingPostProcessPass : public UCompositingElementTransform
{
GENERATED_BODY()
...
}
NewObject로 생성한 C++ 오브젝트의 멤버 변수에 설정된 델리게이트가 무효화 되어 제대로 호출되지 않는 문제에 대해~
C++에서 NewObject<UPatcher>()와 같이 생성한 오브젝트은 NewObject의 인자로 Outer을 설정해 주지 않았기 때문에 다른 클래스의 멤버 변수로 저장된다고 해도 사용시 문제가 발생할 수 가 있다.
즉 어떤 값을 해당 오브젝트에 설정해 준다고 해도 엔진 시스템에 의해 무효화 되어 오류가 발생한다.
아래와 같이 모듈에서 생성된 Patcher오브젝트은 Outer을 설정해 주지 않았기 때문에 다른 곳에서 해당 오브젝트을 참조하여 사용시 문제가 발생할 수 있다. 예를 들어 해당 오브젝트의 델리게이트 멤버 변수에 외부의 델리게이트을 설정하여 일정 시간후에 호출하려고 할 때 해당 델리게이트은 원본 델리게이트의 인스턴싱을 잃게 된다. 왜냐하면 해당 오브젝트 자체가 Outer을 설정해 주지 않았기 때문에 엔진 시스템은 해당 오브젝트의 멤버 변수들에 설정된 값들의 메모리을 무효화 시키기 때문이다.
아래 함수은 블루프린트에서 호출되어 두번째 인자로 블루프린트의 이벤트가 입력되어 실행된다. 하지만 저 함수에서 _OnRequestContentBuildIdFromServerCallback라는 멤버 변수에 설정되는 델리게이트은 저 함수가 종료된 후에는 유효성을 잃게 된다.
void UPatcher::RequestContentBuildIdFromServer(FString Url, const FRequestContentBuildIdDelegate& Callback)
{
_OnRequestContentBuildIdFromServerCallback = Callback;
HttpRequest(Url, "get");
}
따라서 아래의 코드에서 _OnRequestContentBuildIdFromServerCallback은 실행되지 않는다. 왜냐하면 UPatcher오브젝트 자체가 NewObject로 생성시 Outer가 설정되지 않았기 때문에 RequestContentBuildIdFromServer()함수가 종료되면서 _OnRequestContentBuildIdFromServerCallback에 설정된 델리게이트은 엔진 시스템(가비지 컬렉션?)에 의해 무효화 되기 때문이다. 즉 임시 변수같은 취급을 받는 거라 생각된다.
void UPatcher::OnHttpRequestComplete(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)
{
if (true == Response.IsValid())
{
_OnRequestContentBuildIdFromServerCallback.ExecuteIfBound(Response->GetContentAsString(), Response->GetResponseCode());
}
}
NewObject로 생성한 오브젝트의 멤버 변수들이 무효화 되는 것 막는 방법
NewObject<>()함수로 오브젝트 생성시 Outer을 설정해 주거나 AddToRoot()함수을 호출해 주어야 한다.
void FPatcherModule::StartupModule()
{
_Patcher = NewObject<UPatcher>();
_Patcher->AddToRoot();
}
'개발일지' 카테고리의 다른 글
2022/12/19 개발 일지 (0) | 2022.12.19 |
---|---|
2022/12/07 개발 일지 (0) | 2022.12.07 |
2022/12/06 개발 일지 (0) | 2022.12.06 |
2022/12/02 개발 일지 (0) | 2022.12.02 |
2022/11/25 개발 일지 (0) | 2022.11.25 |