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/



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

안드로이드 세팅. (2015-09-02 기준)



Step 1. Android SDK 설치하기.

다음 사이트로 이동한다.

http://docs.unity3d.com/Manual/android-sdksetup.html

그러면 다음처럼 화면이 나오는데, 표시해둔 곳을 클릭한다.


그리고 다음처럼 STAND-ALONE SDK TOOLS를 선택한다.

참고 : ANDROID STUDIO 설치하셔두 됩니다. 저는 ANDROID STUDIO툴이 필요 없으니 SDK만 받도록 하겠습니다.

그리고 download the SDK now를 선택.



자신의 운영체제에 맞는 버전을 선택하세요. 저는 Windows니까 저걸 받아요. 

참고 : Installer로 설치할께요. 압축 풀어서 해도 되는데 환경변수(아마도) 설정해줘야 될거에요.



다운이 완료되면 설치합니다.

설치가 끝나면 SDK Manager 실행 할래요? 하는데 Yes하세요.


Step 2. Android SDK 필요한거 받기.

매니저가 실행 되면 다음처럼 설치가 아직 안된 리스트가 보입니다.

필요한것 받으시면 되는데 Google USB Driver는 꼬옥 설치하세요.

참고 : 구글 AdMob을 차후 계속 중이라면 Google Play services도 선택하세요.

지금 설치 안하더라도 나중에 추가하실 수 있으니 걱정 마세요.



설치가 이제야 완료 되었네요. 창을 닫습니다.



Step 3. 유니티 SDK 경로 세팅하기.(마무리단계)

유니티를 실행 시킵니다.

상단 메뉴에서 Edit -> Preferences 를 선택합니다.

External Tools에서 Android SDK Location을 설정해줍니다.


Step1에서 기본 경로로 설정하셨다면 저와 같을꺼에요. 



Step 4. 테스트 하기

상단 메뉴에서 File -> Build Settings 를 클릭합니다.

Android를 선택하고 Switch Platform을 눌러줍니다.


그리고 Player Settings를 눌러줍니다.

참고 : Bundle Identifier를 수정해주셔야 빌드가 되요.


Bundle Identifier를 수정해 줍니다.

참고 : 숫자는 안되요!


완료 되었습니다. 

폰 연결하고 빌드 해보시면 잘 되실꺼에요^^

안되시면 댓글 주세요.



+ Recent posts