AssetBundle 로드

5721 단어

AssetBundle.LoadFromMemoryAsync

AssetBundleCreateRequest LoadFromMemoryAsync(byte[] binary, uint crc = 0);
  • 바이너리 데이터를 사용하여 ab 대상을 비동기적으로 불러옵니다. 보통 ab를 암호화한 후 로컬 복호화에 다운로드한 후 복호화된 바이너리 데이터를 전송하여 ab 대상을 얻습니다.
  • LZMA가 압축한 AB라면 불러오는 과정에서 압력을 풀 수 있다.LZ4에서 압축된 AB인 경우 압축 상태의 데이터가 직접 로드됩니다.
  • 동기화 인터페이스 LoadFromMemory가 ab 대상을 즉시 되돌려주는 것과 달리 LoadFromMemory Async는 백엔드 라인에서 압축 해제 작업을 수행합니다.
  • IEnumerator LoadFromMemoryAsync(string path)
    {
    
        AssetBundleCreateRequest createRequest = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path));
    
        yield return createRequest;
    
        AssetBundle bundle = createRequest.assetBundle;
    
        var prefab = bundle.LoadAsset.("MyObject");
        Instantiate(prefab);
    
    }
    

    AssetBundle.LoadFromFile

    AssetBundle LoadFromFile(string path, uint crc = 0, ulong offset = 0); 
    
  • 비압축(uncompressed)이나 LZ4로 압축된 AB를 로컬에서 로드하면 효율이 높습니다.
  • LZMA 압축된 AB를 로드할 때 먼저 압축을 풀고 메모리를 로드합니다.
  • Unity 5.3과 이전 버전에서는 안드로이드 플랫폼에서 이 인터페이스를 호출하여Streaming Assets 디렉터리의 ab를 불러오는 데 실패할 것입니다. 왜냐하면 안드로이드에서 이 디렉터리는 하나이기 때문입니다.jar의 압축 파일입니다.하지만 유닛 5.4 및 이후 버전에서는 이 문제를 복구하여 정상적으로 사용할 수 있습니다.
  • var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "myassetBundle"));
    if (myLoadedAssetBundle == null) {
        Debug.Log("Failed to load AssetBundle!");
        return;
    }
    var prefab = myLoadedAssetBundle.LoadAsset.("MyObject");
    Instantiate(prefab);
    

    WWW.LoadFromCacheOrDownload

    WWW LoadFromCacheOrDownload(string url, int version);
    
  • 이 인터페이스를 사용하는 것을 추천하지 않습니다. www 대상을 사용하여 ab 대상을 저장하면 메모리 비용이 너무 많이 들고 WebStreaming 문제가 발생할 수 있기 때문입니다.
  • 로컬 캐시에서 ab를 가져오고 최신 버전이 없거나 없으면 원격으로 다운로드합니다.ab가 압축된 경우, 라인에서 ab를 풀고 로컬 캐시에 기록합니다.ab 압축 해제가 완료되고 캐시된 후의 마운트 프로세스는 Asset Bundle와 같습니다.LoadFromFile은 동일합니다.
  • version 사용법??
  • IEnumerator Start()
    {
        while (!Caching.ready)
            yield return null;
    
        var www = WWW.LoadFromCacheOrDownload("http://myserver.com/myassetBundle.unity3d", 5);
        yield return www;
        if (!string.IsNullOrEmpty(www.error))
        {
            Debug.Log(www.error);
            yield return null;
        }
        var myLoadedAssetBundle = www.assetBundle;
    
        var asset = myLoadedAssetBundle.mainAsset;
    }
    

    ab 캐시는 Caching 클래스에서 관리되며, Caching은 ab 백업과 스크롤을 할 수 있습니다.
    https://docs.unity3d.com/ScriptReference/Caching.html
    www의 성능 문제 때문에 이 인터페이스를 사용할 때 주의해야 할 것은 다음과 같습니다.
  • 단일 ab는 너무 크면 안 되며, 일반적으로 1M 이상 권장하지 않음
  • 모바일 플랫폼에서 같은 시간에 최대 ab를 다운로드하여 메모리 고조를 피한다
  • 기타:
  • 로컬 캐시에 충분한 공간이 없으면 가장 오랫동안 접근하지 않은 자원을 삭제합니다.삭제할 자원을 찾지 못하면 캐시 프로세스를 건너뛰고 파일을 내용에 직접 불러옵니다. 프로세스는 'new WWW ()' 와 같습니다.
  • 이 방법으로만 AB에 접근할 수 있으며 다른 유형의 자원에는 적용되지 않습니다.
  • url의 '%' 는 반드시 절약해야 합니다.

  • UnityWebRequest

    UnityWebRequest UnityWebRequest.GetAssetBundle(string uri, uint crc);
    
    AssetBundle DownloadHandlerAssetBundle.GetContent(Networking.UnityWebRequest www);
    
  • 가장 추천하는 방법은 www의 방식으로 AB를 불러오는 것을 대체하여 웹stream 메모리 점용 문제를 줄이는 것이다
  • 먼저 UnityWebRequest를 사용합니다.GetAssetBundle 다운로드
  • 다시 DownloadHandler Asset Bundle.GetContent(UnityWebRequest) AB 객체 가져오기
  • IEnumerator InstantiateObject()
    {
        string uri = "file:///" + Application.dataPath + "/AssetBundles/" + assetBundleName;        
        UnityEngine.Networking.UnityWebRequest request = UnityEngine.Networking.UnityWebRequest.GetAssetBundle(uri, 0);
        yield return request.Send();
        AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
        GameObject cube = bundle.LoadAsset("Cube");
        GameObject sprite = bundle.LoadAsset("Sprite");
        Instantiate(cube);
        Instantiate(sprite);
    }
    

    LoadAsset

  • T objectFromBundle = bundleObject를 동시에 로드합니다.LoadAsset(assetName);
  • GameObject gameObject = loadedAssetBundle.LoadAsset(assetName);
    
    Unity.Object[] objectArray = loadedAssetBundle.LoadAllAssets();
    
  • 비동기식 로드
  • AssetBundleRequest request = loadedAssetBundleObject.LoadAssetAsync(assetName);
    yield return request;
    var loadedAsset = request.asset;
    
    AssetBundleRequest request = loadedAssetBundle.LoadAllAssetsAsync();
    yield return request;
    var loadedAssets = request.allAssets;
    

    Load Manifests

  • AB루트 디렉터리에 Manifest의 AB 파일이 있는데 일반 AB를 불러오는 것과 같다
  • 의존관계, 해시값, AB변체 등을 저장
  • AssetBundle assetBundle = AssetBundle.LoadFromFile(manifestFilePath);
    AssetBundleManifest manifest = assetBundle.LoadAsset("AssetBundleManifest");
    
  • AB를 불러오기 전에 의존도를 불러와야 한다
  • AssetBundle assetBundle = AssetBundle.LoadFromFile(manifestFilePath);
    AssetBundleManifest manifest = assetBundle.LoadAsset("AssetBundleManifest");
    string[] dependencies = manifest.GetAllDependencies("assetBundle"); //Pass the name of the bundle you want the dependencies for.
    foreach(string dependency in dependencies)
    {
        AssetBundle.LoadFromFile(Path.Combine(assetBundlePath, dependency));
    }
    

    기타

  • 같은 AB는 한 번만 불러올 수 있습니다. 그렇지 않으면 오류가 발생합니다. 이미 불러왔음을 알립니다
  • 동일한 AB는 Unload 이후에만 다시 불러올 수 있음
  • https://docs.unity3d.com/Manual/AssetBundles-Native.html

    좋은 웹페이지 즐겨찾기