반응형

AssetBundleManifest 제대로 불러오는 방법

AssetBundleManifest 오브젝트 불러오기 실패와 유니티 문서의 문제점

요 며칠간 패치 시스템을 만들면서 아주 많이 고민해야 했던 문제가 있었는데 그것이 바로 AssetBundleManifest 오브젝트를 불러오는 방법이었다. 여러가지 방법을 이용해서 에셋 번들의 매니페스트 파일을 불러오는 것을 시도했으나 번번히 AssetBundleManifest 객체는 Null 값을 뱉으며 실패하는 경험을 했다. 이를 해결하기 위해서 구글링해서 발견한 코드도 적용해보고, AssetBundleManager의 코드도 참고해 봤지만 문제는 해결될 기미가 보이지 않았다.


제일 처음 기본적으로 참고한 유니티 5.6 문서에서는 AssetBundleManifest 객체를 불러오기 위해서 다음과 같은 코드를 사용하라고 섹션 6에서 언급하고 있다 :


AssetBundle assetBundle = AssetBundle.LoadFromFile(manifestFilePath);
AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");

출처: http://wergia.tistory.com/32 [베르의 프로그래밍 노트]

AssetBundle assetBundle = AssetBundle.LoadFromFile(manifestFilePath);
AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");

AssetBundle assetBundle = AssetBundle.LoadFromFile(manifestFilePath);
AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");

출처: http://wergia.tistory.com/32 [베르의 프로그래밍 노트]


경험해본 바에 의하면 저 코드를 이용해서 매니페스트 파일을 불러올 수 있는 것은 사실이다. 하지만 매니페스트 파일을 사용하기 위해 처음으로 유니티 5.6 문서를 본 개발자는 저 manifsetFilePath에 대해서 정확하게 어떤 경로를 의미하는지에 대한 난감함을 느끼게 될 것이다. 작성자 역시 같은 난감함을 느꼈고 이 manifestFilePath를 알아내기 위해 여러가지 시도를 해야봐야 했다.



시도 1 : 매니페스트 파일을 불러오고자 하는 에셋 번들


AssetBundle assetBundle = AssetBundle.LoadFromFile(assetBundleDirectory + "/character.unity3d");
AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");


이 방법은 에셋 번들을 불러오는데는 성공하였지만 이후의 매니페스트 파일을 불러오는데는 실패해서 manifest가 null 값을 가지고 있었다.



시도 2 : 매니페스트 파일을 불러오고자 하는 에셋 번들의 매니페스트 파일


AssetBundle assetBundle = AssetBundle.LoadFromFile(assetBundleDirectory + "/character.manifest");
AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");



이 방법은 파일 불러오기 자체에서부터 실패했다.



시도 3 : 매니페스트 파일이 포함되어 있는 폴더의 경로


AssetBundle assetBundle = AssetBundle.LoadFromFile(assetBundleDirectory);
AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");


이 방법 역시 시도 2와 마찬가지로 불러오기 자체를 실패했다.



위의 세 가지 방법 이 외에도 LoadAsset을 하는 방법을 바꾸어 보기도 했고 LoadFromFile 대신 LoadFromMemory나 비동기 함수를 사용하는 방법도 사용해 봤었고, 에셋 번들을 빌드한 이후에 나온 매니페스트 파일을 각 에셋 번들에 포함시킨 후에 재빌드하는 방법도 사용해 봤다. 간단히 결론만 말하면 그 모든 방법은 실패했다.


그리고 마지막 방법으로 시도해본 것이 AssetBundles.unity3d라는 파일을 호출하는 것이었다. 유니티에서 에셋 번들을 빌드하면 에디터에서 지정한 에셋 번들 이름을 가진 에셋 번들들과 그 매니페스트 파일이 생성되고, 그 외에 직접 지정한 이름이 아닌 AssetBundles라는 파일과 AssetBundles.manifest라는 파일이 생성되는데, 유니티 5.6 문서에는 이 파일의 역할이 무엇인지 명시되어 있지 않았다.


그렇게 마지막으로 시도한 코드는 다음과 같았다 :


AssetBundle assetBundle = AssetBundle.LoadFromFile(assetBundleDirectory + "/AssetBundles.unity3d");
AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");



이 마지막 코드를 사용한 이후에야 매니페스트 파일을 불러올 수 있게 되었다.


유니티 문서에서는 AssetBundleManifest를 호출하는 방법은 정확히 알려주었으나, 어떤 파일을 불러와야 되는지는 제대로 알려주지 않은 것이다. 구글링한 내용들에서도 "AssetBundles" 파일에 대한 언급은 없었기 때문에 정확한 해결법을 찾는데 더 어려웠던 것 같다.




1. ".unity3d"라는 확장자는 웹 서버를 통해 다운받은 에셋 번들을 로컬 저장소에 저장할 때 직접 지정한 확장자이다.

2. 에셋 번들을 빌드하면 확장자 없이 에셋 번들 이름만 적힌 파일이 나온다.


반응형
  1. 파란파랑별 2018.01.11 12:59

    안녕하세요. 에셋번들 관련한 글 잘 보고 있습니다.

    하다가 해결이 안되는 문제가 있어서 그러는데
    AssetBundle assetBundle = AssetBundle.LoadFromFile(assetBundleDirectory + "/AssetBundles.unity3d");
    여기서 assetBundleDirectory는 어디를 말하는건지 알 수 있을까요..?


    • wergia 2018.05.22 13:38 신고

      assetBundleDirectory는 애셋 번들이 저장되어 있는 경로를 말합니다. 사용자가 직접 경로를 지정해서 불러오면 됩니다.

  2. 라임 2018.05.19 10:45

    안녕하세요
    혹시 말씀좀 물어봐두댈까여 ㅠ
    AssetBundleExtractor 프로그램으로 assets.lst 파일을 열어서 속의 사운드 파일 추출하려고하는데
    오픈누르고 해당파일을 눌러도 unable to read bundle file(invaild file or unknown vision) 이라고나옵니다 ㅠㅠ
    혹시 이부분에대해서 도와주실수있나요?

    • wergia 2018.05.22 13:37 신고

      음 애셋번들 추출은 해본적이 없어서 만족하실만한 답변은 못드릴것 같아요 ㅎㅎ

  3. 감사... 2018.10.01 20:26

    압도적 감사...!

+ Recent posts