언리얼 에셋은 불러오기 참 불편하다...
static ConstructorHelpers::FClassFinder<UCameraShake> CS_PSYCHICFORCE(TEXT("/Game/Blueprint/CameraShake/Esper/CS_01_PsychicForce.CS_01_PsychicForce_C"));
if (CS_PSYCHICFORCE.Succeeded())
{
CS_PsychicForce = CS_PSYCHICFORCE.Class;
}
뭔가 받으려면 이름부터 길다란 네임스페이스에 여러가지 붙여야 로드가 가능하다.
로드가 실패한것도 체크안하면 터져버린다.
클라이언트 프로그래머 친구들이 저 더럽고 불결한 내용을 몇십 몇백개 적고 있는걸 보니 눈물이 나서 다음과 같은 매크로를 만들었다.
/* Object Asset을 받습니다.
* 생성자 타임에만 작동합니다.
* RETURN_POINTER : 받을 포인터
* CLASS_TYPE : 받을 오브젝트의 클래스
* PATH : 경로 (TEXT를 붙이지 않습니다.)*/
#define GetObjectAsset(RETURN_POINTER, CLASS_TYPE, PATH)\
static ConstructorHelpers::FObjectFinder<CLASS_TYPE> __##RETURN_POINTER(TEXT(PATH));\
if (__##RETURN_POINTER.Succeeded()) {\
RETURN_POINTER = __##RETURN_POINTER.Object;\
}\
else RETURN_POINTER = nullptr;\
CHECK(RETURN_POINTER)
/* Class Asset을 받습니다.
* 생성자 타임에만 작동합니다.
* RETURN_POINTER : 받을 포인터
* CLASS_TYPE : 받을 클래스 타입
* PATH : 경로 (TEXT를 붙이지 않습니다.)*/
#define GetClassAsset(RETURN_POINTER, CLASS_TYPE, PATH)\
static ConstructorHelpers::FClassFinder<CLASS_TYPE> __##RETURN_POINTER(TEXT(PATH));\
if (__##RETURN_POINTER.Succeeded()) {\
RETURN_POINTER = __##RETURN_POINTER.Class;\
}\
else RETURN_POINTER = nullptr;\
CHECK(RETURN_POINTER)
이 매크로를 쓰면 맨 위의 불결한 코드가 아래처럼 간결해진다.
GetClassAsset(CS_PsychicForce, UCameraShake, "/Game/Blueprint/CameraShake/Esper/CS_01_PsychicForce.CS_01_PsychicForce_C");
클라이언트 친구들이 좀 더 나은 삶을 살길바라며...
PS,
ConstructorHelpers::F~~Finder는 생성자에서만 쓴다는 것을 알았다.
생성자가 아닌곳에서 에셋을 받아오려면 다음과 같은 함수를 사용하니 잘 작동하더라..
case EHackedAIType::MS_AI: {
retClass = LoadClass<AMilitarySoldierAI>(NULL, TEXT("Blueprint'/Game/Blueprint/InGame/AI/BP_MilitarySoliderAI.BP_MilitarySoliderAI_C'"));
return retClass;
}
'Programming > C++ & Unreal' 카테고리의 다른 글
C++ 메모리 덤프 (0) | 2020.02.07 |
---|---|
C++ config parser (0) | 2019.05.26 |
언리얼(C++)에서 자주 사용하는 매크로 (언리얼 로그 찍기) (0) | 2019.05.09 |
언리얼 플레이어 회전값 직접 바꾸기 (0) | 2018.03.23 |
언리얼 C++에서 경로로 에셋 불러오기. (0) | 2018.03.23 |