Unity3D Google APK Expansion Files 연동 2. OBB 업로드 및 다운로드 그리고 적용

 지난 포스팅에서 유니티3D에 구글 APK Expansion Files 연동을 위해 유니티사에서 만든 Google Play OBB Downloader 플러그인 설치 및 에셋 번들을 이용한 OBB 파일 생성까지 정리해 봤습니다. 이번 포스팅은 만들어진 OBB를 적용하기 위한 과정으로 구글 플레이에 APK와 함께 OBB 파일을 업로드하는 과정과 OBB 다운로더를 통해 다운로드한 OBB를 가져와 사용해 보는 것을 정리해 봅니다.


1. 구글 플레이에 OBB 업로드

 구글 플레이 개발자 콘솔에 새 애플리케이션을 추가합니다. 저는 OBBTest라고 했습니다. 링크의 내용은 비교적 예전 내용이라 현 구글 플레이와 다르겠지만 참고할만 합니다.

 구글 플레이 콘솔이 많이 바겼네요. 일단 테스트 앱이라 알파 테스트에 APK를 업로드 진행 했습니다.

 APK를 올린 후 결과 화면에서 위와같이 확장 파일 사용이라는 메뉴가 있습니다. 처음이라 확장 파일이 없음이라고 나오죠. 새 파일 업로드를 클릭해서 만들었던 OBBTest.zip 파일을 업로드 합니다.

 그리고 며칠전 작업 내용이라 에매한 부분이 있는데 첫 APK를 올렸을 때 저 확장 파일 사용 메뉴는 볼 수 없었고 처음 올린 후 다시 '알파로 새 APK 업로드' 버튼을 눌러 같은 버젼을 올리고 나서야 확장 파일을 올릴 수 있던걸로 기억이 나네요.

 OBBTest.zip 파일이 업로드 됩니다.

 OBBTest.zip 이었는데 올린 후에 자동으로 main.8.com.wwforever.obbtest.obbOBBTest.main.obb로 올라갑니다. obb로 올라가는 규칙은 main 또는 patch.Bundle Version Code.Bundle IDentifier.obb 로 알아서 올라가는거죠. 이런 규칙은 밑에서 나올 GooglePlayDownloader.cs 파일을 분석해 보면 더 자세히 알 수 있습니다.

 이런식으로 obb는 APK 업로드할 때 같이 올려주면 됩니다.


2. OBB 다운로드 및 적용

 static GooglePlayDownloader()
 {
  if (!RunningOnAndroid())
   return;

  Environment = new AndroidJavaClass("android.os.Environment");
  
  using (AndroidJavaClass dl_service = new AndroidJavaClass("com.unity3d.plugin.downloader.UnityDownloaderService"))
  {
     // stuff for LVL -- MODIFY FOR YOUR APPLICATION!
   dl_service.SetStatic("BASE64_PUBLIC_KEY", "REPLACE THIS WITH YOUR PUBLIC KEY");
     // used by the preference obfuscater
   dl_service.SetStatic("SALT", new byte[]{1, 43, 256-12, 256-1, 54, 98, 256-100, 256-12, 43, 2, 256-8, 256-4, 9, 5, 256-106, 256-108, 256-33, 45, 256-1, 84});
  }
 }
 임포트한 구글 플레이 OBB 다운로더의 GooglePlayDownloader.cs 를 수정해야 합니다. 위와 같은 소스 부분에서 REPLACE THIS WITH YOUR PUBLIC KEY 부분을 구글 플레이 개발자 콘솔에 있는 앱용 라이선스 키로 세팅해줍니다.

  if( GUI.Button(new Rect(10, 200, 100, 100), "Load Game" ))
  {
   StartCoroutine(LoadLevel("game"));
  }

 이번엔 DownloadObbExample.cs 파일의 수정입니다. OnGUI에 game 씬 로드를 위한 버튼을 추가합니다.

 protected IEnumerator LoadLevel(string strSceneName)
 {
  string expPath = GooglePlayDownloader.GetExpansionFilePath();
  string mainPath = GooglePlayDownloader.GetMainOBBPath(expPath);
  
  string uri = string.Empty;
  uri = "jar:file://" + mainPath + "!/" + "scene.unity3d";
  
  Debug.Log("downloading " + uri);
  WWW www = WWW.LoadFromCacheOrDownload(uri, 0);

  // Wait for download to complete
  yield return www;

  if (www.error != null)
  {
   Debug.Log("wwww error " + www.error);
  }
  else
  {
   AssetBundle assetBundle = www.assetBundle;
   assetBundle.LoadAll();
   Application.LoadLevel(strSceneName);
  }
 }

 버튼을 누르면 OBB에 있는 씬 에셋번들을 LoadFromCacheOrDownload로 가져와 game과 setting씬중 game씬을 LoadLevel로 읽어옵니다. uri를 만드는 부분이 중요합니다.

