Unity AssetBundle 的简单使用

AssetBundle本质就是一种资源管理的技术。
AssetBundle是一个压缩包。 它包含模型、贴图、预制体(Prefab)、音频等
资源,可以在游戏运行期被加载。
AssetBundle自身保存着互相的依赖关系。

创建AssetBundle:
 1: 首先定位需要打包与加载的资源,资源可以
是任意类型(如:贴图、材质、音频、预设等)。
在Assets下点击资源,属性窗口下方中可以看
到资源预览。 在AssetBundle后面输入需要打包
的“AssetBundle名称”。
2: 现在编写打包脚本(BuildAssetBundle.cs),在编写前首先确认脚本定
义在“Editor”的特殊文件夹下。
3: 打包核心API:
 BuildPipeline.BuildAssetBundles(“AB输出路
径”,BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);
4: 编写脚本,在Unity编辑器顶部菜单会出现自定义的AB菜单。点击菜单
后开始打包,大约几秒后在项目视图的StreamingAssets目录下我们可以看
到打好包的文件资源

 

//把资源打成ab包

//脚本定义在“Editor”的特殊文件夹下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;   //引入Unity编辑器,命名空间
using System.IO;     //引入的C#IO,命名空间

public class BuildAssetBundle {

    /// <summary>
    /// 打包生成所有的AssetBundles(包)
    /// </summary>
    [MenuItem("AssetBundleTools/BuildAllAssetBundles")]
    public static void BuildAllAB()
    {
        //打包AB输出路径
        string strABOutPathDIR = string.Empty;

        //获取"StreamingAssets"数值
        strABOutPathDIR = Application.streamingAssetsPath;
        //判断生成输出目录文件夹
        if (!Directory.Exists(strABOutPathDIR))
        {
            Directory.CreateDirectory(strABOutPathDIR);
        }
        //  对需要打包的资源,在资源预览窗口, 在AssetBundle后面输入需要打包 的“AssetBundle名称”,调用打包函数 就会打包
        //打包生成                                                                   //BuildTarget 打包到的目标平台
        BuildPipeline.BuildAssetBundles(strABOutPathDIR,BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);
    }


}

 

把ab包的资源加载到场景


// AssetBundle基本加载
//             分为两种:
//            1: 加载非“对象预设”方式。(例如: 贴图、材质、音频...)
//            2:  加载“对象预设”(*.Prefab) 方式。
//采用www方式  下载assetBundle(下载的AssetBundle文件不会存入Unity引擎的缓存区)

//三种不同的方法来加载已经下载的数据资源:
//assetBundle.LoadAsset();  通过指定assetBundle包名称加载资源。
//assetBundle.LoadAssetAsync(); 异步加载模式。加载过程不会同时阻碍主线程的运行,
//     这特别适合需要读取大尺寸资源,以及一次性读取多个资源的场合。
//assetBundle.LoadAllAssets(); 加载assetBundle中包含的所有资源对象。

//Unity打包的时候会自动处理依赖关系,并生成一个*.manifest文件,这个文件描述
//  了assetbundle包大小、CRC验证、包之间的依赖关系等。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

namespace DemoSpace
{
	public class AssetBundleLoadDemo : MonoBehaviour 
	{
        //测试对象,改变贴图
        public GameObject goCubeChangeTextur;

        //定义URL与资源名称
        private string _URL1;
        private string _AssetName1;


        //测试对象,显示方位
        public Transform TraShowPos;

        private string _URL0;  //只加载AB包URL路径
        private string _URL2;
        private string _AssetName2;

        private void Awake()
        {
            //AB 包下载地址
            _URL1 = "file://" + Application.streamingAssetsPath + "/textures1"; //textures1 包的名称
            (AB包内部)资源名称
            _AssetName1 = "unitychan_tile6";

            //只加载“素材AB包”
            _URL0= "file://" + Application.streamingAssetsPath + "/texture1";  //texture1 包的名称
            //AB 包下载地址
            _URL2 = "file://" + Application.streamingAssetsPath + "/prefabs1"; //prefabs1 包的名称
            //(AB包内部)资源名称
            _AssetName2 = "FloorCube.prefab";
        }

