1.Asset Bundle
- 序列化文件(Serialized file):一般用于存储预制体、模型、材质等在游戏场景中渲染以后才能看见的东西
- 源文件(Resource file):一般用于存储图片、声音等随时可以看见的文件
2.指定Asset Bundle标签
这是属性面板右下角的面板,左边的输入框可以设置包的名称,可以用“/”来划分目录,如:“mat”或者“resources/mat”,右边的输入框代表包的后缀,比如:u3d。
3.构建Asset Bundle目录
- 新建一个脚本,这里取名为ABTest(这个脚本一定要放在Editor目录下)
- 写代码
using UnityEditor;
using System.IO;
public class ABTest
{
//创建菜单栏选项
[MenuItem ("Tools/Asset Bundles/Build AssetBundles")]
static void BuildAssetBundle()
{
//相对于工程文件夹的路径
string path = "Asset Bundles";
//判断路径是否存在,不存在则创建
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
//构建Asset Bundle包
BuildPipeline.BuildAssetBundles(path, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
}
}
- 代码解析
MenuItem这个程序集引用是在菜单栏中产生“Tools/Asset Bundles”并在之后产生一个“Build AssetBundles’按钮,只要点击这个按钮就可以执行下面的方法。
Path路径是“Asset Bundles”,这是相对于工程文件夹的路径(注意:不是相对于Asset目录的路径),因为我们只需要它在编辑器中执行就可以了,所以无需继承MonoBehaviour并放到场景中。
构建Asset Bundle的核心代码:
BuildPipeline.BuildAssetBundles(path,BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);
path是构建的Asset Bundle包保存的路径,BuildTarget是打包的平台,这个一定要注意,比如你要打包到安卓平台,一定要写BuildTarget.Android。BuildAssetBundleOptions以后再解释,现在就这样写。
4.上传的服务器
-
我们接下来是在本地操作,上传到服务器有时间再说。
5.载入Asset Bundle
- 新建一个脚本,这里取名为ABSet吧
-
还记得我们之前创建的材质吗?它叫“pige_mat“(为什么要提这个?之后你就知道了)。
在场景中新建一个立方体,取名为“CubePrefab“,记住这个名字,然后把“pige_mat”这个材质赋予给“CubePrefab”,做成一个预制体(那么预制体的名字就叫“CubePrefab“了)。
- 写代码
using UnityEngine;
public class ABSet : MonoBehaviour
{
void Start ()
{
//载入的Asset Bundle包的路径,精确到文件名(带后缀)
AssetBundle ab1 = AssetBundle.LoadFromFile("Asset Bundles/resources/mat.u3d");
AssetBundle ab2 = AssetBundle.LoadFromFile("Asset Bundles/resources/prefab.u3d");
//把Asset Bundle作为GameObject载入
ab1.LoadAsset<GameObject>("pige_mat");
GameObject cube =ab2.LoadAsset<GameObject>("CubePrefab");
//实例化对象
Instantiate(cube);
}
}
- 代码解析
-
从Asset Bundle解压文件的核心代码
AssetBundle.LoadFromFile("路径");
注意该路径一定要保证完整,连后缀名都要记住,该方法返回的值是AssetBundle,所以用一个AssetBundle类型的变量来存储它。
ab.load<类型>(“文件名”)
游戏场景中的物体类型以GameObject为主,文件名注意不是Asset Bundle包的名称,而是原来文件的名称,建议这些文件在工程完成之前不要删除,否则忘记名字就麻烦了。
- 补充
-
最后把这个脚本挂在游戏场景中的物体上,如果要一次性解压包里的所有文件,可以用ab.LoadAllAsset(),这时用Object数组来存储它,然后遍历Object数组使得它们都实例化。