336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
유니티 버전 : 5.3.4f
유니티3D 5.x (Unity3d 5) 어셋번들 매니저(AssetBundle Manager)
어셋번들(AssetBundle) 관련 사항들이 유니티 4.x와 5.x가 많이 달라졌습니다.
그래서 간단한 테스트로 정리해봅니다.
AssetBundle 빌드하는건 에셋스토어나 유니티 사이트에 있으니 미리 다운 바랍니다.
에셋스토어 링크 : https://www.assetstore.unity3d.com/kr/#!/content/45836
우선 저는 다음과 같은 구조로 만들었습니다.
DataForCDN이라는 폴더 내에 있는 데이터들을 어셋번들로 만들 계획입니다.
테스트를 위해 두 종류로 만들것입니다.
1. GoblinsB 폴더.
2. Beholders에 있는 Prefabs폴더에 있는 프리팹 한개.
![](https://t1.daumcdn.net/cfile/tistory/275A7D3E5745CD2913)
그리고 Script에 있는 ReApplyShaders가 스크립트가 있는데 (NonCachingLoad는 신경쓰지마세요)
하는 역할은 머테리얼에 있는 쉐이더를 재적용 해주는 스크립트 입니다.
유니티5 로 어셋번들(assetbundle)을 묶어서 로드하게 되면
쉐이더가 적용 안되는 버그가 있습니다. 그래서 저렇게 (우선은..) 하고 있습니다.
저는 미리 로드할 프리팹(아래보이는 화면)에 저 스크립트 붙여놨습니다.
< ReApplyShaders 코드 >
using UnityEngine;
using System.Collections;
public class ReApplyShaders : MonoBehaviour {
Renderer[] renderers;
Material[] materials;
string[] shaders;
void Awake()
{
renderers = GetComponentsInChildren();
}
void Start()
{
foreach (var rend in renderers)
{
materials = rend.sharedMaterials;
shaders = new string[materials.Length];
for (int i = 0; i < materials.Length; i++)
{
shaders[i] = materials[i].shader.name;
}
for (int i = 0; i < materials.Length; i++)
{
materials[i].shader = Shader.Find(shaders[i]);
}
}
}
}
![](https://t1.daumcdn.net/cfile/tistory/2639E53E5745CD2A33)
GoblinsB를 어셋번들로 만들기 위해 폴더 선택을 하고 다음처럼 이름을 써 줍니다.
확장자는 쓰지 않으셔도 되고 써도 됩니다.
그리고 저는 지금 대/소문자로 막 썼는데, 실제 대문자는 인식되지 않습니다.
(대문자로 써도 소문자로 바뀝니다. 보기 쉽게 저렇게 썼습니다)
![](https://t1.daumcdn.net/cfile/tistory/23504B3E5745CD2B1C)
두번째 AssetBundle로 BeholderGreen을 만들어 줍니다.
![](https://t1.daumcdn.net/cfile/tistory/253BD93E5745CD2C32)
이제 마우스 오른쪽(또는 상단메뉴)를 통해 Build AssetBundles를 해줍니다.
![](https://t1.daumcdn.net/cfile/tistory/22441B3E5745CD2D28)
그러면 다음처럼 진행이 됩니다.
![](https://t1.daumcdn.net/cfile/tistory/254CC93E5745CD2E1F)
Assetbundle Manager를 유니티에서 제공한 것을 사용했다면,
프로젝트 폴더에 AssetBundles라고 폴더가 생기고 플렛폼이름 하위로
다음처럼 번들들이 생겼을 것입니다.
시간이 되신다면 manifest파일 한번씩 열어보시기 바랍니다.
![](https://t1.daumcdn.net/cfile/tistory/2758A53E5745CD2F14)
실제 로드 테스트를 위해 위의 파일들을 다른 경로로(저는 E드라이브로) 옮겨줍니다.
![](https://t1.daumcdn.net/cfile/tistory/224B283E5745CD2F21)
이제 다음 코드를 붙여서 테스트를 해보도록 하겠습니다.
< 어셋번들 로드 하는 코드 >
using UnityEngine;
using System.Collections;
public class NonCachingLoad : MonoBehaviour {
public string URL = "file:///E:/Android/";
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if(Input.GetKeyDown(KeyCode.A))
{
StartCoroutine(Down());
}
}
IEnumerator Down()
{
WWW www = new WWW(URL + "Android");
yield return www;
if (!string.IsNullOrEmpty(www.error))
{
Debug.Log(www.error);
yield break;
}
// 메니페스트 얻기
AssetBundle bundleManifest = www.assetBundle;
www.Dispose();
AssetBundleManifest assetBundleManifest = bundleManifest.LoadAsset("AssetBundleManifest");
// 메니페스트가 가지고 있는 모든 어셋번들 이름을 가져옵니다.
// 여기에서는 두개가 나오겠죠.
string[] assetBundleNames = assetBundleManifest.GetAllAssetBundles();
// 어셋번들 갯수만큼 돌면서 게임오브젝트를 만들겠습니다.
for (int i = 0; i < assetBundleNames.Length; i++)
{
string assetBundleName = assetBundleNames[i];
// 이미 캐쉬되어있는지 확인
bool bCaching = Caching.IsVersionCached(URL + assetBundleName, assetBundleManifest.GetAssetBundleHash(assetBundleName));
// 로그 찍어본다.
Debug.Log(assetBundleName + " Cash : " + bCaching.ToString());
// 어셋번들을 다운로드 합니다.
// 저는 URL과 해쉬값으로 로드하겠습니다.(해쉬값은 메니페스트에 있습니다.)
www = WWW.LoadFromCacheOrDownload(URL + assetBundleName, assetBundleManifest.GetAssetBundleHash(assetBundleName));
yield return www;
AssetBundle bundle = www.assetBundle;
string[] names = bundle.GetAllAssetNames();
for (int j = 0; j < names.Length; j++)
{
// 하나의 어셋번들이 가지고 있는 리스트롤 로그에 찍을꺼에요.
Debug.Log(names[j]);
// GameObject인 것만 생성(여기에서는 프리팹만 나오겠죠)
GameObject gObj = bundle.LoadAsset(names[j]);
if (gObj != null)
Instantiate(gObj);
}
// 번들을 언로드해줍니다.
bundle.Unload(false);
www.Dispose();
}
}
}
스크립트를 아무대나 링크시키고 실행을 해보면
다음처럼 로드가 됩니다. 사실 끝난거죠.
![](https://t1.daumcdn.net/cfile/tistory/25407C3E5745CD312C)
이제 버전관리를 위해(패치는 해야하니까) 고블린 중에 하나 이름을 바꾸겠습니다.
![](https://t1.daumcdn.net/cfile/tistory/2541853E5745CD3229)
그리고 다시 AssetBundle build를 하고 아까 그 폴더로 복사/붙여넣기 합니다.
그리고 다시 플레이를 해보세요.
아래 로그 보이시나요?
고블린 어셋번들이 캐쉬에 저장이 안된 상태로 되어있습니다.
좀전에 이름을 바꿨으니깐요.
![](https://t1.daumcdn.net/cfile/tistory/2348793E5745CD3323)
실제 버전관리, 암호화 등을 하려면 관리자를 만들어야 합니다.
현재 포스팅은 기본적인 개념을 위해 작성한 것이니
여러 테스트를 해보시고 잘 만드시길 바랍니다.
참고 : http://dev.suriyun.com/bay/technical/unity-asset-bundle-part-2/