Unity中如何使用AssetBundle

上文介绍了Unity中的AssetBundle 资源打包有什么作用,这次我们来一起看看该如何使用AssetBundle

首先打开unity项目,鼠标点击一个Project下的一个文件然后看这里

Unity中如何使用AssetBundle_第1张图片

 

Project下的每一个文件下面都有一个AssetBundle,点击红色区域弹出New点击New会提示你输入AssetBundle的name,左边的红色区域就是这个资源被AssetBundle打包后的文件名字,右边的红色区域就是这个AssetBundle打包后的文件后缀,如上图我设置的,打包后文件为cube.unity3d,文件名和文件后缀可以随便取,下面我们来实际操作一下

首先在unity项目中创建Editor文件夹,创建一个脚本文件,复制如下代码到新建的脚本文件,然后将这个脚本文件放到Editor文件下面

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

public class CreateAssetBundles {

    [MenuItem("Assets/Build AssetBundles")]
    static void BuildAllAssetBundles()
    {
        string dir = "AssetBundles";
        if (Directory.Exists(dir) == false)
        {
            Directory.CreateDirectory(dir);
        }
        BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
    }
}

Unity中如何使用AssetBundle_第2张图片

好了,接下来我们可以在unity中点击asset在弹出的子选项里找到Build AssetBundles

Unity中如何使用AssetBundle_第3张图片

点击Build AssetBundles按钮后将会在项目路径下生成四个文件

Unity中如何使用AssetBundle_第4张图片

这个cube.unity3d就是AssetBundle打包的资源压缩包啦,我们可以把这个放到服务器上,在需要的时候进行远程加载,使用代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class LoadFromFileExamle : MonoBehaviour {

	// Use this for initialization
	IEnumerator Start () {
        //UnityWebRequest取代www下载
        string uri = @"file:///F:\shengcun\AssetBundleDemo\AssetBundles\cube.unity3d";//AssetBundle资源路径这里可以填写服务器地址和该资源的完整路径
        UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(uri);
        yield return request.SendWebRequest();
        AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);//得到AssetBundle对象
        Object[] objs = ab.LoadAllAssets();//读取AssetBundle里面的所有资源
        foreach (Object o in objs)
        {
            Instantiate(o);//实例化对象 这里可以根据对象的类型进行转换在游戏中使用
        }

        AssetBundle manifestAB = AssetBundle.LoadFromFile("AssetBundles/AssetBundles");
        AssetBundleManifest manifest = manifestAB.LoadAsset("AssetBundleManifest");//读取manifest文件
        string[] strs = manifest.GetAllDependencies("cube.unity3d");
        foreach (string name in strs)
        {
            Debug.Log(name);//打印cube.unity3d的依赖AssetBundle包 后续应该根据这个依赖包继续加载AssetBundle包 加载方法和上面相同
        }
    }
	
	// Update is called once per frame
	void Update () {
		
	}
}

上面看到了AssetBundle包有互相依赖的关系,什么意思呢,比如a包是个模型 b包是这个模型的材质 将a包和b包同时打包,那么a包将依赖于b包,在项目中使用的时候,需要加载的AssetBundle包除了本身外,还需要加载所有这个AssetBundle包的依赖包,那么让资源更合理化,这里建议将所有材质打包到一个AssetBundle包,所有贴图打包到一个AssetBundle包,然后其他的包会依赖这两个包,这是一种比较常见的AssetBundle打包策略,因为这样操作相当于让所有资源共用,避免资源重复造成AssetBundle变大。然后推荐一款AssetBundle打包管理工具AssetBundle-Browser,非常好用!

最后附上AssetBundle-Browser的传送门,拿走不谢:https://github.com/Unity-Technologies/AssetBundles-Browser

你可能感兴趣的:(Unity中如何使用AssetBundle)