블로그 이미지
Every unexpected event is a path to learning for you.

카테고리

분류 전체보기 (2106)
Unity3D (470)
Programming (453)
Unreal (2)
Gamebryo (56)
Tip & Tech (162)
협업 (26)
3DS Max (3)
Game (12)
Utility (101)
Etc (88)
Link (29)
Portfolio (18)
Subject (90)
iPhone (30)
Android (2)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (1)
Memories (16)
Interest (36)
Thinking (34)
한글 (23)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (16)
Exercise (3)
나만의 맛집 (2)
냥이 (7)
육아 (2)
Total1,099,602
Today111
Yesterday326
Statistics Graph

달력

« » 2017.10
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

공지사항

태그목록

Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

5.2 이후 바뀐 에셋번들을 처음 접해봤는데 이전보다는 심플해져서 사용하긴 쉬운 것 같다.


근데 서버에서 외부(앱 내 저장 가능한 공간 : Application.persistentDataPath 사용)에 다운로드를 받고 로드 할 때 삽질한 내용을 간단하게 올려 놓는다.


지금은 바빠서..


간단하게 올리고 나중에 퇴고를 해야겠다..



[삽질_1]

- PC에서는 잘되는데 Android에서 Application.persistentDataPath로만 접근 하는데,

  Write 할 때 Path가 mnt로 시작하는 외부 저장소 Path로 저장 됨.

  AssetBundle을 로드 하기 위해 Read 하려고 접근하니 Stroage로 시작하는 내부 저장소 Path를 줌.

[처리_1]

- 우선 강제로 내부 저장소만 사용하도록 프로젝트 셋팅에서 변경

   (Project Settings-Android-Configuration-Write Permission 을 Internal로 변경)



[삽질_2]

- 빈번하게 에셋번들 로컬 로드 시, 무한루프에 빠짐

[처리_2]

- 처리하기 편하려고 BundleName과 AssetName을 같게 했는데 유니티가 헷갈려하면서 뭔가 문제가 생기는 것 같아서

  BundleName 셋팅에 확장자를 추가(인스펙터에서 셋팅)하니 잘 됨.



[삽질_3]

- 제대로 다하고 올린 것 같은데 이전에 잘 로드 되던 파일이 에러가 나서 당황함.


[처리_3]

- 파일질라로 에셋번들 파일을 업로드 할 때 Binary로 올리지 않으면 문제가 생긴다고 함.

  파일질라 셋팅을 수정하고 다시 업로드 해서 해결

  (전송-전송 유형-바이너리 로 변경)

- [참조] http://blueasa.tistory.com/2110

  


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

댓글을 달아 주세요


[링크] http://unitylist.com/r/6js/unity-5-assert-bundle

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

댓글을 달아 주세요


[링크] https://github.com/kimsama/Unity5-AssetBundleSetting

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

'Unity3D > AssetBundle' 카테고리의 다른 글

[펌] 에셋번들 생성하기 & 다운로드  (0) 2017.04.12
[링크] 에셋번들 로딩 방식 4가지  (0) 2017.03.03
[링크] Unity5-AssetBundleSetting  (0) 2016.07.25
WWW.LoadFromCacheOrDownload  (0) 2015.04.23
AssetBundle 가이드  (0) 2015.01.26
AssetBundle 버전체크 방식..  (0) 2014.04.21
Posted by blueasa

댓글을 달아 주세요

1. AssetBundle 란? 및 필요성

 - 어플리케이션의 Runtime 시 외부에서 Resource(Asset)를 가져올 수 있도록 해주는 Unity3D 고유의 기능

 - 패키지지향 게임과 서비스지향 게임(업데이트)

 - Web 기반과 Smart phone 기반에서의 분할 다운로드
   * 아이폰 앱스토어나 안드로이드 마켓에서 파일이 일정 크기 이상이면 3g로 다운로드가 허용되지 않으며 wi-fi 로 다운 받게 끔 되어 있음.
     여기서 wi-fi 모드로 다운 받게 끔 제한시 다운로드 횟수가 현저히 저하되는 경우 발생 (컨텐츠의 접근성에 심각한 문제가 발생)
     -> 초기 실행 파일을 작게하고 게임 내에서 다운로드 받는 기법 사용하여 해결, 이 경우 AssetBundle 을 사용하여 해결 가능

 