        void Start () {

            //测试加载“非GameObject”资源  (加载非预设)
            StartCoroutine(LoadNonObjectFromAB(_URL1, goCubeChangeTextur, _AssetName1));

            //测试加载“非GameObject”资源   
            //预设打成ab包,预设的 材质也 打成ab包,   AB预设包 对  材质AB包 有依赖
            // 所以要先加载“材质AB包”,后加载 预设包 
            //要是单独打包预设 ,就不用先加载“材质AB包”
            StartCoroutine(LoadFromAB(_URL0));//先加载“材质”AB包
            StartCoroutine(LoadPrefabsFromAB(_URL2, _AssetName2, TraShowPos));//再加载AB预设包,且提取资源。
        }

        /// <summary>
        /// 加载“非GameObject”资源  (非预设)
        /// </summary>
        /// <param name="ABURL">AB包URL</param>
        /// <param name="goShowObj">操作且显示的对象</param>
        /// <param name="assetName">加载资源的名称</param>
        /// <returns></returns>
        IEnumerator LoadNonObjectFromAB(string ABURL, GameObject goShowObj, string assetName)        
        {
            //参数检查
            if(string.IsNullOrEmpty(ABURL) || goShowObj==null)
            {
                Debug.LogError(GetType()+ "/LoadNonObjectFromAB()/输入的参数不合法,请检查");
            }

            using (WWW www=new WWW(ABURL))
            {
                yield return www;
                AssetBundle ab = www.assetBundle;
                if (ab != null)
                {
                    if (assetName=="")
                    {
                        goShowObj.GetComponent<Renderer>().material.mainTexture = (Texture)ab.mainAsset;
                    }
                    else {
                        goShowObj.GetComponent<Renderer>().material.mainTexture = (Texture)ab.LoadAsset(assetName);
                    }
                    //卸载资源(只卸载AB包本身)
                    ab.Unload(false);
                }
                else {
                    Debug.LogError(GetType() + "/LoadNonObjectFromAB()/WWW 下载错误,请检查 URL: "+ ABURL + " 错误信息:"+www.error);
                }

            }
        }

        /// <summary>
        /// 加载“预设”资源
        /// </summary>
        /// <param name="ABURL">AB包URL</param>
        /// <param name="assetName">加载资源的名称</param>
        /// <param name="showPosition">显示的方位</param>
        /// <returns></returns>
        IEnumerator LoadPrefabsFromAB(string ABURL, string assetName,Transform showPosition=null)
        {
            //参数检查
            if (string.IsNullOrEmpty(ABURL))
            {
                Debug.LogError(GetType() + "/LoadPrefabsFromAB()/输入的参数不合法,请检查");
            }

            using (WWW www = new WWW(ABURL))
            {
                yield return www;
                AssetBundle ab = www.assetBundle;
                if (ab != null)
                {                    
                    if (assetName=="")
                    {
                        //加载主资源
                        if (showPosition != null)
                        {
                            GameObject goCloneObj=(GameObject)Instantiate(ab.mainAsset);
                            //克隆的对象显示位置
                            goCloneObj.transform.position = showPosition.transform.position;
                        }
                        else {
                            //克隆加载的预设对象
                            Instantiate(ab.mainAsset);  
                        }
                    }
                    else {
                        //实例化指定资源
                        if (showPosition != null)
                        {
                            GameObject goCloneObj = (GameObject)Instantiate(ab.LoadAsset(assetName));
                            //克隆的对象显示位置
                            goCloneObj.transform.position = showPosition.transform.position;
                        }
                        else
                        {
                            //克隆加载的预设对象
                            Instantiate(ab.LoadAsset(assetName));
                        }
                    }
                    //卸载资源(只卸载AB包本身)
                    ab.Unload(false);
                }
                else
                {
                    Debug.LogError(GetType() + "/LoadNonObjectFromAB()/WWW 下载错误,请检查 URL: " + ABURL + " 错误信息:" + www.error);
                }

            }
        }

        //加载AB包(不提取资源)
        IEnumerator LoadFromAB(string ABURL)
        {
            //参数检查
            if (string.IsNullOrEmpty(ABURL))
            {
                Debug.LogError(GetType() + "/LoadFromAB()/输入的参数不合法,请检查");
            }

            using (WWW www = new WWW(ABURL))
            {
                yield return www;
                AssetBundle ab = www.assetBundle;
                if (ab == null)
                {
                    Debug.LogError(GetType() + "/LoadNonObjectFromAB()/WWW 下载错误,请检查 URL: " + ABURL + " 错误信息:" + www.error);
                }
            }
        }


    }
}


 

ab包之间的依赖  , 假如a包(预制体打包的)依赖b包(贴图或材质),那么要先加载b包在加载a包,否则a包会发生丢失的情况

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值