🎮Unreal4/C++_Plugin

[UE4] Save Mesh-2 : .bin/.csv파일로 저장 (FPaths, GetOSWindowHandle, IDesktopPlatform, SaveFileDialog, Stream <<, FArchive, FileHelper, GetBaseFilename)

공대 컴린이 2023. 3. 30. 19:37
728x90

4️⃣ Save 경로 지정하기

StaticMesh_Detail.cpp

Mesh 정보를 모두 추출하였으니, Mesh 파일을 Save할 경로를 지정해줘야 한다.

첫번째 단계로는 Save 창을 띄웠을 때 Default로 나타나는 경로를 GetPath 함수로 구해주었다. (한번도 임포트 버튼을 눌러서 경로창을 띄우지 않았다면 없을 수 있음)

 

이때 사용되는 FPaths에는 다양한 경로에 대한 함수를 제공한다.

💡 FPaths

  • AutomationDir : 자동화 경로
  • CloudDir : 클라우드 경로(빌드파일이 올라감)
  • Combine : 슬래시를 합쳐줌
  • ConvertRelativePathToFull : 상대경로를 절대경로로 바꿔줌
  • EngineConfigDir : 엔진 Config 폴더 (다양한 Engine Dir 존재)
  • GetBaseFileName : Path에서 파일명만 반환
  • GetPath : 임포트를 눌렀을 때 열리는 최근폴더 경로

이후 Save창을 띄우기  위해 MainFrame의 GetParentWindow 함수로 부모에 접근하였다.

Window의 (화면?) 상속관계는 간단히 아래와 같다.

 

----------------   MainFrame
----------------   Win-Editor
----------------   Window 

 

Window가 부모로 깔려있으면 그 위에 Window Editor가 존재한다. 언리얼 엔진은 Window Editor위에 MainFrame으로써 덮어지는 것이다.

MainFrame의 Parent를 호출하였으므로 Win-Editor가 불러와지게 되고, GetNativeWindow로 Unreal이 아닌 Window쪽에 접근하였다. 이후, GetOSWindowHandle 함수를 통해 불러온 Window 창의 식별자를 불러왔다.

Handle은 해당 객체의 식별자이며, 그 객체의 시작 주소를 가지고있다.

5️⃣ Save 창 띄우기

FStaticMesh_Detail::OnClicked_Save()

Window의 Handle을 가져왔다면 IDesktopPlatform클래스를 이용하여 SaveFileDialog를 띄워주었다.

SaveFileDialog에는 Window HandleDialog의 제목, 창을 띄울때 나타날 기본 경로, 기본 파일, 그리고 파일이 저장될 확장명을 지정해주었다.

6️⃣ 데이터 전송하기

FStaticMesh_Detail::OnClicked_Save()

Mesh 정보를 담은 FStaticMesh_DetailData 구조체를 전달하기 위해선 Stream << 을 이용해야 한다.

 

C++에서는 << Stream과 >> Stream을 모두 사용하지만, 언리얼에서는 << 으로만 사용한다.

언리얼 엔진에서 파일, 메모리 등의 데이터를 전송하기 위해선 FArchive(아카이브) 클래스를 이용해야 한다. 

 

FStaticMesh_DetailData 구조체 속 함수

구조체를 stream으로 전송하기위해 operator << 연산자를 friend함수로 오버라이딩하였다.

 

이후 FBufferArchive 버퍼에 Data를 차례로 전송하고, FileHelper 클래스 SaveArrayToFile 함수를 통해 배열을 File로 저장하였다.

Stream을 이용하여 데이터를 전송할 때 특정 바이트씩 단위를 나눠 전송하는데, 만약 4바이트씩 데이터를 보내고 난 뒤 마지막 3바이트가 남아있을 수 있으므로 FlushCache 함수를 사용하여 마지막 바이트까지 완벽히 전달해주는것이 좋다.

 

모든 데이터 전송이 끝났다면 버퍼를 Empty 함수로 비워주었다.

 

FStaticMesh_DetailData 구조체 속 함수

이후에는 Mesh의 정보를 CSV 파일로 저장하기 위해 FString 변수에 콤마( , )를 기준으로 나누어 저장한 뒤, SaveStringToFile 함수를 이용하여 파일로 변환하였다.

 

이때 파일의 이름을 만들때 사용한 GetBaseFilename 함수파일명과, 경로의 출력유무를 판단하는 bool 변수를 넘겨주어 사용한다.

 

현재 fileNames 배열에 저장되어있는 문자열과, GetBaseFilename 함수로 파일명을 뽑은 textFileName 변수와, FPaths 클래스의 GetCleanFilename 함수를 사용했을때의 문자열을 주석으로 각각 정리해두었다.


완성된 프로그램을 실행시켜 Mesh의 Save기능을 실행시킨 결과는 아래와 같다.

 

Static Mesh를 선택한 후 메시 카테고리의 Save 버튼을 누르면

 

WindowHandle을 이용하여 window의 Save 창이 띄워진다. 

나는 이 파일을 TestFile라는 이름으로 저장하였다.

 

이후, 바탕화면을 보면 csv 파일과 bin 파일이 잘 생성된것을 볼 수 있었고,

파일의 내용은 아래와 같다.

 

bin 파일 csv 파일

csv 파일을 보면 순서대로 각 정점마다의 Position값과, Normal 벡터 값, UV값과 Colors 값이 잘 출력된것을 확인할 수 있었다.

728x90