这次我们来一起看看该如何使用 AssetBundle
首先打开unity项目,鼠标点击一个Project下的一个文件然后看这里
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中点击asset在弹出的子选项里找到Build AssetBundles
点击Build AssetBundles按钮后将会在项目路径下生成四个文件
这个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>("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,非常好用!
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删