2. Native 구현 vs AssetBundle
  >>  AssetBundle는 Unity3D(Pro만!)에서 제공하는 런타임에 리소스를 가지고 오는 기술을 말하는데

        C#  등으로 직접 구현하는 것과 무슨 차이점이 있고 또, 어떤 특징이 있는가?

 - 모든 플랫폼에서 일관적인 방법으로 이용 가능 (Flash 빌드 제외!)
   * 웹플랫폼으로 만들경우 Sandbox 보안 정책이 적용 - 로컬에서 파일을 읽기는 가능하지만 저장하지 못함.
   * 다른 플랫폼에서는 가능 (stand-alone, ios, android) 
   * AssetBundle을 사용하면 웹플랫폼 빌드 일 때 로컬에 cache로 저장하는 방법이 사용 가능함

     (웹플레이어가 AssetBundle의 cache를 생성 해줌)

참고)  Flash 일경우에는 AssetBundle 및 WWW 클래스 사용 불가능, 웹서버를 사용하는 등의 우회적인 방법만 가능한 것으로 보임

 

 - Unity3D Editor에서 제공하는 Asset pipeline을 Runtime에 이용할 수 있는 유일한 수단
   * AssetBundle을 써야하는 가장 중요한 이유,  
   * 유니티는 에디터하고 플레이어하고 분리가 되어 있는 데 어셋을 불러와서 실제로 사용할 수 있게 가공해주는 건 에디터 밖에 못해줌
      >> 에디터에는 어셋을 임포트 해 주는 기능 하는 임포터가 존재함.
      >> 실제 유니티 프로젝트에서 보는 에셋들은 실제 데이타가 아니라 한번 가공한 데이타 (임포터 할때 마다 유니티 폴더 안 Library 내에 가공한 데이타가 들어감)
      >> 런타임 중에는 메쉬(fbx 파일) 등을 임포트 할 수 없다. 임포트를 하려면 임포터를 거쳐야하는데 임포터는 에디터 밖에 존재 하지 않음.
      >> 유니티는 네이티브한 데이타를 사용하는 데 상당히 제한적인 면이 있다. (예외적으로 텍스처(제약많음), 텍스트에셋 등은 임포터를 거치지 않고 사용할 수 있지만 
           그 외 기타 매터리얼, 게임 오브젝트, 메쉬 등의 오브젝트들은 임포터를 거쳐야 한다.)
      >> 어셋 번들에 에디터 내 임포터를 통해 가공된 데이타를 저장하여 런타임시 해당 어셋 번들을 사용할 수 있다.

 - Push, Pop의 개념을 이용한 AssetBundle끼리의 의존관계 설정 가능
   * 두개 모델이 같이 사용하는 텍스처를 모델과 따로 어셋번들로 뽑아서 두개 모델이 해당 텍스처를 같이 사용하는 식으로 사용 가능.

 - Memory관리 용도로 사용 가능

 - Caching과 Version관리기능 제공
   * 로컬에 캐싱해서 매번 다운로드를 방지. 또한 캐싱시 버전을 부여하여 관리 가능 (이것을 이용하면 온라인 게임의 Patch시스템 구현 가능)

 - WWW class를 이용한 비동기 다운로드가 가능

참고) 유니티 코리아 사이트 공식 문서 AssetBundle -> http://unitykoreawiki.com/index.php?n=KrMain.AssetBundles

3. AssetBundle의 이용 방법

  - 로드

    * WWW.WWW()   http://unity3d.com/support/documentation/ScriptReference/WWW.WWW.html -  가장 일반적인 사용방법
    * AssetBundle.CreateFromMemory()
       >> 메모리 부터 어셋 번들을 생성, binary data 를 읽어와서 메모리를 올려놓고 어셋 번들을 생성하는 기능. 암호화 등의 특수한 처리가 필요할 때 유용
       
    * WWW.LoadFromCacheOrDownload()


 - Asset 얻기

    * AssetBundle.Contains() : 특정 어셋이 있는지 확인
    * AssetBundle.Load() : 실제 어셋을 가져오는 것
    * AssetBundle.LoadAsync() : 어셋을 비동기로 가지고 옴


 - 메모리에서 제거

    * AssetBundle.Unload(bool unloadAllLoadedObjects)
      >> true : 강제로 모두 내려버림. 어셋간 링크가 깨짐. false : 사용하지 않는 것만 추려서 메모리에서 내림 ( GC.Collect()를 먼저 호출해주면 더 안정적으로 동작 )

 

4.  AssetBundle의 생성 방법
    >> BuildPipeline를 이용하여 에디터 상에서만 생성 가능    

 - BuildPipeline.BuildAssetBundle() : 어셋을 어셋번들로 만들 때 일반적으로 사용 

