Unity 简易AssetBundle打包方法(一)

一.打包AB

本文全程以Unity中基础3d Object 以及部分材质作为AssetBundle(AB)导出素材

创建一个Editor文件夹(一定要放在这个文件夹里面),并在其中创建一个C#脚本MyAssetBundles,代码如下

using System.IO;
using UnityEditor;

public class MyAssetBundles  {
    [MenuItem("Assets/BuildBundles")]//在Assets选项中添加点击按钮
    static void BuildBundles()
    {
        string assetBundlesLibrary = "AssetBundles";
        if (!Directory.Exists(assetBundlesLibrary))//判断本地目录是否已经存在目录名
        {
            Directory.CreateDirectory(assetBundlesLibrary);
        }

        BuildPipeline.BuildAssetBundles(assetBundlesLibrary, BuildAssetBundleOptions.None,
            BuildTarget.StandaloneWindows64);//在此目录下创建AssetBundle
    }
}

其次要对需要打包的预制体添加生成的名字,后面的选项可以修改后缀名为unity3d
Unity 简易AssetBundle打包方法(一)_第1张图片
我们找到Assets->BuildBundles运行即可对这个Cube进行打包
Unity 简易AssetBundle打包方法(一)_第2张图片
找到你项目的根目录里面就会有一个AssetBundles文件夹,里面就是打包的内容
Unity 简易AssetBundle打包方法(一)_第3张图片
scene文件夹下:

二.加载AB包

首先创建一个脚本 LoadFileFromAB ,代码如下:

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

public class LoadFileFromAB : MonoBehaviour {

	// Use this for initialization
	void Start ()
	{
	    AssetBundle ab=AssetBundle.LoadFromFile("AssetBundles/scene/cube.unity3d");//加载本地AB包内容
	    GameObject cube=ab.LoadAsset("Cube") as GameObject;//LoadAsset中参数为导出前Prefab名字
	    Instantiate(cube);//生成cube
	}
	
}

然后将脚本挂载在Camera上 运行即可 发现已经创建了一个Cube(Clone)
Unity 简易AssetBundle打包方法(一)_第4张图片
此时,我们将整个Cube(Clone)拖拽至Project面板中,做成Prefab预制体,然后结束运行会发现,Cube材质已经丢失,这是因为运行的时候是在内存中加载AB包中cube所带有的材质,一旦结束运行,自动回收了。
Unity 简易AssetBundle打包方法(一)_第5张图片

三.打包策略

对于一些需要公共材质的预制体,推荐将材质球和贴图合并为同一AB名字打包,再将不同预制体进行打包

例子:我们先创建两个不同的物体,并为其附上材质球,修改颜色为红色
Unity 简易AssetBundle打包方法(一)_第6张图片
然后我们开始给他们打包,修改Assetbundle名
Unity 简易AssetBundle打包方法(一)_第7张图片
Unity 简易AssetBundle打包方法(一)_第8张图片
运行Assets->BuildBundles后我们找到目录下打包的文件
Unity 简易AssetBundle打包方法(一)_第9张图片
我们这里看到capsule和cube分别打包了占40kb

接下来我们换一种打包方式
我们对他们两个共有的材质球也进行AB包命名
Unity 简易AssetBundle打包方法(一)_第10张图片
然后再运行BuildBundles(先删除之前我们打包完的文件)观察文件目录
Unity 简易AssetBundle打包方法(一)_第11张图片
现在只有我们打包的材质球占了39kb,其余的capsule和cube,由于他们是公用一个材质球,Unity自动帮我们内部打包时进行了打包依赖,所以我们省下了近一半的容量


那么我们如何导入呢?

我们应该在使用资源之前,先加载依赖的材质包

参考资料:https://blog.csdn.net/lmyfx/article/details/78236225
未完待续…

你可能感兴趣的:(Unity3d学习)