이름 버전
unity3d 2019.3.10f1
macOS Mojave 10.14.6

 

AssetBundle 생성, 암호화, 패치까지 정리한 글이다.

 

에셋 번들 관리자는 Unity3d 2018.2 이상의 Unity3d 버전에서 지원이 중단된 상태지만 AssetBundleDemo Bitbucket 저장소에서는 계속 다운로드 받을 수 있으며 2018.2 이상에서 사용하고 싶다면 어드레서블 에셋에 대한 문서를 참조하자.

 

AssetBundle에 Asset 할당

1. Unity3d Project View에서 번들에 할당할 에셋을 선택한다.

 

2. Inspector View 아래쪽에 에셋 번들과 배리언트를 할당 가능한 선택 항목이 있다.

왼쪽은 에셋 번들 경로와 이름을 할당하거나 생성할 수 있다.

오른쪽은 배리언트 이름을 할당하거나 생성할 수 있다.

 

3. New 를 선택하거나 기존의 에셋 번들 이름을 사용한다.

이름을 생성할 때 하위폴더를 추가하려면 / 를 이용해 폴더 이름을 구분한다.

위와 같이 test/prefabs로 설정할 경우 아래와 같이 test 폴더 아래에 prefabs 라는 에셋 번들이 생긴다.

설정 후 모습

 

4. 필요에 따라 오른쪽 드롭다운에서 이와 같은 과정을 반복하여 배리언트 이름을 할당하거나 생성할 수 있다.

예를 들어 unity3d 라고 적은 후 에셋번들을 한다면...

위와 같이 에셋번들이 만들어진다.

 

 

AssetBundle Build

에셋에 에셋번들 할당이 끝났다면 인제 실제로 빌드를 해보자.

아래와 같은 Script를 제작하여 Assets/Editor 폴더 안에 넣어준다.

 

 

 

 

Assets-Build AssetBundles 항목이 생긴것을 확인할 수 있다.. 빌드를 하기전 먼저 BuildPipeline.BuildAssetBundles에 대해 알아보자.

 

BuildAssetBundleOptions

더욱 다양한 옵션을 확인하려면 위 링크를 참조하고 대표적인 3개만 적어두겠다.

 

1. BuildAssetBundleOptions.None

직렬화된 데이터 파일의 압축된 단일 LZMA 스트림인 LZMA 압축 포맷을 사용하기 때문에 번들을 사용하기 전에 압축을 풀어주고 사용해야한다. 따라서 파일 크기는 가장 작아지지만, 압축 해제 때문에 로드 시간이 조금 길어지게 된다. 압축해제된 번들은 디스크에서 다시 LZ4 압축 포맷을 사용하여 다시 압축된다. LZ4는 번들의 에셋을 사용하기 위해 모든 번들의 압축을 풀 필요가 없다.

이 옵션은 번들의 에셋을 사용하기 위해 모든 에셋을 로드해야 하는 경우 사용하기에 적합하며 예로 캐릭터나 씬에 대한 모든 에셋을 묶을때 사용하면 좋다. LZMA 압축 포맷을 사용하면 번들 용량이 작아지기 때문에 유저들이 최초로 다운로드 받을 때만 사용하기를 권장한다.

UnityWebRequestAssetBundle를 통해 로드된 LZMA 압축 에셋 번들은 자동으로 LZ4 압축 포맷을 통해 다시 압축되어 로컬 파일 시스템에 캐시된다. 번들을 다른 방법으로 다운로드하고 저장하는 경우  AssetBundle.RecompressAssetBundleAsync로 재압축할 수 있다.

 

2. BuildAssetBundleOptions.UncompressedAssetBundle

이 번들 옵션은 번들을 압축하지 않는다. 압축하지 않기 때문에 번들의 용량이 크고 유저들이 다운로드할 파일 크기가 커진다. 하지만 다운로드된 파일을 로드하는 속도는 비교적 빠르다.

 

3. BuildAssetBundleOptions.ChunkBasedCompression

이 번들 옵션은 LZ4 압축 메서드를 사용한다. LZMA 압축 포맷보다 압축된 파일 크기가 크지만 LZMA 포맷과는 다르게 모든 번들의 압축을 풀고 사용할 필요가 없다. 청크 기반 알고리즘을 사용하여 에셋 번들이 부분적 또는 "청크" 단위로 로드될 수 있도록 한다. 단일 청크의 압축을 풀면 에셋 번들에서 다른 청크의 압축을 풀지 않아도 해당 청크에 포함된 에셋을 사용할 수 있다. 압축되지 않은 번들과 비슷한 로드 속도를 가지게 되지만 디스크의 용량은 적게 차지한다.

 

BuildTarget