Scene 를 어셋 번들로 생성할 수 있는 방법 
 - BuildPipeline.BuildStreamedSceneAssetBundle() 

 - BuildPipeline.BuildPlayer()

참고)  BuildPipeline.BuildStreamedSceneAssetBundle() 와 BuildPipeline.BuildPlayer() 차이점 이란 ??


 

참고할 만한 예제 소개

 - AssetBundle

 - Caharacter customization

 - Bundle loader

 - Bundle Sync


5. Caching을 이용한 버전과 메모리 관리

 - WWW.LoadFromCacheOrDownload()

 - Cache의 저장 경로

  * Windows7 : C:\Users\사용자이름\AppData\LocalLow\Unity\WebPlayer\Cache

  * Mac : 미확인

  * iOS : Document

  * Android : 미확인

 - Caching class를 이용하여 cache를 관리 Non Cache와 Cache 사용할 때의 메모리 사용방식의 차이가 생김 (Resource 클래스를 사용하는 경우와 유사)

 - Cache는 최대 4GB 까지 사용 가능. Caching class를 사용하여 조절
 - 웹빌드 일 경우 캐슁 라이센스에 영향을 받음 (다른 플렛폼에서는 별도의 캐슁 라이센스 없음)

 - WebPlayer/Cache/Shared 폴더의 사용 용량이 50MB로 제한되며 제한을 해제하기 위해서는 추가적인 라이센스 구매를 해야 함 (경험상 50MB제한이 제대로 동작 안하는 듯 함)

   ( 참고 : http://www.unity3dkorea.com/board/index.php?db=knowhow&no=118&mari_mode=view@view )

 

6. AssetBundle과 MonoScript의 관계

 - Unity3D에서 사용하는 C# 및JavaScript는 다른 일반적인 script언어처럼 인터프리터가 아닌 컴파일 언어이다. (컴파일 언어는 Runtime에 코드를 추가하기가 어려움)

 - 일반적인 경우

 - Assembly의 저장 (DLL?)

 - Lua script의 활용한다면?

 

7. 주의사항

 - AssetBundle.Load() 을 사용할 때 딸꾹질(랙)이 발생함

 - 용량이 큰 다수의 AssetBundle을 로드할 경우 Crash 발생율 큼

 - Web 빌드에서는 Caching.CleanCache() 가 작동 안함

 - Static Mesh를 사용하는 Scene을 Export하면 용량이 크게 증가함

 - Platform에 따라 별도로 제작되야 함

 - Unity3D의 버전에 지나치게 의존적

 - 내용물에 대한 보안기능을 제공 안함

 - 기본적으로 MonoScript의 컴파일 코드는 저장 못함


8. Effective AssetBundle

 - 다운로드를 Queue형태로 관리

 - Cache를 사용해서 Memory사용량을 관리

 - AssetBundle의 구성내용을 저장 및 관리

 - Platform 별로 자동 생성 기능의 필요

 - 보안을 위한 별도의 처리


출처 : https://www.assembla.com/spaces/a-h/wiki/AssetBundle_%EA%B0%80%EC%9D%B4%EB%93%9C/history

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

'Unity3D > AssetBundle' 카테고리의 다른 글

[링크] Unity5-AssetBundleSetting  (0) 2016.07.25
WWW.LoadFromCacheOrDownload  (0) 2015.04.23
AssetBundle 가이드  (0) 2015.01.26
AssetBundle 버전체크 방식..  (0) 2014.04.21
Unity AssetBundle Dependencies  (0) 2014.03.11
AssetBundle 생성부터 패치 및 적용까지.  (0) 2014.02.27
Posted by blueasa

댓글을 달아 주세요

static bool BuildAssetBundle(Object mainAsset, Object[] assets, string pathName, uint crcBuildAssetBundleOptionsassetBundleOptions = BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets,BuildTarget targetPlatform = BuildTarget.WebPlayer);

 이 함수를 사용해서 애셋번들을 생성하면 crc값을 얻을 수 있는데요 애셋번들에 포함되어있는 애셋들의 변경 사항이 있는 경우에 저 값이 변하더라고요. 이전에 만든 번들과 crc값이 다르면 수정된거라고 보고 패치를 진행하는 방식으로 구현했습니다.



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

댓글을 달아 주세요

Unity AssetBundle Dependencies

In the last few weeks I’ve spent quite a lot of time with Unity’s Asset Bundle system. Understanding how dependencies were tracked. What determines GC cleanup of assets and understanding why the editor profiler produces particular results has been a bit of a struggle. I’m lucky enough to work for a group that allows me to have access to the Unity source code however so this has probably been slightly less painful than it has been for others going down this same path.

First, I’d like to acknowledge what appears to be the most useful piece of Unity Answers information that I’ve come across, located here. This seems to explain the general mechanics of how to include dependencies using the push and then pop method in an editor script.

For my purposes, I created a test project that contained several prefabs all containing simple GUI elements. These elements all used the same fonts and referenced the same textures. This was to verify that, in the editor profiler and in instruments, assets were in fact being shared.

I’ve included my example editor script below to demonstrate some of the methods I used for packing the bundles. In my case, I am traversing all assets in my prefab folder and treating elements with the word “Global” in their name as shared. If I were to have many dependency bundles instead of the one that I have in this example I would have to sort the order in which I am packing these bundles.

using UnityEngine;
using UnityEditor;

using System.IO;
using System.Collections.Generic;

public class AssetBundleBuild : MonoBehaviour
{
    [MenuItem("AssetBundle/Build Bundles")]
    private static void BuildBundles()
    {
        DirectoryInfo directory = new DirectoryInfo(Application.dataPath + "/Prefabs");
        FileInfo[] files = directory.GetFiles("*.prefab", SearchOption.AllDirectories);

        bool shouldPush;

        BuildPipeline.PushAssetDependencies();
        foreach (FileInfo f in files)
        {
            shouldPush = !f.Name.Contains("Global");
            if (shouldPush)
            {
                BuildPipeline.PushAssetDependencies();
            }

            // Get each asset path
            string path = Application.dataPath + "/Bundles/" + f.Name.Substring(0, f.Name.LastIndexOf(".")) + ".bundle";
            string assetPath = f.FullName.Substring(f.FullName.IndexOf("Assets", f.FullName.Length - f.FullName.IndexOf("Assets")));

            Object asset = AssetDatabase.LoadMainAssetAtPath(assetPath);
            //Debug.Log("Asset to pack " + asset + " , " + asset.name);

            BuildAssetBundleOptions options = 
                BuildAssetBundleOptions.DisableWriteTypeTree | 
                BuildAssetBundleOptions.CollectDependencies | 
                BuildAssetBundleOptions.CompleteAssets | 
                BuildAssetBundleOptions.DeterministicAssetBundle;

            if (!shouldPush)
            {
                Object[] d = EditorUtility.CollectDependencies(new Object[] { asset });

                List<Object> dSource = new List<Object>();
                List<string> dNames = new List<string>();

                // In this case I'm attempting to manually collect dependencies for tracking purposes
                // however this does not always seem to be necessary unless you have complex prefab heirarchies
                foreach (Object o in d)
                {
                    if (o != null && !dSource.Contains(o))
                    {
                        Debug.Log(" -- d " + o + " , " + o.name + " , " + o.GetType());

                        dSource.Add(o);
                        dNames.Add(o.name);
                    }
                }

                Debug.Log("::BUILDING DEPENDENCY BUNDLE:: " + asset.name + " , " + dSource.Count);
                BuildPipeline.BuildAssetBundleExplicitAssetNames(
                    dSource.ToArray(), 
                    dNames.ToArray(), 
                    path, 
                    options, 
                    EditorUserBuildSettings.activeBuildTarget);
            }
            else
            {
                Debug.Log("::NON DEPENDENCY:: " + asset.name);
                BuildPipeline.BuildAssetBundleExplicitAssetNames(
                    new Object[] { asset }, 
                    new string[] { asset.name }, 
                    path, 
                    options, 
                    EditorUserBuildSettings.activeBuildTarget);

                if (shouldPush)
                {
                    BuildPipeline.PopAssetDependencies();
                }
            }
        }

        BuildPipeline.PopAssetDependencies();

        Debug.Log("[AssetBundleBuild] Complete.");
    }
}

Now, from the standpoint of packing shared dependencies, this seemed to work with most asset types such as textures or prefabs but when I included fonts, while they wouldn’t be duplicated across multiple bundles, I would always see two copies of my fonts. One set would be flagged as being ‘used by scripts and native code’ and the other would only be flagged as ‘used by native code’. After performing numerous tests, I discovered that upon opening the dependency bundle containing the font I was interested in, if there was a copy of the font in the project directory as well, both versions would be loaded into Resources. I haven’t been able to verify whether this happens on device as well but my inclination is that it only occurs in the editor.

The Problem of the Decompression Buffer

Another problem that became visible when working with large quantities of bundles that (based off of conversations with Unity technical representatives and the 4.2.0b3 beta client) may have changed in such a way as to render the problem less dire is that Unity, as of 4.1.5, allocates an 8mb decompression buffer per each asset bundle being opened. If there is an attempt to parallelize these requests, each request will allocate it’s own decompression buffer. This can be rather disconcerting as one can see how the allocation amount (especially on restricted memory devices) can really get a guy down.

Although 4.2.0b3 seems to be reducing the decompression buffer size down to 0.5mb per bundle the problem of parallelization still persists. The only immediate solution for individuals loading any quantity of bundles seems to be amortizing the requests in such a way as to prevent too much overlap. If someone out there has a suggestion to mitigate this problem otherwise please drop me a line mcelroy.jon[at]gmail.com


출처 : http://blog.jonmcelroy.com/post/55526714506/unity-assetbundle-dependencies

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

댓글을 달아 주세요

KGC AssetBundle

2013.09.26
10:30 ~ 11:30


Asset: 유니티에서 게임을 만들떄 필요한 모든 컨텐츠 
AssetBundle? Asset들을 하나로 묶는 기능 
압축 파일 포멧 

LZMA Algorithm 사용 

어셋번들의 중요성 
빌드 사이즈를 줄일수 있다.
게임 패치 (CDN과 같은 서버에 올려놓고 다운받는 형식)
더 낳은 퍼포먼스 (캐시 기능)


Caching이란?
CDN -> Local Disk <-> Unity

캐싱폴더 위치는?

모바일 / PC / 콘솔 : 4기가 캐싱사용가능
웹 : 50MB (캐싱 라이센스) 

캐싱폴더가 다 찬다면?
어셋번들이 사용된 시간을 기준으로 가장 최근에 사용되지 않은 어셋번들 부터 삭제 (Least Rencently Used algorithm )

만약 하드디스크가 꽉 차거나 모든 캐쉬가 사용중이라면?
어셋번들을 캐싱하지 않고 메모리에 올림 (like new WWW())

유니티 버전 호환성과 사이즈 DisableWriteTypeTree

ASsetBundle메모리 

Distory -> UnloadUnuseAssets사용 (런타임시 반복호출시 힉헙 상태 발생 가능성 있음)

프로파일러 사용 권장 


어셋번들의 암호화 
  • Open SSL을 이용해서 어셋번들을 암호화 
  • 암호화된 어셋번들을 텍스트로 변환
  • 전달 방법을 선택 
    • Application포함 
    • 서버에서 다운로드
  • 암호화된 어셋번들을 메모리에서 복호화 (with System.Security.Encrypt)

>>>> Binary 파일 변환과정을 거쳐 암호화를 시킬수 있다.

PC/웹 : 하위 호환성 유지 

안드로이드 / iOS : 호환 할수 있도록 계획 중
Q. 어셋번들과 유니티 버전에서 문제점 (새로 만들어야 한다. 소수점 2째자리 업데이트는 호환 가능 )


어셋사이즈와 해싱된 사이즈가 다른 이유?
어셋번들이 캐싱폴더에 저장될때는 Uncompressed상태에서 자장 ( 압축 풀린 상태 ) -> 보다 빠른 로딩이 가능 


캐싱 용량을 줄이고 싶을때 
Caching.maximumAvailableDiskSpace 사용 

캐싱을 삭제 하고 싶을때(캐싱폴더 전체가 삭제 됨) / 특정 번들을 삭제 하는 방법은 없다. (내년에 추가될 예정)
Caching.CleanCache


"어셋번들을 쪼갤수록 좋다"


Q. CRC알고리즘 ?
Q. 스크립트 포함되어 있는 오브젝트를 어셋번들 공유시 스크립트 동기화 문제



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

댓글을 달아 주세요

링크 : http://unitystudy.net/bbs/board.php?bo_table=newwriting&wr_id=357&sca=&sfl=wr_subject&stx=%EC%97%90%EC%85%8B&sop=and

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

댓글을 달아 주세요

링크 : AssetBundle 생성부터 패치 및 적용까지. 0 - 관련 링크들 정리


링크 : AssetBundle 생성부터 패치 및 적용까지. 1 - Build AssetBundle


링크 : AssetBundle 생성부터 패치 및 적용까지. 2 - CoRoutine 활용에서 AssetBundle Patch하기



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

댓글을 달아 주세요


Link : http://ceolimdevelop.blogspot.kr/2013/11/unity.html



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

댓글을 달아 주세요