midas+son의 크리에이티브(creative) 이야기

이건 지난 글에서 이어가는 것일 수도 있다.

왜냐면 지난 글에서는 Actor계열 BluePrint를 C++에서 SpawnActor할 때의 문제가 생겼을 때의 경우지만

이 글은 C++에서 UObject계열의 BP를 참조하는 방법에 대한 글이기 때문이다.


마찬가지로 4.15로 리팩토링 한 뒤부터 StaticLoadObject가 잘 안먹혔다.

그래서 수정 중 Actor계열은 처리 했지만 UObject계열 중 UMaterialInterface을 Load하는 것에는 실패 했다.

UObject계열은 _C를 붙인다고 해서 되지 않는다.


그래서 찾은 방법이 미리 만들어 두는 방법이다.

CDO가 생성될 때 설정하는 방법은 아래와 같다.

.h파일

UPROPERTY()

UMaterialInterface* mOpaque = nullptr;

.cpp파일

클래스이름::클래스이름()    //생성자

{

static ConstructorHelpers::FObjectFinder<UMaterialInterface> mInterfaceOpaque(TEXT("Material'/Game/Member/Member_Opaque.Member_Opaque'"));

mOpaque = mInterfaceOpaque.Object;

}

꼭 생성자에서 해야 한다.

위와 같이 해놓으면 빌드 후 exe실행으로 테스트 해도 변수에 제대로 값이 들어가 있다.


참고 페이지 : https://docs.unrealengine.com/latest/KOR/Programming/Assets/ReferencingAssets/index.html

한글로는 (생성 시간 레퍼런싱), 영어로는 (Construction Time Reference) 부분을 참고하자.

4.12.5버전을 사용할 때에는

아래처럼 블루프린트 경로를 설정하여 사용하였었는데

FName Path = TEXT("Blueprint'/Game/Actor/My_BP.My_BP'"); //My_BP.My_BP_C였던거 같은데...4.15에서는 _C붙이면 NULL이 됨.

UBlueprint* GeneratedBP = Cast<UBlueprint>(StaticLoadObject(UBlueprint::StaticClass(), NULL, *Path.ToString()));

GetWorld()->SpawnActor<AMyActor>(GeneratedBP->GeneratedClass, location, FRotator::ZeroRotator);

4.15버전에서는 에디터에서만 되고

실행 모드나 빌드 후 exe로 게임을 실행하면 Error가 발생한다.


그래서 여러 방도를 찾다가 아래와 같이 UClass를 찾으면 된다는 걸 알아냈다.

FName Path = TEXT("Class'/Game/Actor/My_BP.My_BP_C'"); //_C 꼭 붙여야 한다.

UClass* GeneratedBP = Cast<UClass>(StaticLoadObject(UClass::StaticClass(), NULL, *Path.ToString()));

GetWorld()->SpawnActor<AMyActor>(GeneratedBP, location, FRotator::ZeroRotator);

전 버전에서도 _C붙이는 것과 안붙이는 차이가 있었긴 한데

4.15 이상으로 오면서 BP Class와 BP 레퍼런스를 받아오는 게 명확히 나뉜거 같다.

새삼 우리나라 인터넷이 빠르다는 걸 실감합니다.


어제까지 3박 5일 동안 푸켓 내에서는

카톡으로 사진 하나 올리고 받는 것도 쩔쩔맸는데

우리나라 들어오고 나서 데이터 켜자마자

몇 십장의 사진 데이터가 순식간에 끝납니다.


평소엔 멋모르고 막 썼는데

이제는 우리나라 발전에 고마움을 느낍니다.