게임학원, 게임프로그래머 취업 전문 교육기관 DirectX11/12 자체엔진 게임개발과정,서버프로그래밍,자료구조,알고리즘,유니티,언리얼 게임학원, 언리얼학원 언리얼엔진4 C++ 코드를 이용한 메쉬 로딩
본문 바로가기

언리얼엔진4 C++ 코드를 이용한 메쉬 로딩

안녕하세요. 어소트락 게임아카데미 입니다.


이번 글은 지난시간에 만들었던 StaticMeshComponent에 C++코드를 활용하여 StaticMesh 에셋을 읽어와서 설정해주는 내용을 보도록 하겠습니다.


지난 글에서 StaticMeshComponent를 코드로 생성하고 RootComponent로 설정하는 코드를 작성하였습니다.

StaticMeshComponent에 실제 메쉬를 지정하는것은 해당 Actor를 레벨에 배치한 후에 수동으로 에디터에서 메쉬를 선택하여 설정을 해주게 제작이 되었는데 만약 같은 메쉬를 사용하는 경우에도 하나씩 모두 설정해 주어야 하는 불편함이 있습니다.

그렇기 때문에 AMapObject 클래스의 생성자에서 StaticMesh를 코드로 불러와서 설정을 해주게 되면 해당 AMapObject의 StaticMeshComponent는 해당 StaticMesh가 지정이 되어서 매번 Mesh를 새로 지정할 필요 없이 지정된 메쉬로 출력되는 액터를 제작할 수 있게 되기 때문에 편리하게 사용하실 수 있습니다.


언리얼엔진4 에서는 에디터에 로드 되어있는 에셋을 불러오는 함수를 제공해주고 있습니다.

ConstructorHelpers 라는 구조체를 이용하는 것인데요. 이 구조체 안에 또 다른 구조체가 존재하는데 FObjectFinder 라는 구조체입니다.

위의 그림에서처럼 FObjectFinder 구조체는 ConstructorHelpers 구조체 안에 존재합니다.

그렇기 때문에 FObjectFinder에 접근하기 위해서는 CConstructorHelpers::FObjectFinder 의 형태로 접근을 해야 하는것이죠.

위 그림에서 보시는것처럼 FObjectFinder는 template을 이용한 구조체입니다. 즉, template<class T> 의 형태에서

T에 들어갈 타입을 지정해 주어야 하는데 FObjectFinder 구조체는 생성자를 이용하여 불러오고자 하는 에셋의 경로를 지정해주게 되면 내부에서 경로를 체크해주고 해당 경로의 에셋을 로딩하고 유효성 체크를 해주게 되는 것입니다.

에셋이 로딩 되었는지 여부는 Succeeded 함수를 이용하여 체크할 수 있습니다.

그림에서 보시는것처럼 멤버변수로 T* 타입의 Object라는 변수가 있고 이 Object변수에 생성자에서 ConstructorHelpersInternal::FindOrLoadObject<T>(PathName); 의 생성자를 호출하여 에셋을 로딩하고 해당 타입으로 생성된 객체를 리턴해주어서 지정을 해주고 있는것이 보일 것입니다.

실제 T타입에 UStaticMesh 를 지정해 주었다면 UStaticMesh객체의 주소를 Object 변수에 저장해두고 있는 것이죠.

여기서 중요한건 우리가 원하는 에셋의 경로를 얻어오는 것입니다.

그렇기 때문에 경로를 지정할때도 언리얼엔진에서 제공해주는 경로를 이용하여 지정을 해주면 되는데요.

언리얼엔진 에디터로 가서 원하는 에셋을 찾은 후에 해당 에셋을 우클릭을 하게 되면 레퍼런스 복사라는 메뉴를 볼 수 있습니다.

바로 아래와 같은 메뉴를 선택하면 클립보드에 해당 에셋의 경로가 복사가 되고 Ctrl + V키를 이용하여 코드상에 경로를 붙여넣을 수 있는 것이죠.

이렇게 복사된 에셋 경로를 아래 그림처럼 코드를 작성하고 생성자에 넣어준 후에 로딩이 되었는지를 체크하고 UStaticMeshComponent에 Mesh를 지정해주면 이제 이 Actor의 UStaticMeshComponent는 기본으로 해당 경로의 에셋을 지정한 상태가 되어 있는 것입니다.

그렇기 때문에 레벨에 배치한 후에 따로 메쉬를 지정해주지 않아도 기본으로 지정된 메쉬가 출력이 되는 것입니다.

위 그림의 붉은색 박스 안을 보면 에셋 경로를 복사하여 UStaticMesh를 생성해주는 것을 볼 수 있습니다.

모든 StaticMesh 에셋들은 이런 형식으로 코드상에서 에셋을 로드하여 사용할 수가 있습니다.

위에서 생성한 m_pMeshCom의 SetStaticMesh 함수를 이용하여 UStaticMeshComponent에서 사용할 UStaticMesh를 지정해줄 수 있게 되는 것이죠.

위의 그림에서 보시는 것처럼 에디터의 콘텐츠브라우저를 보면 MapObject는 단순한 구체에서 이제 코드에서 지정한 에셋으로 아이콘이 바뀌어 있는 것을 볼 수 있을 것입니다. 

이것을 레벨에 배치하면 해당 메쉬로 출력이 되서 나오게 되는 것이죠.

이렇게 C++ 코드를 활용하여 StaticMesh를 로드한 후에 UStaticMeshComponent에 지정하는 코드에 대해서 알아보았습니다.

다음 글에서는 언리얼엔진에서 사용하는 변수타입들에 대해서 알아보고 UPROPERTY 매크로를 이용하여 에디터에서 멤버변수의 값을 컨트롤하는 방법에 대해 알아보도록 하겠습니다.


문의전화

02-598-9457

카카오톡 오픈채팅 무료상담

https://open.kakao.com/o/sVEspGE

유튜브 무료강의

http://bit.ly/2zNkCEm