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폴더에 있는 프리팹 한개.




그리고 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]);
            }
        }
    }
}




GoblinsB를 어셋번들로 만들기 위해 폴더 선택을 하고 다음처럼 이름을 써 줍니다.


확장자는 쓰지 않으셔도 되고 써도 됩니다.


그리고 저는 지금 대/소문자로 막 썼는데, 실제 대문자는 인식되지 않습니다.


(대문자로 써도 소문자로 바뀝니다. 보기 쉽게 저렇게 썼습니다)




두번째 AssetBundle로 BeholderGreen을 만들어 줍니다.




이제 마우스 오른쪽(또는 상단메뉴)를 통해 Build AssetBundles를 해줍니다.




그러면 다음처럼 진행이 됩니다.




Assetbundle Manager를 유니티에서 제공한 것을 사용했다면, 


프로젝트 폴더에 AssetBundles라고 폴더가 생기고 플렛폼이름 하위로


다음처럼 번들들이 생겼을 것입니다.


시간이 되신다면 manifest파일 한번씩 열어보시기 바랍니다.




실제 로드 테스트를 위해 위의 파일들을 다른 경로로(저는 E드라이브로) 옮겨줍니다.




이제 다음 코드를 붙여서 테스트를 해보도록 하겠습니다.


< 어셋번들 로드 하는 코드 >


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();
        }      
    }
}


스크립트를 아무대나 링크시키고 실행을 해보면


다음처럼 로드가 됩니다. 사실 끝난거죠.




이제 버전관리를 위해(패치는 해야하니까) 고블린 중에 하나 이름을 바꾸겠습니다.




그리고 다시 AssetBundle build를 하고 아까 그 폴더로 복사/붙여넣기 합니다.


그리고 다시 플레이를 해보세요.


아래 로그 보이시나요?


고블린 어셋번들이 캐쉬에 저장이 안된 상태로 되어있습니다.


좀전에 이름을 바꿨으니깐요.



실제 버전관리, 암호화 등을 하려면 관리자를 만들어야 합니다.


현재 포스팅은 기본적인 개념을 위해 작성한 것이니 


여러 테스트를 해보시고 잘 만드시길 바랍니다.



참고 : http://dev.suriyun.com/bay/technical/unity-asset-bundle-part-2/



+ Recent posts