
게임을 제작하는 과정에서 객체를 초기화할 때, 프로젝트에 포함된 다른 블루프린트 클래스나 에셋, 리소스를 가져와야 하는 경우가 종종 생긴다
블루프린트의 이벤트 그래프에서 작업하는 경우라면 블루프린트 노드의 드롭다운 메뉴를 통해서 선택하거나 콘텐츠 브라우저를 통해서 리소스나 블루프린트 클래스 등을 곧바로 선택할 수 있을 것이다
하지만 C++ 클래스에서는 직접 경로를 지정해서 블루프린트 클래스나 에셋을 불러오는 코드를 작성해야 한다
C++ 클래스의 생성자에서 프로젝트에 포함된 블루프린트 클래스나 에셋을 가져오기 위해서는 ConstructorHelpers라는 클래스를 사용해야 한다.
이 ConstructorHelpers 클래스는 생성자에서 클래스를 초기화하는데 도움을 주는 클래스로, 콘텐츠 브라우저의 리소스나 블루프린트 클래스를 불러오는 작업을 도와주는 기능을 가지고 있다
[ConstructorHelpers 클래스는 생성자함수 이외의 장소에서 이 클래스를 사용하려고 시도하면 컴파일 에러가 발생한다]
우선 C++ 클래스의 생성자에서 블루프린트 클래스를 가져오는 방법부터 알아보자
빈 프로젝트에 C++ 타입으로 설정하고 StarterContent를 체크한 후 생성한다
테스트를 위해서 [Tools > New C++ Class]를 선택하고,
Pawn 클래스를 상속받는 BP_TestClass 블루프린트 클래스와, 블루프린트 클래스와 리소스를 불러오는 코드를 작성할 MyActor C++ 클래스를 하나 생성한다
그리고 MyActor 소스 파일의 생성자로 이동한다
프로젝트에 포함된 블루프린트 클래스를 불러오기 위해서는 이렇게 ConstructorHelpers의 FClassFinder를 사용하면 된다
그리고 꺽쇠 괄호< > 안에 이 블루프린트 클래스의 타입을 넣어준다 (APawn)
[블루프린트 클래스 자체는 코드 상에서 자신의 클래스를 표현할 만한 것이 없기 때문에 이 블루프린트 클래스가 상속받는 C++ 클래스의 타입을 넣어주면 된다]
BpClass라는 이름으로 클래스를 저장하고, 마지막으로 블루프린트 클래스의 경로를 넣어주면 되는데 이 경로의 기준은 콘텐츠 브라우저 패널에서 봤을 때, 이 콘텐츠 폴더가 "/Game/" 이기 때문에 "/Game/StarterContent/BP_TestClass"를 넣어주면 된다
다만 경로를 직접 적어서 불러오면 오타, 변경된 경로, 또는 파일명으로 인해서 클래스가 제대로 불러와지지 않는 경우가 발생할 수 있기 때문에, Succeeded 함수와 Class의 NULL 체크를 통해서 블루프린트 클래스가 성공적으로 불러와졌는지 체크하고 사용해야 한다
FClassFinder가 성공적으로 블루프린트 클래스를 불러온 경우라면 FClassFinder의 Class 멤버 변수 안에 TSubclassOf 타입으로 해당 클래스를 가지고 있게 된다. 이것을 이용해서 필요한 작업을 진행하면 된다
그 다음으로 알아볼 것은 프로젝트에 포함된 리소스를 가져오는 방법이다
리소스의 종류는 여러 가지가 있는데 대표적으로는 StaticMesh나 Texture를 들 수 있다
StaticMeshComponent에 넣을 스태틱 메시 에셋을 불러온다고 가정하고 예시 코드를 작성해 보자
우선 UStaticMeshComponent* 타입, MeshComponent라는 이름의 컴포넌트를 생성한다
그리고 리소스 에셋을 가져오기 위해서는 마찬가지로 ConstructorHelpers의 FObjectFinder 사용하고 꺽쇠 괄호 <>에 가져올 리소스의 타입을 넣어주면 된다 [경로 역시 블루프린트 클래스를 불러올 때처럼 넣어주면 된다]
FObjectFinder를 통해서 가져온 오브젝트 역시 Succeeded 함수와 Object 변수의 NULL 체크를 통해서 리소스가 제대로 불러와졌는지 테스트한 뒤 사용하면 된다
VR게임 개발을 위한 언리얼엔진/C++ 공부한 내용 끄적이기...
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!