downloading jar:file:///mnt/sdcard/Android/obb/com.wwforever.obbtest/main.1.com.wwforever.obbtest.obb!/scene.unity3d

 결과 로그부터 보면 위와 같이 나옵니다. 붉은색 부분이 root와 obbpath, 패키지명으로 구성된 ExpansionFilePath이고 파란색 부분이 main obb 파일 패스입니다.

 실행화면 입니다. 이미 obb를 다운 받아서 Main에 파일명이 입력이 되어 있는데 처음에는 Patch와 같이 NOT AVAILABLE로 되어 있습니다.

 Fetch OBBs 버튼을 누르면 이렇게 플러그인에 포함된 다운로드 액티비티가 실행 되면서 obb 파일을 다운로드 합니다. 이 과정에서 APK와 OBB를 올린지 얼마 되지 않았다면 Download failed because the resources could not be found 에러가 발생할 수 있습니다. 아직 구글 플레이 서버 동기화가 안되서 그런것으로 짧게는 30분에서 길게는 1시간 정도 기다리시면 됩니다.

downloading jar:file:///mnt/sdcard/Android/obb/com.wwforever.obbtest/main.5.com.wwforever.obbtest.obb!/scene
 (Filename: ./Runtime/ExportGenerated/AndroidManaged/UnityEngineDebug.cpp Line: 54)
): GC_CONCURRENT freed 399K, 9% free 6646K/7239K, paused 2ms+2ms
wwww error java.io.FileNotFoundException: scene
(Filename: ./Runtime/ExportGenerated/AndroidManaged/UnityEngineDebug.cpp Line: 54)

 또한 uri가 잘 못 되면 위와 같이 파일을 못 찾는 에러가 발생할 수 있습니다.

 ASTRO 파일 관리자로 확인해 보면 위와 같이 obb 파일이 다운 된 것을 확인할 수 있습니다.

  if(GUI.Button (new Rect(100, 100, 100, 100), "Shield") )
  {
   StartCoroutine(LoadItem("class01_shield_000.unity3d"));
  }
  
  if(GUI.Button (new Rect(200, 100, 100, 100), "Sword") )
  {
   StartCoroutine(LoadItem("class01_sword_000.unity3d"));
  }

 이제 OBB에서 씬이 로드 되었으니 다음으로 게임 씬에서 씬이외에 다른 리소스 에셋 번들을 읽어와 보겠습니다. 게임 씬의 GameGUI.cs 입니다. item 에셋 번들을 가져오기 위한 부분입니다. 먼저 OnGUI에 버튼을 추가합니다.

 protected IEnumerator LoadItem(string strItemName)
 {
  string expPath = GooglePlayDownloader.GetExpansionFilePath();
  string mainPath = GooglePlayDownloader.GetMainOBBPath(expPath);
  
  string uri = string.Empty;
  uri = "jar:file://" + mainPath + "!/" + strItemName;
  Debug.Log("downloading " + uri);
  WWW www = WWW.LoadFromCacheOrDownload(uri, 0);

  // Wait for download to complete
  yield return www;

  if (www.error != null)
  {
   Debug.Log("wwww error " + www.error);
  }
  else
  {
   AssetBundle assetBundle = www.assetBundle;
   
   GameObject gameObj = assetBundle.mainAsset as GameObject;
   Vector3 itemPosition = transform.position;
   itemPosition.z += 5.0f;
   Object obj = Instantiate(gameObj, itemPosition, transform.rotation);
   DestroyObject( obj, 10.0f );
   assetBundle.Unload(false);
  }
 }

 아이템 에셋 번들 로드하는 부분입니다. 기존에 씬 처리한 것과 비슷합니다. 역시나 uri가 중요합니다.

 sword 아이템을 obb로부터 읽어와 봤습니다.

 새로운 OBB를 올려 적용하려면 게임 버전을 올리고 APK를 새로 올릴 때 Bundle Version Code의 숫자를 올려서 위에서 설명한 구글 플레이에 OBB 올리는 과정만 반복하면 됩니다. 소스 부분은 건들것이 없는게 플러그인에서 알아서 해당 버전에 맞는 obb의 패스를 넘겨주기 때문입니다.

 위 그림은 OBB 버전 2로 올리고 난 후 다운받은 모습입니다.

 main 2도 있고 기존에 1도 남아 있네요.

 마지막으로 OBB는 사실 APK를 구글 플레이에서 설치할 때 APK와 같이 자동으로 다운로드가 됩니다.

 위 그림을 보시면 제가 올린 OBBTest의 APK를 설치 진행한 건데요 밑에 알림을 보면 '다음에 대한 추가 파일: OBBTest' 라고 하면서 obb 파일을 다운 받는 것을 확인할 수 있습니다.

 obb 다운이 다 되면 알림은 APK 알림으로 바뀝니다.

 위 테스트 과정에서 APK를 설치하고 싶은데 올린지 얼마 안되서 구글 플레이에서 검색이 되지 않는다면 https://play.google.com/store/apps/details?id=패키지명 으로 브라우저에 입력하면 올리신 APK 페이지로 이동할 수 있습니다.

 이것으로 유니티3D에서 OBB 파일 적용하는 것 정리를 마무리합니다.

댓글

이 블로그의 인기 게시물

'xxx.exe' 프로그램을 시작할 수 없습니다. 지정된 파일을 찾을 수 없습니다.

goorm IDE에서 node.js 프로젝트로 Hello World Simple Server 만들어 띄워보기

애드센스 수익을 웨스턴 유니온으로 수표대신 현금으로 지급 받아보자.