前几天写了一篇关于unity动态加载的Resource的博客
动态加载Resource的博客
然后今天介绍一下AssetBundle的动态加载
AssetBundle的动态加载实质上是导出包 在加载回来的过程
导出过程
首先我们创建一个Editor的文件夹 然后我们随便弄一个预制体(在Editor下)
之后我们可以修改导出的类型(像我这样)
之后导出的名称wall 后缀就是as(都是可以自定义的)
然后我们通过代码来实现导出
在之后的代码可能用到编译器扩展的知识 我之前也写过一些 在这里给出一篇 如果有兴趣可以自己去翻看
编译器扩展博客链接
using System.IO;
using UnityEditor;
public class CreateBundles
{
[MenuItem("Assets/Build a AssetBundles")]//编译器扩展
static void BuildBundles()
{
string dir = "AssetBundles";//设置路径(在根目录之下)
if (Directory.Exists(dir)==false)
{
//不存在路径 创建
Directory.CreateDirectory(dir);//创建路径
}
BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);//导出配置
}
}
注意:这个代码也是要在Editor文件夹下的
然后我们在unity中的Asset找到我们创建的Build a AssetBundles
点击即可导出包
我们可以看到我们导出的文件的名称和格式(修改格式是为了不让外界太容易知道文件的类型)
实现加载
前边说了导出 然后我们来实行一下加载
我们现在做的是本机上的加载 并没有上传到服务器上
void Start()
{
AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/wall.as");//读取到路径
//只加载cube
GameObject wallprefebs = ab.LoadAsset<GameObject>("Cube");
Instantiate(wallprefebs);
//遍历上传的所有的 全部加载
//Object[] objs = ab.LoadAllAssets();
//foreach(var t in objs)
//{
// Instantiate(t);
//}
}
然后我们把在unity中的所有都删除
包括editor的预制体
只有运行即可
注意上边的代码中的读取单个的时必须把名字写对 不然会报空(名字是原来在unity预制体的名字不是导出之后文件的名字)
这篇博客就这么多了 之后我会持续更新动态加载的有关知识
如果对大家有帮助 欢迎大家关注我