• AssetBundle


    1.使用AB包的原因

    (1)减小资源大小

    (2)方便更新资源

    2.AB使用流程

    (1)制定资源的AB属性

    (2)构建AB包

    (3)上传AB包

    (4)加载AB包和包里面的资源

    实际操作步骤:

    (1)取名

    (2)编辑器扩展,方便打包

    using UnityEditor;
    using System.IO;
    
    public class CreateAB
    {
    
        [MenuItem("Assets/Build AB")]
        static void BuildAllAB()
        {
            string dir = "AssetBundles";
            if (Directory.Exists(dir) == false)
            {
                Directory.CreateDirectory(dir);
            }
            BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
        }
    }
    View Code

    (3)点击Build AB,打包成AB包

    在文件夹中可看到打包后的资源

    BuildAssetBundleOptions的几个重要属性:

    (1)None:使用LZMA算法,对资源整体打包。体积小,加载时间长。

    (2)ChunkBasedCompression:使用LZ4算法,对资源分块打包,体积较小,加载时间较短.

    (3)UncompressedAssetBundle:不打包,体积较大,加载时间短。

     manifest文件

    两个重要属性:

    (1)Assets:资源路径

    (2)Dependencies:依赖

    在场景中创建材质并取名为red,材质包名为red.unity3d,创建cube作为预制体,资源包名为cube.unity3d。

    添加如下脚本加载资源:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Text : MonoBehaviour {
    
        void Start () {
            AssetBundle ab1 = AssetBundle.LoadFromFile("AssetsBundles/red.unity.3d");
            AssetBundle ab = AssetBundle.LoadFromFile("AssetsBundles/cube.unity.3d");
            GameObject cube = ab.LoadAsset<GameObject>("Cube");
            Instantiate(cube);
            
        }
    }
    View Code

    AssetBundle的几个重要加载方式:

    (1)AssetBundle.LoadFromMemoryAsync

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

    public class Text : MonoBehaviour {

        IEnumerator Start () {
            string path="AssetBundles/red.unity3d";
            AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path));
            yield return request; 
         AssetBundle bundle = createRequest.assetBundle
            //使用里面的资源
         GameObject wallPrefab = bundle .LoadAsset<GameObject>("CubeWall");
            Instantiate(wallPrefab)

        }
    }

    (2)AssetBundle.LoadFromFile

            //第二种加载AB的方式 LoadFromFile
            AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(path);
            yield return request;
            AssetBundle ab = request.assetBundle;
            //使用里面的资源
         GameObject wallPrefab = ab.LoadAsset<GameObject>("CubeWall");
            Instantiate(wallPrefab)
     

    (3)WWW.LoadFromCacheOrDownload

            //第三种加载AB的方式 WWW
            while (Caching.ready == false)
            {
                yield return null;
            }
            file://  file:///
            WWW www = WWW.LoadFromCacheOrDownload(@"file:/E:Unity Project WorkspaceAssetBundleProjectAssetBundlescubewall.unity3d", 1);
            WWW www = WWW.LoadFromCacheOrDownload(@"http://localhost/AssetBundles/cubewall.unity3d", 1);
            yield return www;
            if (string.IsNullOrEmpty(www.error) == false)
            {
                Debug.Log(www.error); yield break;
            }
            AssetBundle ab = www.assetBundle;
            //使用里面的资源
         GameObject wallPrefab = ab.LoadAsset<GameObject>("CubeWall");
            Instantiate(wallPrefab)
    
    

    (4)UnityWebRequest

    //第四种方式 使用UnityWebRequest
            //string uri = @"file:///E:Unity Project WorkspaceAssetBundleProjectAssetBundlescubewall.unity3d";
            string uri = @"http://localhost/AssetBundles/cubewall.unity3d";
            UnityWebRequest request = UnityWebRequest.GetAssetBundle(uri);
            yield return request.Send();
            //AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);
            AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;
            //使用里面的资源
            GameObject wallPrefab = ab.LoadAsset<GameObject>("CubeWall");
            Instantiate(wallPrefab)

    AssetBundle资源卸载:

     (1)AssetBundle.Unload(true:)卸载所有资源,即使有资源被使用着。适用于:

      1。在关切切换、场景切换

      2。资源没被用的时候
    (2)AssetBundle.Unload(false):卸载所有没用被使用的资源
        个别资源怎么卸载:

      1。通过 Resources.UnloadUnusedAssets.    

      2。场景切换的时候

  • 相关阅读:
    struts开发步骤
    线程同步及同步变量
    pthread_detach pthread_join pthread_create
    NSThread
    Java线程中run和start方法的区别
    java的守护线程与非守护线程
    多线程的多重属性
    Java Observer 观察者
    Java_观察者模式(Observable和Observer)
    任务、进程和线程
  • 原文地址:https://www.cnblogs.com/shirln/p/9266529.html
Copyright © 2020-2023  润新知