Unity Asset Bundle的基本操作流程

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/ultramansail/article/details/89047887

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数组使得它们都实例化。

接下来的内容将会在下篇博文分享

https://blog.csdn.net/ultramansail/article/details/89053790

猜你喜欢

转载自blog.csdn.net/ultramansail/article/details/89047887