빌드 파이프라인에 에셋 번들을 사용할 타겟 플랫폼이 무엇인지 알려줘야한다. 사용 가능한 명시적인 빌드 타겟의 리스트는 위의 링크에서 확인하며 되며 만약 빌드 타켓을 하드코딩하기 싫다면 EditorUserBuildSettings.activeBuildTarget 옵션을 사용하면 현재 빌드 설정이 된 플랫폼을 자동적으로 찾고 그 타겟 기반의 에셋 번들을 빌드한다.

 

인제 Assets > Build AssetBundles 로 에셋빌드를 하면 에셋 번들 디렉토리에 2*(n+1)개의 파일이 더 있을 것이다. 에셋번들의 이름으로된 파일과 에셋번들 이름 + ".manifest" 로 파일이 생성된다.

여기서 manifest 파일들은 모든 텍스트 에디터로 열 수 있으며 순환 중복 검사(CRC) 데이터 등과 같은 번들에 대한 정보를 포함한다. 가장 중요한 데이터는 종속성 정보이다.

AssetBundles(에셋 번들이 빌드된 디렉토리의 이름을 사용한다.)은 에셋을 로드하기 위해 런타임 시점에 로드해야하는 파일이라고만 알고 있으면 된다.

 

 

AssetBundle Encryption

Open SSL을 이용해서 에셋 번들을 암호화를 한다. 복호화시에 시간이 필요하기 때문에 중요한 에셋을 보호 하는 용도로 사용하는 것이 좋다.

 

먼저 macOS 에서 OpenSSL 을 설치하는 법이다.

1. https://www.openssl.org/source/에 접속한 후 최신 버전의 openssl을 다운로드 받아준 후 압축을 풀어준다.

2. 터미널로 압축 푼 openssl 폴더로 이동한다.

3. 아래 명령어들 중 하나를 터미널에 입력한다. ./config 만 입력해도 된다.

$ ./config							// 32bit
$ ./Configure darwin64-x86_64-cc	// 64bit

4. 설정이 끝났다면 아래 명령어를 터미널에 입력하여 설치를 진행한다. 2개의 명령어를 모두 실행시켜줘야한다.

$ make
$ sudo make install

설치 폴더 위치는 /usr/local 이다. Finder - 폴더로 이동 을 하면 설치가 잘되어 있는 것을 알 수 있다.

  • /usr/local/bin - openssl 실행 파일
  • /usr/local/lib - openssl 라이브러리 파일
  • /usr/local/include - openssl 헤더 파일
  • /usr/local/share - openssl 문서 & 메뉴얼 파일
  • /usr/local/ssl - openssl 설정 & 인증서 경로

openssl 설치가 끝났다면 터미널로 에셋번들이 위치한 폴더로 이동한다.

아래의 순서대로 에셋번들을 암호화한다.

 

1. 아래 명령어를 입력한 후 실행한다.

$ openssl rc2 -nosalt -p -in 에셋번들이름.unity3d -out 에셋번들이름.bin

2. 암호화에 대한 암호를 물어보면 암호를 입력해준다. 임시로 "12345678" 로 입력하자.

2번째 물어보는 Verifying - enter rc2-cbc encryption password: 은 검증 단계이니 아까 입력한 암호를 다시 입력한다.

3. 암호화 후 생성되는 key, iv는 복호화할때 필요하니 잘 기록해둔다.

4. 아래 명령어를 입력하여 bin 파일을 base64로 인코딩된 txt 파일로 변환한다.

$ openssl base64 -in 파일이름.bin -out 파일이름.txt

5. 최종적으로 base64로 인코딩된 txt 파일이 생성된다.

 

인제 이 txt 파일을 Unity3d 프로젝트로 옮기면 되지만 편안한 테스트를 위해 에셋번들이 생성된 위치에서 생성했기 때문에 이 부분을 생략하겠다.

 

아래와 같은 스크립트를 제작한 후 실행시키면 에셋번들이 잘 로드되어 생성되는 것을 볼 수 있다.

 

 

 

 

 

 

AssetBundle Load 관련 추가

 

 

 

 

 

참조

https://smilejsu.tistory.com/1202

https://lhh3520.tistory.com/19

https://lhh3520.tistory.com/93

https://docs.microsoft.com/ko-kr/dotnet/api/system.security.cryptography.rc2cryptoserviceprovider?view=netframework-4.8

'Programming > Unity3D' 카테고리의 다른 글

Addressable 관련 정리  (0) 2020.06.04
Unity3d 오답노트  (0) 2020.06.04
[Unity3d] 경로 보여주는 툴  (0) 2019.11.15
How To Draw Line On Screen In Unity (C#)  (2) 2015.09.21
UForm (Unity3D + WinForm) 에 대한 고찰...  (0) 2015.07.27
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기