2015.03.20 12:00

(* 이미지는 원본 사이트에서 참고할 것!)


(* 원본 : http://docs.unity3d.com/500/Documentation/Manual/BuildingAssetBundles5x.html)


BuildingAssetBundles in 5.x


AssetBundle 제작


Unity 4.x AssetBundles에서는 에디터 스크립트로 제작했다. 이 과정은 AssetBundle 제작 툴이 포함된 Unity 5.x 에디터에서는 심플해졌다. 만약 당신이 에디터에서 어떤 Asset을 선택하면, Inspector 창 하단에 해당 에셋을 어떤 AssetBundle에 포함시킬지 지정할 수 있는 drop down 메뉴가 보일 것이다. 기본적으로 AssetBundle 옵션은 None으로 지정되어 있다. 이것의 의미는 해당 에셋을 AssetBundle안에 기록하지 않겠다는 것이다. 당신이 새로운 AssetBundle을 만들 수 있으며, 그것에 이름을 부여할 수 있다. 그리고 그것을 해당 에셋에 지정할 새로운 AssetBundle 이름으로 사용할 수 있다.


(이미지 : AssetBundle creation) 


위 그림에서는 StateMachine 에셋을 Scene1/animdata라고 명명한 AssetBundle에 추가한 것이다. 이 AssetBundle은 아마 이전에 이미 추가되어 다른 에셋들을 포함하고 있을 것이다.


빈 AssetBundles을 생성할 때는 "New..." 메뉴 옵션(* 이미지 참고)을 이용하면 생성이 가능하다. 새로운 빈 AssetBundle을 추가한 후, 해당 AssetBundle 이름이 리스트에 포함되어 보일 것이다. AssetBundle 이름은 항상 소문자로 만들어야 한다. 만약 이름에 대문자를 사용하면 소문자로 변경되어 보이게 될 것이다. AssetBundle 이름에 forward slash를 사용하면 폴더를 생성하게 되는데, 이 메뉴는 해당 그림에서 보이는 것처럼 하위 메뉴로 보이게 된다.


만약 당신이 asset을 할당하지 않은 AssetBundles를 가지고 있다면, "Remove Unused Names" 옵션을 사용할 수 있다. 이 메뉴는 빈 AssetBundle을 삭제한다.


한 asset에 귀속된 emta file은 자신이 속한 AssetBundle 이름을 포함한다.


AssetBundles export하기


AssetBundles은 스크립트 코드를 사용해 export된다. (이 코드는 4.x 버전과 유사하다.). 아래 스크립트는 AssetBundles를 export한다.


using UnityEditor;


public class CreateAssetBundles

{

    [MenuItem ("Assets/Build AssetBundles")]

    static void BuildAllAssetBundles ()

    {

        BuildPipeline.BuildAssetBundles ("AssetBundles");

    }

}


이 스크립트는 Assets 메뉴하단에 메뉴 아이템을 생성한다. 메뉴 아이템이 선택하면, 해당 기능이 호출되고 AssetBundles는 빌드된다. 이것은 progress bar를 가진 build dialog를 띄워줄 것이다. BuildPipeline.BuildAssetBundlessms함수는 "AssetBundles"라고 명명한 출력 폴더안에 해당 AssetBundles를 생성할 것이다. 이 폴더는 프로젝트 폴더안에 생성되어야만 한다. 해당 폴더안에 기존에 이름을 지어든 AssetBundles들의 이름의 폴더명안에 생성된다.


각 AssetBundle은 AssetBundle 메뉴 이름으로 만들어진 곳에 export 되어진다. 추가적으로, 각 AssetBundle은 .manifest 확장자를 가진 파일을 가지게된다. 이 manifest 파일은 텍스트 파일로, 어떤 텍스트 편집기로든 볼 수 있다. 이 파일은 파일 CRC와 asset 종속관계 등과 같은 정보를 포함하고 있다. 예제의 AssetBundle은 아래와 같은 내용으로 구성되어 있다.


ManifestFileVersion: 0

CRC: 2422268106

Hashes:

  AssetFileHash:

    serializedVersion: 2

    Hash: 8b6db55a2344f068cf8a9be0a662ba15

  TypeTreeHash:

    serializedVersion: 2

    Hash: 37ad974993dbaa77485dd2a0c38f347a

HashAppended: 0

ClassTypes:

- Class: 91

  Script: {instanceID: 0}

Assets:

  Asset_0: Assets/Mecanim/StateMachine.controller

Dependencies: {}


AssetBundle을 빌드하면 항상 두개의 파일이 생성되는데, AssetBundle과 manifest file이다. 이 두 파일은 AssetBundles을 생성할 때마다 항상 생성된다. 이 파일들은 AssetBundles이 생성되는 각각의 폴더안에 포함된다. 그런데 만약 당신이 같은 위치에 AssetBundles을 항상 생성한다면 단지 두개의 파일만을 얻을 수 있다. 추가된 manifest 파일(이 예에서는 AssetBundles.manifest파일이다.) 다른 manifest 파일들 처럼 같은 방식으로 사용되지만, AssetBundle들의 관계와 각각의 다른 의존성이 어떻게 되어 있는지에 대한 정보를 추가적으로 보여줄 것이다. 이 예에서는, 단 하나의 AssetBundle을 가지고 있으므로 , 의존 관계에 대한 정보는 없다. (* 같은 폴더에 생성한다는 건, 의존관계가 있는 것들을 예기하는건가?? 위의 메뉴에서의 설명처럼, 이름으로 의존관계를 우리가 설정할 수 있다는 이야기인 듯. 아직은 추측일 뿐..)


ManifestFileVersion: 0

AssetBundleManifest:

  AssetBundleInfos:

    Info_0:

      Name: scene1assetbundle

      Dependencies: {}




AssetBundle Editor Tools

 

AssetBundles의 이름 가져오기


아래 에디터 스크립트는 빌드과정에서 생성될 AssetBundles 이름을 출력해준다.


using UnityEditor;

using UnityEngine;


public class GetAssetBundleNames

{

    [MenuItem ("Assets/Get AssetBundle names")]

    static void GetNames ()

    {

        var names = AssetDatabase.GetAllAssetBundleNames();

        foreach (var name in names)

            Debug.Log ("AssetBundle: " + name);

    }

}


어떤 asset이 AssetBundle을 변경할 때 정보 획득하기


AssetPostprocessor class의 OnPostprocessAssetbundleNameChanged method를 사용하면 어떤 asset의 AssetBundle이 변경된 경우 callback을 통해 내용을 확인할 수 있다.


using UnityEngine;

using UnityEditor;


public class MyPostprocessor : AssetPostprocessor {


    void OnPostprocessAssetbundleNameChanged ( string path,

            string previous, string next) {

        Debug.Log("AB: " + path + " old: " + previous + " new: " + next);

    }

}


AssetBundle Variants


AssetBundle Variants는 5.x의 새 기능이다. 이것은 가상 에셋과 유사한 결과를 도출할 수 있도록 해준다. 예를들어, 당신이 “MyAssets.hd”과 “MyAssets.sd”과 같은 variants를 AssetBundle에 설정할 수 있다. 내부의 assets은 정확히 일치하게 만들어야 한다. 두 개의 변형된 AssetBundles안의 오브젝트들은 Unity 빌드 pipeline에 의해 보장된 정확히 일치하는 내부 ID들을 가지게 된다. 그래서 이 두개의 변형된 AssetBundles은 variant를 명시적으로 변경할 수 있다.



assetbundle variants 설정법 : 1. 에디터의 asset labels GUI 오른쪽 UI로, 확장 variant 이름을 설정할 수 있다. 2. AssetImporter.assetBundleVariant 옵션값을 사용해서 코드에서 설정할 수 있다. 


(이미지: AssetBundle variants)


........ 이하 내용은 "unity5에서의 신규 AssetBundle 빌드 시스템" 하단의 내용과 일치하니 참고할 것!














저작자 표시 비영리 동일 조건 변경 허락
신고