24b0d121e09c28a8699fe8b115ef0464d389e7cee7


예전에 미니서든 (원 게임명 엑스 오퍼레이션) 유니티로 만들겠다고 선포한 사람이다


참고로 6개월 동안 개뻘짓 하고 리펙토링 하고 프로젝트 3번 터트려서 리셋해서 사실상 진전 없는 상태



오늘 내가 한 일은 꽤 유의미한 작업이라서 한번 여기다가 올려봄

뭘 했냐면 구닥다리 모델 데이터가 담긴 .x 파일을 런타임에서 불러오는 데 성공을 함.



원래는 Trilib2 라고 내가 만든 것보다 100만배 정도 좋은 에셋이 있는데

모딩 지원을 추가하기 위해서 (또 오픈 소스를 할 경우 유료 에셋이 들어있으면 골치아프기 때문에)


과감하게 딸깍으로 런타임에서 파일 경로로 모델링을 불러오는 에셋을 포기했다 (이거 시발 40달러짜리인데 안쓰면 돈낭비긴함)




24b0d121e09c28a8699fe8b115ef046ecb48c3f42b


이 쪽 방면에서 ASSIMP라고 하는 오픈 소스 라이브러리가 있다

DirectX나 OpenGL로 끄적이는 애들이 주로 사용한다고 함



24b0d121e09c28a8699fe8b115ef046c66f1284899

공식 문서를 보니까, 수많은 모델 파일 포멧을 지원한다

특히 내가 가장 원했던 Direct X 파일도 지원하고 있다


Direct X 파일은 마이크로소프트가 DirectX 2를 출시할 때 만든 모델 파일 포멧이라고 한다.

문제는 그것보다 수천만배 좋은 포멧들 (예를 들면 fbx, gltf 등등)이 나왔기 때문에 마소도 유기때렸다고 한다.


내가 구현하고자 하는 미니서든은 저 구닥다리 DirectX File을 사용하기 때문에 ASSIMP는 적당한 라이브러리라고 볼 수 있다.


심지어 ASSIMP .NET도 있어서 유니티에서도 지원이 가능한 걸로 보인다.



24b0d121e09c28a8699fe8b115ef046c60f42f4a9f


나같은 뻘짓을 하고자 하는 병신이 한 명은 아니었는지

ASSIMP NET을 유니티에서 작동할 수 있게 만든 라이브러리도 있었다.


그래서 바로 이걸 에셋에 슛~ 해버렸다




24b0d121e09c28a8699fe8b115ef046c69f02f4f9a


??? : 근데 이거 어떻게 씀?


24b0d121e09c28a8699fe8b115ef0469903bf3b4



????




24b0d121e09c28a8699fe8b115ef0464d785e3ceea









24b0d121e09c28a8699fe8b115ef046c63f0204e95


ㅋㅋㅋ 어 나한텐 클로드쨩이 있어



결과: 실패




24b0d121e09c28a8699fe8b115ef046f584f999ea0


븅신같은년

내가 지능은 떨어져도 글을 못 읽는건 아니라서

그냥 공식 문서를 보고 직접 작성하기로 함


특히 또 다른 내가 이걸 찾고 있을 수 있으니 참고하라고 작성해둠



ASSIMP의 경우 Scene 이라고 하는 단위를 사용하고 있다.

블렌더를 끄적거려본 사람은 블렌더 내에 있는 Hierarchy와 똑같고,

마찬가지로 유니티 내에서의 게임오브젝트 계층구조랑도 똑같다고 보면 된다



단지 그 계층을 이루는 데이터들이 메시냐, 머티리얼이냐, 텍스쳐냐, 기타등등이냐 나뉘는거다.




24b0d121e09c28a8699fe8b115ef046c64f12b4d98


이런 식으로 scene을 파일 데이터에서 임포트 하면 되는거임.


Assimp 라이브러리를 가져오면, Assimp에 있는 Mesh, Material 등등이 Unity랑 겹치기 때문에 이걸 잘 구분해주는 것도 필수



Assimp Scene 계층구조에 있는 Mesh를 foreach로 하나씩 읽어들여야 한다.

왜냐하면 모델 파일에서 Mesh 오브젝트가 하나라는 보장이 없기 때문이다.


그런 식으로 Assimp.Mesh를 UnityEngine.Mesh에 덮어씌우면 된다.


나머지는 Monobehaviour 상속받는 클래스에서 MeshFilter랑 MeshRenderer를 추가하면 되는거임



24b0d121e09c28a8699fe8b115ef046f5b4a9d9ea0


이건 유니티 안에서 불러온 원본 게임의 수류탄 모델임. 잘 불러온 것 같음



24b0d121e09c28a8699fe8b115ef046a756eeac437


이건 실제 게임에서의 모델링이고


24b0d121e09c28a8699fe8b115ef046c62f421499f


블렌더에서 봤을 때의 모델링임.



유니티 엔진에서도 meshFilter가 담긴 오브젝트가 두개이고

블렌더 상에서도 두개니까 제대로 불러왔음을 알 수 있음



텍스쳐 같은 경우는 원본 게임은 외부에서 따로 불러오는 걸로 보이기 때문에

MeshRenderer의 sharedMaterial만 메차쿠차 해주면 해결됨.


런타임에서 JPG, PNG를 불러오는 건 Texture.LoadImage(파일 바이트)로 손쉽게 해결 가능하니 문제도 없다고 생각



우효~~~~



대신 확인해야 할 것은

단시간에 많은 데이터를 로드해야 할 때나

코루틴 또는 Unitask 같은 걸로 비동기 로딩을 할 때 어떻게 될 지는 모르겠음. 그건 개발을 하면서 확인해야 할 듯