2015.07.07 10:31

(* 원문 : https://developers.google.com/analytics/devguides/collection/unity/v3/reference?hl=ko )

*역자주 : 원문을 그대로 변역하는게 아닌, 실무에 적용하면서 불필요하게 긴 내용은 빼고, 추가할 내용은 넣으면서 진행합니다. 번역이 아님을 알아주세요. ^^a


데이터를 보낼 때는 Basic 나 Builder method를 사용합니다. Builder method들은 보낼 정보들에 대한 수치, campaign 파라미터들을 추가하길 원할 때 사용됩니다. 


Dispatch Hits

네트웍 연결이 가능하다면 데이터를 전송한다.

public void DispatchHits();


Session Control

Session들은 스크린 뷰, 이벤트들 그리고 전사상거래 업무 등과 과 같은 의미있는 행동들을 포함한 유요한 커네이너들을 제공한다.


아래 메소드들은 강제로 세션을 시작하거나 종료할 수 있다.

// Start a new session.
public void StartSession();
// There should be no need to end a session explicitly. However, if you do
// need to indicate the end of session you can use the following method.
public void StopSession();

Screens


GA에서 Screens는 게임안에서 보이는 유저 컨텐츠를 대표한다. screen은 단일 문자열 필드로 구성되어 있으며, GA 리포트에서 screen name으로 구분되어진다.


basic 

public void LogScreen(string title);

Builder

public void LogScreen(AppViewHitBuilder builder);

Example

googleAnalytics.LogScreen("Main Menu");

//Builder Hit with all App View parameters (all parameters required):
googleAnalytics
.LogScreen(new AppViewHitBuilder()
   
.SetScreenName("Main Menu"));


Events

Events는 유저의 반응에 대한 데이터를 모으는데 유용한 방법이다. 네 개의 파라미터를 사용하며, 게임의 유저 반응을 묘사하는데 사용할 수 있다. 


Basic

public void LogEvent(string eventCategory,
   
string eventAction,
   
string eventLabel,
   
long value);

Builder

public void LogEvent(EventHitBuilder builder);

Example

googleAnalytics.LogEvent("Achievement", "Unlocked", "Slay 10 dragons", 5);

// Builder Hit with all Event parameters.
googleAnalytics
.LogEvent(new EventHitBuilder()
   
.SetEventCategory("Achievement")
   
.SetEventAction("Unlocked")
   
.SetEventLabel("Slay 10 dragons")
   
.SetEventValue(5));

// Builder Hit with minimum required Event parameters.
googleAnalytics
.LogEvent(new EventHitBuilder()
   
.SetEventCategory("Achievement")
   
.SetEventAction("Unlocked"));


Crashes & Exceptions

충돌과 예외에 대해 측정할 수 있다.


Basic

public void LogException(string exceptionDescription, bool isFatal);

Builder

public void LogException(ExceptionHitBuilder builder);

Example

googleAnalytics.LogException("Incorrect input exception", true);

// Builder Hit with all Exception parameters.
googleAnalytics
.LogException(new ExceptionHitBuilder()
   
.SetExceptionDescription("Incorrect input exception")
   
.SetFatal(true));

// Builder Hit with minimum required Exception parameters.
googleAnalytics
.LogException(new ExceptionHitBuilder());


User Timings

GA에서 시간의 간격을 측정하는 기본적인 방법을 제공한다. 예를들면, 리소스 로딩 시간을 측정하는데 유용할 수 있다.


Basic

public void LogTiming(string timingCategory,
   
long timingInterval,
   
string timingName,
   
string timingLabel);

Builder

public void LogTiming(TimingHitBuilder builder);

Example

googleAnalytics.LogTiming("Loading", 50L, "Main Menu", "First Load");

// Builder Hit with all Timing parameters.
googleAnalytics
.LogTiming(new TimingHitBuilder()
   
.SetTimingCategory("Loading")
   
.SetTimingInterval(50L)
   
.SetTimingName("Main Menu")
   
.SetTimingLabel("First load"));

// Builder Hit with minimum required Timing parameters.
googleAnalytics
.LogTiming(new TimingHitBuilder()
   
.SetTimingCategory("Loading"));

Social Interactions

컨텐츠 안에 내장된 여러 SNS, 추천 위젯 등에 대한 유저 반응을 측정할 수 있다.


Basic

public void LogSocial(string socialNetwork,
   
string socialAction,
   
string socialTarget);

Builder

public void LogSocial(SocialHitBuilder builder);

Example

googleAnalytics.LogSocial("twitter", "retweet", "twitter.com/googleanalytics/status/482210840234295296");

// Builder Hit with all Social parameters (all parameters required).
googleAnalytics
.LogSocial(new SocialHitBuilder()
   
.SetSocialNetwork("Twitter")
   
.SetSocialAction("Retweet")
   
.SetSocialTarget("twitter.com/googleanalytics/status/482210840234295296"));


E-Commerce

GA에 in-game 구매와 판매에 대한 정보를 전달한다.


* 참고 : 이 절차는 GA에서 "전자상거래 보고서"를 사용하기 위해 설정이 필요합니다. (https://support.google.com/analytics/answer/1009612?hl=ko#Enable)


Basic

public void LogTransaction(string transID,
   
string affiliation,
   
double revenue,
   
double tax,
   
double shipping);

public void LogTransaction(string transID,
   
string affiliation,
   
double revenue,
   
double tax,
   
double shipping,
   
string currencyCode);

Builder

public void LogTransaction(TransactionHitBuilder builder);

Example

googleAnalytics.LogTransaction("TRANS001", "Coin Store", 3.0, 0.0, 0.0);
googleAnalytics
.LogTransaction("TRANS001", "Coin Store", 3.0, 0.0, 0.0, "USD");

// Builder Hit with all Transaction parameters.
googleAnalytics
.LogTransaction(new TransactionHitBuilder()
   
.SetTransactionID("TRANS001")
   
.SetAffiliation("Coin Store")
   
.SetRevenue(3.0)
   
.SetTax(0)
   
.SetShipping(0.0)
   
.SetCurrencyCode("USD"));

// Builder Hit with minimum required Transaction parameters.
googleAnalytics
.LogTransaction(new TransactionHitBuilder()
   
.SetTransactionID("TRANS001")
   
.SetAffiliation("Coin Store"));


Items

Basic

public void LogItem(string transID,
   
string name,
   
string SKU,
   
string category,
   
double price,
   
long quantity);

public void LogItem(string transID,
   
string name,
   
string SKU,
   
string category,
   
double price,
   
long quantity,
   
string currencyCode);

Builder

public void LogItem(ItemHitBuilder builder);

Example

googleAnalytics.LogItem("TRANS001", "Sword", "SWORD1223", "Weapon", 3.0, 2);
googleAnalytics
.LogItem("TRANS001", "Sword", "SWORD1223", "Weapon", 3.0, 2, "USD");

// Builder Hit with all Item parameters.
googleAnalytics
.LogItem(new ItemHitBuilder()
   
.SetTransactionID("TRANS001")
   
.SetName("Sword")
   
.SetSKU("SWORD1223")
   
.SetCategory("Weapon")
   
.SetPrice(3.0)
   
.SetQuantity(2)
   
.SetCurrencyCode("USD"));

// Builder Hit with minimum required Item parameters.
googleAnalytics
.LogItem(new ItemHitBuilder()
   
.SetTransactionID("TRANS001")
   
.SetName("Sword")
   
.SetSKU("SWORD1223"));

Custom Dimensions & Metrics

Custom Dimemsions은 GA에서 hits, 유저들, 그리고 세션들을 가진 metadata의 묶음이다. Custom Metrics는 GA에서 당신 자신의 통계를 생성하고 증가시킬 수 있다.


사용전에 각각에 대해 생성과 설정이 필요하다. 설정 이후에는 Builder method를 통해 해당 부분으로 전송될 수 있다.


Builder

// Custom Dimension.
public T SetCustomDimension(int dimensionNumber, string value);
// Custom Metric.
public T SetCustomMetric(int metricNumber, string value);


Example

// Custom Dimension.
// An AppView hit example, but custom dimensions can be sent with all hit types.
googleAnalytics
.LogScreen(new AppViewHitBuilder()
   
.SetScreenName("Another screen")
   
.SetCustomDimension(1, "200"));

// Custom Metric.
// An Event hit example, but custom metrics can be sent with all hit types.
googleAnalytics
.LogEvent(new EventHitBuilder()
   
.SetEventCategory("Achievement")
   
.SetEventAction("Unlocked")
   
.SetEventLabel("Slay 10 dragons")
   
.SetEventValue(5)
   
.SetCustomMetric(3, "200"));

Campaigns

GA에서 Campaigns는 게임에서 유저가 활성화하는 campaigns와 통신 소스들의 속성을 활성화한다.

Campaign 파라미터들은 Builder method를 사용해 어떤 hit의 부분으로 보내질 수 있다.


Build

public T SetCampaignName(string campaignName);
public T SetCampaignSource(string campaignSource);
public T SetCampaignMedium(string campaignMedium);
public T SetCampaignKeyword(string campaignKeyword);
public T SetCampaignContent(string campaignContent);
public T SetCampaignID(string campaignID);

Example

googleAnalytics.LogTiming(new TimingHitBuilder()
   
.SetTimingCategory("Loading")
   
.SetTimingInterval(50L)
   
.SetTimingName("Main Menu")
   
.SetTimingLabel("First load")
   
.SetCampaignName("Summer Campaign")
   
.SetCampaignSource("google")
   
.SetCampaignMedium("cpc")
   
.SetCampaignKeyword("games")
   
.SetCampaignContent("Free power ups")
   
.SetCampaignId("Summer1"));

// Send campaign parameters with timing hit.
// Builder Hit with minimum required Campaign parameters.
googleAnalytics
.LogTiming(new TimingHitBuilder()
   
.SetTimingCategory("Loading")
   
.SetTimingInterval(50L)
   
.SetTimingName("Main Menu")
   
.SetTimingLabel("First load")
   
.SetCampaignSource("google");


Advanced

이 method는 오직 tracker concepts를 가진, GA의 파워유저가 사용하길 추천한다. 


SetOnTracker

다른 hits로 보내진 값을 추적하는 값을 세팅하는 것. (? 약간 이해가 안감. 테스트하면서 다시 봐야 할 듯.)

fieldName 파라미터를 위해 Assets/Plugins/Fields.cs 의 변수들을 사용해라. (예를들면,Fields.SCREEN_NAME 같은..)

public void SetOnTracker(Field fieldName, object value);

* 참고: 같은 값을 전달하면 중복됩니다.


Example

googleAnalytics.SetOnTracker(Fields.SCREEN_NAME, "Main Menu");


Dispose

관리중인 리소스들을 해제하고 tracker를 초기화 한다.


만약 dispose 이후에 어떤 tracking hit이 호출되면, 새로운 tracker가 생성된다. dispose는 실제로 모든 tracking이 완료된 이후에 호출할 것! 예를들면, 게임이 종료될 때.

public void Dispose();

Example

googleAnalytics.Dispose();


이상. 일단 기본 API 문서를 살펴보았다.


다음에는 Unity 테스트 프로젝트에 적용하고, 그 결과를 Google Analytics 보고서에서 보는 결과를 정리하겠다.


즐건 하루 ! 



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

아래 주소에서 package를 다운로드 할 수 있다. 이 글 작성일 기준으로 아직 베타임.


https://github.com/googleanalytics/google-analytics-plugin-for-unity?hl=ko



이를 사용하기 위한 정책이 있다.(변경 될 수 있으니 , https://developers.google.com/analytics/devguides/collection/unity/policy?hl=ko 를 꼭 읽어볼 것!)


1. 당연하지만, Google Analytics Account가 필요하다.


2. End User에서 당신이 Analytics로 전송하는 데이터에 대한 동의를 얻어야 하며, 유저에게 보낼지 말지를 선택할 수 있는 옵션을 제공해야 한다.


3. 이메일, Social Security Numbers(주민등록번호 같은), 기기를 구별할 수 있는 특별한 정보 등의 개인 혹은 장비를 식별 할 수 있는 중요한 정보를 업로드하면 안된다. 


4. 개인을 식별할 수 있는 어떤 정보를 넘긴다면, 당신의 계정은 삭제될 것이며, 업로드된 데이터 또한 잃어버리게 될 것이다.



설정하는 과정은 아래와 같다.


Android 용


1. 빌드 타겟을 Android로 한 후 build를 하면 Temp/StagingArea 디렉토리(당신이 빌드를 선택한 디렉토리 아래에 생성될 것이다.)에서 AndroidManifest.xml 파일을 복사해서 <YOUR PROJECT ROOT>/Assets/Plugins/Android/ 폴더에 복사하라. 


2. AndroidManifest.xml 파일, <application> tag 위에 아래의 permissions를 추가하라. (이 어플리케이션이 네트웍에 접속을 허용한다는 권한임.)

  <uses-permission android:name="android.permission.INTERNET"/>

  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>


3. Campaign Tracking을 활성화 하길 원한다면, 아래 서비스를 추가하라.

<service android:name="com.google.analytics.tracking.android.CampaignTrackingService" />
<receiver android:name="com.google.analytics.tracking.android.CampaignTrackingReceiver"
         
android:exported="true" >
 
<intent-filter>
   
<action android:name="com.android.vending.INSTALL_REFERRER" />
 
</intent-filter>
</receiver>

IOS 용


1. XCode 프로젝트에 아래 라이브러리들을 추가해라.

  AdSupport,framework

  CoreData,framework

  SystemConfiguration.framework

  libz.dylib

  libsqlite3.dylib


2. 만약 빌드할 때 자동으로 추가되길 원한다면 iOS Extras 디렉토리에서 PostProcessBuildPlayer_GA 파일을 복사하여, <YOUR PROJECT ROOT>/Assets/Editor 디렉토리에 넣어라.


3. mod_pbxproj.py 스크립트를 다운로드해서 Editor 디렉토리에 복사해라. 라이브러리들은 빌드할 때 자동으로 추가될 것이다.


* 참고 : libsqlite3.dylib는 Xcode에서 -ObjC 링커 플래그를 사용할 때만 필요하며 만약 그 플래그를 사용하지 않는다면 PostProcessBuildPlayer_GA 파일에서 삭제해도 괜찮다.



GAv3 prefab 설정하기


1. GAv3.prefab을 클릭하라. Project View,  Assets/Plugins/GoogleAnalyticsV3안에서 찾을 수 있다.
2. Inspector view에서는 여러 정보들의 리스트를 볼 수 있으며, 당신의 프로젝트에 알맞은 값으로 설정해야 한다.
3. Object Hierarchy에 삽입하라.

* 참고 : 모든 플렛폼에 같은 값은 사용할 수 있다. 

오브젝트 트랙하기

GAv3 prefab을 설정 한 후, 아래 스탭들을 따라가면 특정 오브젝트를 추적할 준비가 완료된다.

1. 추적할 오브젝트를 클릭하고 해당 객체의 스크립트를 편집하자. 없다면 Add Component 버튼으로 새로운 스크립트를 만들자.

2. 해당 클래스에 아래처럼 GoogleAnalyticsV3 오브젝트를 생성하자.
public GoogleAnalyticsV3 googleAnalytics;

3. 스크립트를 저장하고 Unity 윈도우로 돌아가자.


4. 추적하고 싶은 객체의 Inspector view를 보자. 이제 googleAnalytics라고 명명된 필드를 볼 수 있고, 이곳에 Object Hierarchy view에서 GAv3 객체를 찾아 드래그 하여 넣어주자.


5. 이제 해당 객체를 추적할 준비가 되었다. 다른 객체들도 추척할 내용이 있다면 위의 과정을 반복하여 설정하면 된다.



이제 본격적으로 API 페이지를 읽어봐야겠다. +_+ GOGO !!!





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

패치 모듈 만들다가 패치 모듈의 코루틴을 써야되는 상황일 때.. 


StartCoroutine은 non-static member function입니다. 


결론만 간단히 ... 


아래와 같이 활용하세요. 


// 활용 코드

Test test  = GameObject.Find("TestPrefab").GetComponent<Test>();

yield return test.StartCoroutine( test.startPatch());



   (in Test.cs)

// 샘플 Test class 선언 형태

public class Test : MonoBehaviour

{

public IEmumerator startPatch(){

   .

   .

   .

}

}


* TestPrefab을 만들어서 Test script 연결해 해당 씬에 등록하세요.




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

자주 안쓰는거니 이번에 확실히 정리하자.


준비물은 아래와 같다. 


- 안드로이드 OS가 설치된 디바이스.

- 유니티 5.0 이상 (개인/기업 버전 둘 다 가능)

- AP (PC와 모바일 디바이스가 같은 AP를 사용해야 서로 접근이 가능하다.)

  : 집에서는 보통 같은 공유기를 사용하기 때문에 문제없을 듯.

  : 보통 사무실에서는 보안등의 문제로 PC는 유선, 모바일은 별도의 무선을 사용할 듯. 

   이럴 경우 보통 2만원정도의 싼 공유기를 사면 AP로 사용 가능. 공유기 설정을 통해 AP로 변경하고, 모바일 디바이스의 wifi를 설정된 AP에 연결한다. 그러면 자동으로 할당하는 IP를 통해 이를 진행할 수 있다. 최근에는 일반적으로 디바이스 보안 정책이 있으므로 문제가 발생하면 관리자와 확인이 필요할 수 있음.

- logcat filter : http://cafe.naver.com/logcatfilter (디바이스에서 발생하는 로그를 볼 수 있는 뷰어. 개발자님에게 무한 감사. 덕분에 시간 많이 아꼈어요.!!)

- Android SDK의 sdk\platform-tools\adb.exe


아래와 같은 순서로 진행하면 된다.


1. adb 설정

    adb tcpip 8989 (포트는 원하는 번호로 변경 가능)

    adb connect 192.168.100.8:8989 (위에 적은 포트를 뒤에 사용. 192.168.100.8은 여러분의 모바일 디바이스에 할당된 IP로 변경하면 됨.)

   이렇게 하면 연결되었다는 메세지를 볼 수 있는데, 문제가 발생할 경우

   adb kill-server, adb start-server  두 명령어를 통해 재가동을 해보고 다시 시도해 보면 됨.

   (안 될 경우 에러메세지를 보고 추가 조정을 하세요.)


2. logcat filter 설정.

   가동 후 상단 디바이스 탬의 192.168.100.8:8989를 선택.

   시작 버튼을 누른 후 text 필더에 자신이 보고 싶은 로그에 포함된 텍스트를 입력하면 됨. 가능하면 로그를 남길 때 종류별로 검색/구분을 위한 텍스트를 삽입해 두는게 좋다.


3. monodevelop 세팅

   run 메뉴 -> Attach to .. 선택 -> 192.168.100.8:8989 선택. 

   (* 어플을 가동하기 전에는 192.168.100.8:8989는 보이지 않는다. 가동과 함께 시작되는 부분에 대한 코드 검증은 쉽지 않을 듯. 로그를 통해 검토하는 것을 추천.)

   (* 코루틴은 시작과 끝에만 브레이크가 걸림. 정상적으로 볼 수 있는 방법을 아시는 분은 댓글 부탁드립니다)







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

Unity5 발표 이후 공개된 여러 AssetBundle 관련 문서를 번역하다가 지금까지 알게된 주요 변경 사항들을 정리해봤습니다. 


처음 만져본 unity 버전이 5.0입니다. 현재 패치툴을 만들면서 보고 있어, 아직 발견하지 못하거나 이해가 낮아 잘못알고 있는 내용들이 발견되더라도 양해 바라면 댓글 달아주시면 수정/추가하겠습니다.

1. 5.0에서는 각 Asset (코드 파일 제외)별로 AssetBundle Name과 variant를 지정할 수 있다. 
   (Asset 미리보기 창의 하단에 설정 UI가 있습니다.)

2. name은 해당 Asset이 속할 AssetBundle의 이름이며, 설정 UI에서 선택하거나 새롭게 생성할 수 있습니다. 
   이 과정은 5.0 이전 버전에서는 수동으로 설정을 해야 했기 때문에 상당히 번거로웠으며, 이 작업을 편리하게 도와줄 수 있는 bundle mnager 같은 에셋이 발매되어 있습니다. (* 최근 5.0 버전에 맞게 개선된 버전이 나왔더군요.)

3. variant는 AssetBundle의 이름에 연결된 옵션이며, unity 공식 데모에서는 앱 실행 중 실시간으로 텍스쳐의 퀄리티를 변경할 수 있는 예로 사용되었습니다. 
 (* http://files.unity3d.com/vincent/assetbundle-demo/users_assetbundle-demo.zip를 참고하세요.)

4. 이전 버전에서는 변경되지 않은 Asset들도 모두 빌드되어 패치를 작성하는데 많은 어려움이 있었다고 합니다. (전 첫 unity 버전이 5.0이라 이전 경험자 분들의 이야기를 들어본 바에 의해서 적습니다.) 5.0 버전에서는 변경된 에셋들만 추려서 빌드됩니다. 

5. AssetBundle 이름을 검색하는 기능이 추가되었습니다. 검색 UI에 "b:"를 입력 후 원하는 에셋번들 이름을 넣으면 해당 이름을 가진 모든 에셋을 볼 수 있습니다.

6. 유니티가 직접 종속 관계를 관리하며, 이는 기존에 사용하던 PushAssetDependencies/PopAssetDependcies API를 사용할 필요가 없습니다. (* 공개된 원문에 있던 내용인데, 이전 버전을 사용해보지 않아 와닫진 않네요. ^^;)

이상입니다. 이 외 typetree, 이전 버전과의 혼용 등에 대한 내용들이 있었는데 추후 내용이 파악되면 추가하겠습니다. ^^a


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

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

Asset Bundle 작업 흐름의 강화

Asset Bundles는 꽤 많은 시간을 필요로 하는 기능이었다. 하지만 Unity 5.0이후부터는 에디터에서 번들을 생성하기 위한 간략한 시스템이 제공된다. 프로젝트 뷰에서 어떤 에셋을 선택하면, asset 미리보기 아래 Asset Bundle 메뉴를 볼 수 있다.


(이미지 원본 사이트 참조)


이 메뉴는 해당 에셋을 지정한 이름의 Asset Bundle에 연결해주는 기능이다. ( 메뉴에서 새로운 이름을 추가할 수 있으며, 혹은 해당 프로젝트에서 이전에 생성한 이름을 선택할 수 있다.) 여기에서는 번들이 존재하지 않으며, 해당 프로젝트에 이를 위한 아이콘도 없다. 해당 이름은 간단하게 명명했으며, 해당 에셋은 함께 모여있다. 번들이 최종 빌드된 후. 만약 당신이 에셋들의 폴더를 만들었다면 그 번들의 폴더 안에 있는 모든 컨텐츠를 추가하도록 , (for it in order??) 해당 에셋을 위해 번들이름을 선택할 수 있다.


원하는 번들 이름들로 원하는 모든 에셋을 추가했다면, 해당 번들들을 빌드하는 스크립트를 통해 에디터 API를 사용할 필요가 있다. BuildPipeline.BuildAssetBundles 함수는 해당 번들 파일들을 빌드할 때 어떤 이름으로 빌드를할 것인지를 지정하여 사용할 수 있다. 이 함수를 호출하는 스크립트는 아래처럼 간단하다.

@MenuItem("Test/Build Asset Bundles")
static function BuildABs() {
    // Put the bundles in a folder called "ABs" within the
    // Assets folder.
    BuildPipeline.BuildAssetBundles("Assets/ABs");
}


성공적으로 빌드가 된 후, 목적지 폴더에는 에디터에서 지정했던 이름을 가진 번들 파일들이 생성되어 있을 것이다.각 번들을 위해, manifest 파일 또한 같이 생성될 것이다. 이 파일은 텍스트 형태의 파일이며, 번들의 컨테츠들에 대한 상세한 정보들이 포함되어 있다.


해당 파라미터(* 위 코드에 “Assets/ABs”를 말한다.)는 빌드된 번들들이 저장될 프로젝트 폴더 하위에 존재해야 한다. 하지만 해당 빌드를 어떻게 실행할지에 대해서는 옵션 설정을 통해 적절히 조정하여 사용할 수 있다. 추가 정보들은 BuildPipeline.BuildAssetBundles 을 참고하라. 주의할 점은 asset buidles 빌드를 위한 BuildPipeline 클래스안에 있는 오래된 함수들은 아직 사용 가능하지만, BuildAssetBundles 하는 것 같은 에디터의 에셋 번들 메뉴를 사용하여 만드는 것은 불가능하다.

저작자 표시 비영리 동일 조건 변경 허락
신고
2015.03.20 16:46
Edit

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

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

AssetBundles

AssetBundles은 당신이 만들고 있는 어플리케이션의 에셋들을 가지고 잇는 Unity로부터 추출된 파일들입니다. 이 파일들은 압축된 포멧형태로 사용되며, 당신의 어플리케이션에서 로딩할 수 있습니다. 컨텐츠 안의 모델들, 텍스쳐들, 오디오 클립들, 심지어 전체 씬들 같은 것들도 실시간으로 로딩하거나 처리될 수 있습니다. AssetBundles은 당신의 어플리케이션에 컨텐츠를 간편하게 다운로딩할 수 있게 설계되어 있습니다. AssetBundles은 파일 확장자에 의해 결정되는, 유니티에 의해 구성된 어떤 종류의 에셋이라도 포함할 수 있습니다. 만약 당신이 자체 제작한 바이너리 데이타를 가진 파일들을 포함시키길 원한다면 ".bytes”라는 확장자로 만들어서 포함시킬 수 있습니다. Unity는 TestAssets으로 해당 파일들을 import합니다.


AssetBundles로 작업할 때의 일반적인 흐름은 아래와 같습니다.


개발할 때, 개발자들은 AssetBundles을 준비하고 이를 서버에 업로드 합니다.


(이미지 - 각 에셋을 에셋 번들에 넣고 이를 서버에 업데이트 하는 이미지)


1. AssetBundles 빌드하기. 에셋 번들들은 당신의 씬에 포함된 여러 에셋을 에디터를 통해 생성되어집니다. 해당 에셋 번들 제작 과정은 Building AssetBundles를 위한 섹션에서 상세히 설명되어 있습니다.


2. 외부 저장소에 AssetBundles 올리기. 이 단계는 유니티 에디터 혹은 어떤 다른 유니티 채널들에 포함되지는 않습니다. 하지만 이 과정은 꼭 필요합니다. 당신은 FTP Client(* 혹은 다른 수단을 이용하여)를 사용하여 당신이 서비스할 서버에 제작된 에셋 번들들을 업로드 할 수 있습니다.

실행시, 유저의 기기에서, 해당 어플리케이션은 필요할 때 AssetBundles을 로딩하며, 필요에 의해 각 에셋 번들과 개별 에셋들이 작동될 것입니다.


(이미지 - 서버에서 AssetBundle을 받고 다시 Asset의 형태로 이어지는 이미지)


1. 당신의 어플리케이션에서 실시간으로 AssetBundles 다운받기. 이는 Unity Scene안의 스크립트를 통해 가능합니다. 그리고 에셋 번들들은 필요할 때 서버에서 로딩하여 사용됩니다. 더 자세한 사항은 Downloading Asset Bundles를 참고하세요.


2. 에셋번들에서 오브젝트 로딩하기. 에셋번들을 다운로드된 후, 해당 번들에서 필요한 에셋들에 접근할 수 있습니다. Loading Resources from AssetBundles에서 상세히 다뤄집니다.

저작자 표시 비영리 동일 조건 변경 허락
신고
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 빌드 시스템" 하단의 내용과 일치하니 참고할 것!














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

(* 퇴고없이 바로 올리는 글입니다. 나중에 데모 진행하면서 스샷과 같이 올리며, 퇴고할 예정입니다.)


신규 에셋빌드 시스템에서 할 수 있는 것을 보여주는 에셋번들5.0 데모


Unity 5.0 beta21 이상의 버전에서 이 데모를 실행해 주세요.


상세설명:

1. TestScenes 폴더 아래에는 3개의 씬이 있다.

1. AssetLoader.unity 에셋 번들로부터 일반적인 에셋을 로딩하는 방법을 볼 수 있습니다. LoadAssets.cs 스크립트를 참고하세요. 

2. SceneLoader.unity는 에셋번들로부터 씬을 로딩하는 방법을 볼 수 있습니다. LoadScenes.cs 스크립트를 참고하세요.

3. VariantLoader.unity는 variant 에셋번들을 로드하는 방법을 볼 수 있습니다. LoadVariants.cs 스크립트를 참고하세요.

가상 에셋들로부터 같은 결과를 얻을 수 있는 AssetBundle variants를 사용합니다. 이 데모에서, 빌드를 합니다.

1. "variant/myassets.hd" AssetBundle 안에 "My Assets HD" 폴더

2. "variant/myassets.sd" AssetBundle 안에 "My Assets SD" 폴더

3. variant AssetBundle에 실제로 종속된 "variants/variant-scene.unity3d" AssetBundle 안에 "variant-scene.unity"

이 폴더들이 정확히 일치하도록 에셋을 만들어야 합니다. 

두개의 다른 AssetBundle안의 그 오브젝트들은  유니티 빌드 pipeline에 의해 인증된 같은 내부 ID들을 가지게 될 겁니다. 그래서 다른 variant 확장명들의 AssetBundles와 임의로 변경이 가능합니다.

이 demo에서는 ㅜㅇ리가 variants라고 부르는 hd와 sd라는 파일 확장명을 사용합니다. 당신은 LoadVariants.cs에서 variant를 변경할 수 있습니다. 

또한 활성화된 variant로 문제없이 AssetBundle을 어떻게 풀어보는지를 보려면 AssetBundleManager.RemapVariantName()를 참고하세요. 

주의 : AssetBundle variant는 Editor simulation에서 정상적으로 확인이 불가능합니다. 



2. 자동으로 종속된 AssetBundles을 다운로드합니다.

새로운 빌드 시스템하에서는, 단일 manifest AssetBundle안에서 종속관계가 있는 AssetBundles간에는 연결이 되어 있습니다. 그래서 실행 시, 모든 종속관계를 알 수 있으며, 기반 url을 통해 자동으로 종속된 AssetBundles를 다운받습니다.

더 상세한 내용은 demo의 AssetBundleManager.LoadDependencies()를 확인해 보세요.


3. AssetBundles 메뉴에는 3개의 메뉴 아이템이 있습니다. 

1. "Simulate AssetBundles"는 에디터에서 AssetBundle simulation을 컨트롤 하는데 사용합니다.

데이터 플레이 모드에서, 빌드없이, AssetBundles을 simulate 할 수 있습니다.

2. "Build AssetBundles"는 BuildPipeline.BuildAssetBundles()를 호출하면 되는데, AssetBundle UI를 설정해서 AssetBundles를 빌드합니다. 상세한 내용은 BuildScript.BuildAssetBundles()를 참고하세요.

3. "Build Player"는 지정한 폴더에 빌드된 AssetBundles를 "Application.streamingAssetsPath"에 복사합니다. BuildScript.BuildPlayer()를 참고하세요.


4. AssetBundleManager 클래스는 AssetBundle과 그에 종속된 것들을 로딩된 내용들을 가지고 있습니다. 이런 내용들이 포함되어 있습니다.

1. Initialize()

AssetBundle manifest object를 초기화 합니다.

2. LoadAssetAsync()

명시된 AssetBundle로부터 명시된 asset과 종속 관계의 모든 핸들을  로드합니다.

3. LoadLevelAsync()

명시된 AssetBundle로부터 명시된 scene와 종속 관계의 모든 핸들을 로드합니다. 

4. LoadDependencies()

명시된 AssetBundle을 위해 종속관계의 모든 AssetBundles을 로드합니다.

5. BaseDownloadingURL

의존 관계에 있는 것들의 자동 다운로딩을 위해 사용되는 base downloading url을 설정합니다.

6. SimulateAssetBundleInEditor

에디터 플레이 모드에서 사용될 AssetBundle을 설정합니다.

7. Variants

활성화할 variant를 설정합니다.

8. RemapVariantName()

활성화된 variant에 따라 올바른 AssetBundle을 풀어냅니다.(?)


5. Assets\ScriptsForAssetBundleSystem folder 아래의 스크립트들은 당신의 프로젝트에 쓸만할 겁니다. 당신의 프로젝트에 자유롭게 사용하시기 바랍니다.


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

참고용으로 퇴고는 하지 않았습니다. 아직 unity 초보라 잘 모르는 내용들이 포함되어 있기에, 다른 튜토리얼 보면서 차근 차근 할 예정입니다.


(* 원본 : http://forum.unity3d.com/threads/new-assetbundle-build-system-in-unity-5-0.293975/)


Unity 5.0에서의 새로운 AssetBundle


Basic Introduction


신규 AssetBundle build 시스템에서는 아래와 같은 것들이 제공된다.


1. AssetBundle에서 assets을 mark 할 수 있는 간편한 UI, 그리고 asset database에 AssetBundle을 매핑하는 것을 그 assets에 유지한다.

 : asset preview panel의 하단에서 UI를 찾을 수 있으며, 사용법은 간단한다.

 : AssetBundle 이름은 meta file에 저장된다.

 : 또한 검색 바에서 검색필터를 제공한다. AssetBundle에 기록했던 이름을 검색할 때 "b:"를 같이 입력하면 찾을 수 있다.

  : 몇가지 제한 사항이 있다.

    > 여러 AssetBundle에 하나의 asset mark를 허용하지 말 것!

> AssetBundle 이름으로만 relative path(?)를 설정할 수 있음.

> AssetBundle 에 scripts를 mark 할 수 없음

> scene aset을 mark할 수 없으며 같은 AssetBundle안에 normal asset(?)을 mark 할 수 없음


2. AssetBundle에 asset을 mark 하는 API

 : AssetBundle 이름을 설정할 때 AssetImporter.assetBundleName 을 사용한다.

 

3. AssetBundle을 빌드에는 BuildPipeline.BuildAssetBundles() 같은 간편한 API들이 있다. 이 API들은 상당히 간편하며, 몇가지의 정보만이 필요하다.

 : 모든 AssetBundle들을 위한 output path (*역자주 : 단일 패스를 써야하는 듯.)

 : BuildAssetBundleOptions이 있는데 아래에서 상세히 설명하겠다.

 : 이전과 같은 BuildTarget

 : 또한 AssetBundle들에 asset들로부터 하나의 맵을 포함하고 있는 AssetBundleBuild의 배열을 제공하는 overloaded version(?)을 가진다.

 

4. asset database 안에 AssetBundle 이름을 컨트롤 하는 API들

 : AssetDatabase.GetAllAssetBundleNames() : asset database안의 모든 AssetBundle 이름들을 돌려준다.

 : AssetDatabase.GetAssetPathsFromAssetBundle : 전달한 AssetBundle안에  있는 asset paths marked 를 돌려준다.

 : AssetDatabase.RemoveAssetBundleName() : asset database안에서, 전달한 AssetBundle 이름을 삭제한다.

 : AssetDatabase.GetUnusedAssetBundleNames() : 사용되지 않는 AssetBundle 이름을 돌려준다.

 : AssetDatabase.RemoveUnusedAssetBundleNames() : asset database안의 사용되지 않는 모든 AssetBundle 이름들을 삭제한다.

 : AssetPostProcessor.OnPostprocessAssetbundleNameChanged : callback함수. user가 어떤 asset의 AssetBundle 이름을 변경하면 호출된다.

 

5. BuildAssetBundleOptions

 : CollectDependencies 와  DeterministicAssetBundle 은 항상 enable되어야 한다.

 : CompleteAssets 은 무시한다.(ingored로 되어 있는데, ignored의 typo인 듯) 우리는 항상 objects보다 assets을 우선시하여 시작하기 때문이며, 이건 무조건 기본이라고 봐야 한다.

 : ForceRebuildAssetBundle가 추가되었다. assets들에 어떤 변화가 없다고 하더라도, 이 플래그를 세팅하여 AssetBundle들을 강제로 다시 빌드할 수 있다.

 : IngoreTypeTreeChanges가 추가되었다. type tree가 변경되었더라도, 이 플레그를 설정하면, type tree의 변경을 무시할 수 있다. (IngoreTyp .. 이것도 IgnoreTypeTreeChanges인 듯.)

 : DisableWriteTypeTree 는 IngoreTypeTreeChanges와 대치되는 옵션인데, 만약 type tree를 비활성화 하면, type tree의 변화를 무시할 수 없다. (? 이 옵션을 활성화 하면, 위 옵션을 true로 설정할 수 없다는 말인가?) 

 

6. Manifest file. 모든 AssetBundle를 위해 아래 정보가 포함된 manifest file을 생성한다.

 : manifest file은 AssetBundle 다음에 생성한다.

 : CRC

 : Asset file hash. 증분 빌드 체크를 위해 사용된, 이 AssetBundle안에 포함된 모든 assets을 위한 단일 hash.

 : type tree hash.  증분 빌드 체크를 위해 사용된, 이 AssetBundle안에 포함된 모든 types을 위한 단일 hash.

 : Class types. 이 AssetBundle에 포함된 모든 class types. 이것들은 type tree 증분 빌드 체크를 진행할 때 새로운 단일 hash를 얻기위해 사용된다.

 : Asset names. 이 AssetBundle에 명시적으로 포함된 모든 assets.

 : 연관된 AssetBundle names. 이 AssetBundle이 의존하는 모든 AssetBundles.

 : 이 manifest file은 runtime에서는 필요없고, 오직 증분빌드를 위해서만 사용된다.

 

7. 단일 manifest file. 모든 AssetBundles과 그 AssetBundle이 의존하는 모든 것들을 포함하는 단일 manifest file을 생성한다.

 

8. 단일 manifest AssetBundle. 이것은 단지 아래 API들을 가지고 있는 AssetBundleManifest object를 가진다. 

 : GetAllAssetBundles(). 해당 빌드안의 모든 AssetBundle 이름을 돌려준다.

 : GetDirectDependencies(). 직접적인 의존관계가 잇는 AssetBundle 이름들을 돌려준다.

 : GetAllDependencies(). 의존관계에 있는 모든 AssetBundle 이름들을 돌려준다.

 : GetAssetBundleHash(string). 명시한 AssetBundle을 위한 해쉬값을 돌려준다.

 : GetAllAssetBundlesWithVariant(). variant를 가진 모든 AssetBundle들을 돌려준다.

 

9. AssetBundle loading APIs가 변경되었다.

 : AssetBundle.GetAllAssetNames(). 해당 AssetBundle안에 모든 asset 이름들을 돌려준다.

 : AssetBundle.GetAllScenePaths(). 만약 stream 방식의 scene AssetBundle이라면 모든 scene asset paths를 돌려준다.

 : AssetBundle.LoadAsset(). AssetBundle로부터 asset을 로드한다.

 : AssetBundle.LoadAllAssets(). (*역자주 : loadallassets이 있다면 loadasset은 일부만 로딩하나? 인자도 없는데 뭘 기준으로??)

 : AssetBundle.LoadAssetWithSubAssets()

 : 비동기 버전도 제공됨.

 : 더 이상 component type이 리턴되지 않을거다. 처음에 게임 오브젝트를 로드한 후 오브젝트의 component를 살펴보길 바란다.

  

10. Typetree 기본적으로 AssetBundle에 기록된다. Metro는 예외인데, 이건 다른 병렬화 솔루션을 가지기 때문이다. (typetree가 뭔지 모르니, 뭔소린지 정확히 이해가 안되네 --)


아래는 새로운 AssetBundle 빌드 시스템을 어떻게 사용하는지에 대한 기본 사용법이다. 


1. 더 이상 복잡한 빌드 스크립트는 필요없다.


2. Unity 종속성을 관린한다.

 : 이것은 유니티가 모든 종속관계를 알고 있고, 사용자 대신해서 조정할 것이기에 PushAssetDependencies/PopAssetDependencies 함수들을 사용할 때 종속관계를 더 이상 조정할 필요가 없다는 의미다. 요건 니 노동시간을 더 줄여줄거야.


3. 증분 빌드 체크는 실제 변경된 AssetBundle를 rebuild 하는데만 필요하다는 의미다. 이건 두개의 parts를 포함하는데..

 : asset file 변화를 위한 증분 빌드 체크. 해당 AssetBundle에서 모든 assets을 위한 단일 hash를 만들다. AssetBundle안에 assets이 변경되었을 때만 변경되며, rebuild된다.

 : type tree 변화를 위한 증분 빌드 체크. AssetBundle안의 type trees를 위해 단일 hash를 생성하며, 기본적으로 변경되었을 때만 rebuild한다. 하지만 IgnoreTypeTreeChanges flag를 세팅하면 tyoe tree 변경을 무시할 수 있다.

 

4. 종속관계에 있는 모든 AssetBundle을 강제로 rebuild 하지마라.

 : 종속관계의 오브젝트를 저장하는 방법을 변경했다. 이는 당신이 종속관계에 있는 모든 AssetBundle들을 rebuild하지 않지 않아도 되게 해준다.

 : 샘플을 살펴보라. 여기에 어떤 텍스쳐를 포함하는 하나의 매터리얼을 가진 cube prefab이 있다. 만악 CubeAssetBundle안에 cube prefab을 mark하고 MaterialAssetBundle안에 매터리얼이 markgkaus, 해당 material의 texture가 변한다. 이전 빌드 시스템에서는, 종속된 오브젝트들을 리빌드 해야 했기에,  CubeAssetBundle 와 MaterialAssetBundle 모두를 rebuild 해야만 했었다. 하지만 새로운 빌드 시스템에서는 단지 CubeAssetBundle을 다시 빌드할 필요없이 MaterialAssetBundle만 리빌드 하면 된다.

 

덧붙임 : 한동안 구 빌드 시스템과 신 빌드 시스템은 공존할거야. 절대 이 두가지를 동시에 사용하지 않도록 해야한다.


AssetBundle Variant


이것에 대해 약간, 설명을 하겠다. Unity 5.0b21부터, 새로운 빌드 시스템에 AssetBundle variant를 지원하는 기능이 있는데, 가상의 assets으로 같은 결과를 만들도록 할 수 있다.


예를들어, “MyAssets.hd”, “MyAssets.sd” (이 두 개의 AssetBundles안에 assets이 정확히 일치함.)와 같은 variant들로 AssetBundle을 만들 수 있다. 이 두개의 variant AssetBundles안에 오브젝트들은 Unity 빌드 pipeline에 의해 보장된, 정확히 일치하는 내부 IDs을 가질 것이다. 그래서 이 두개의 variant AssetBundles는 실행 중 다른 variant extension의 AssetBundles을  독단적인 변경할 수 있다.


AssetBundle variant를 어떻게 세팅하냐면..

1. Unity 5.0 b21의 AssetBundle 이름 UI곁의 UI를 사용해서, 해당 AssetBundle의 다른 이름을 세팅하여 또 다른 UI를 추가한다.

2. AssetImporter.assetBundleVariant. UI 외에, 스크립트를 통해 AssetBundle variant를 설정 할 수 있다.


전체 AssetBundle 이름은 AssetBundle 이름과 variant 이름을 조합하여 생성된다. 예를들어, 만약 어떤 변경된 AssetBundle로 "MyAssets.hd”를 추가하길 원한다면, 당신은 "MyAssets"이라는 AssetBundle이름을 설정하고 AssetBundle variant에 "hd"를 설정해야 한다. 그럼 최종적으로 AssetBundle은 "MyAssets.hd”라는 이름을 가지게 된다.


하지만, 만약 "MyAssets.hd”처럼 AssetBundle 이름을 설정하면, 그땐 variant AssetBundle이 아닌 그냥 일반적인 AssetBundle이 된다. 그리고 이후에는 “MyAssets”+“hd” 와  “MyAssets.hd”+””는 같은 전체 AssetBundle이름을 사용할 수 없기 때문에 공존할 수 없게 된다.


덧붙임 : Editor simulation에서는 호환되지 않는다.


Demo


AssetBundle 시스템의 사용한 시연용으로 새로운 빌드 시스템에 기초한, 데모를 만들었다. 아래 링크에서 해당 데모를 다운 받을 수 있으며, 접속할 수 없으면 unity에 문의 메일 보내라. 그리고 이 데모를 실행하기 위해서는 Unity 5.0 b21이 있어야 해.


http://files.unity3d.com/vincent/assetbundle-demo/users_assetbundle-demo.zip


이 데모에서는 아래 내용을 볼 수 있다.


1. 새로운 빌드 시스템에서 AssetBundles를 빌드 하는 방법

2. 단일 manifest AssetBundle를 사용하는 방법

3. 자동화된 AssetBundle 종속성의 해결책, 로딩 과 언로딩

4. Editor simulation. 이거 활성화 하면, 실제로 빌드하지 않고도 Editor 실행모드에서 AssetBundles를 사용할 수 있다.

5. 모든 AssetBundles를 다운받을 수 있는 장소 옵션 세팅

6. Build pipeline build integration. AssetBundles를 빌드하는 스크립트를 StreamingAssets 폴더에 복사하면, 당신이 플레이어를 빌드할 대 플레이어 데이타 안에 같이 묶어질 수 있다. 플레이어 데이타를 빌드할 때 “AssetBundles/Build Player” 를 사용하길 바란다.

7. WWW.LoadFromCacheOrDownload 신 버전이 제공되며, 다운될 때 128 bit hash를 제공한다. 단일 manifest AssetBundle로부터 해당 hash를 얻을 수 있다.

8. 가상 assets으로 같은 결과를 제공하는 AssetBundle variant (Editor simulation에서는 호환되지 않음.)


좀 더 상세한 정보를 얻으려면 demo 프로젝트의 README 파일을 참고하길 바란다. 


   

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