接着上篇,本节写如何更加科学的打包,以及打包中的一些依赖关系。
科学打包:
一般来说会把物体打成一个assetbundle包,把材质打成另个包,然后在加载的时候都加载出来。
当然如果是有的模型会频繁更新,那就要把更新的单独打包了。这些都是在打包之前的计划工作,但是非常重要。
接下来继续讲打包的知识:
下面要打包三种东西,一种是模型、一种是材质、一种是场景。
如下图,有一个工程,exprot是从max里导入的模型文件,prefabs是做成的预制物体。一般来说被打包的物体都会做成预制物体。
现在要把prefabs里的所有的物体全选然后统一打包成名字为mod后缀为mo的assetbundle文件
材质球名为为tietu.ab的格式的assetbundle文件
将场景testscene也进行打包,该场景中只有一个cube。
定义assetbundle名为testscene.unity。如下:
然后在文件夹中会看到打包出来的文件及对应的manifest文件。如下:
然后我们打开mod的manifest文件,会看到mod在路径对应的模型文件有哪些,以及他们的依赖关系。如下:
很明显Dependencies的是在该文件夹下的tietu.ab这个assetbundle文件。说明如果要加载这个模型文件,必须要把所依赖的tietu.ab这个也加载了,不然就会出现依赖丢失。如
上篇文章中出现贴图丢失的现象。
然后再看一下大boss级别的assetbundle.manifest文件,可以看到整个文件夹里有三个assetbundle文件,只有mod存在依赖关系,其他的都没有。
至此我们的打包工作都完成了。。。也明白了如果要加载某个模型或者场景的时候应该把对应的依赖关系也加载上。
下面开始加载,方法有两种,第一种是我们通过manifest文件知道需要加载tietu.ab这个文件才可以,所以直接加载这个文件。
如下:
using UnityEngine;
using System.Collections;
public class LoadFromFileExample : MonoBehaviour
{
// Use this for initialization
void Start()
{
AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/mod.mo");
AssetBundle tietu = AssetBundle.LoadFromFile("AssetBundles/tietu.ab");
Object[] obj = ab.LoadAllAssets<GameObject>();//加载出来放入数组中
//创建出来
foreach (Object o in obj)
{
Instantiate(o);
Debug.Log(o.name);
}
ab.Unload(false);
tietu.Unload(false);
}
第二种:如果我们没有去看manifest文件,我们还可以使用另一种方法 即获得mod这个assetbundle所依赖的文件,并且加载它们。代码如下:
代码中通过 GetAllAssetBundles这个获得到所有的manifest的文件,可以通过GetAllDependencies方法获得到对应assetbundle文件的所有依赖名称,然后加载。
AssetBundle manifesAB = AssetBundle.LoadFromFile("AssetBundles/AssetBundles");
AssetBundleManifest manifest = manifesAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
foreach (string name in manifest.GetAllAssetBundles())
{
//打印所有manifest中的文件名
print(name);
}
//获得所有依赖。例如材质球贴图等
string[] strs = manifest.GetAllDependencies("mod.mo");
foreach (var name in strs)
{
//加载所有依赖
AssetBundle.LoadFromFile("AssetBundles/" + name);
}
以上两种方法效果都如图:
-----加载场景的方法也是一样----因为加载的场景如果不跳转是看不出的所以加载之后加上了跳转方法,代码如下:
//加载场景,并跳转
AssetBundle scenesload = AssetBundle.LoadFromFile("AssetBundles/testscene.unity");
Application.LoadLevel("testscene");
所以本次案例的完整代码如下:
using UnityEngine;
using System.Collections;
public class LoadFromFileExample : MonoBehaviour
{
// Use this for initialization
void Start()
{
AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/mod.mo");
// AssetBundle tietu = AssetBundle.LoadFromFile("AssetBundles/tietu.ab");
Object[] obj = ab.LoadAllAssets<GameObject>();//加载出来放入数组中
//创建出来
foreach (Object o in obj)
{
Instantiate(o);
Debug.Log(o.name);
}
ab.Unload(false);
加载场景,并跳转
//AssetBundle scenesload = AssetBundle.LoadFromFile("AssetBundles/testscene.unity");
//Application.LoadLevel("testscene");
AssetBundle manifesAB = AssetBundle.LoadFromFile("AssetBundles/AssetBundles");
AssetBundleManifest manifest = manifesAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
foreach (string name in manifest.GetAllAssetBundles())
{
//打印所有manifest中的文件名
print(name);
}
//获得所有依赖。例如材质球贴图等
string[] strs = manifest.GetAllDependencies("mod.mo");
foreach (var name in strs)
{
//加载所有依赖
AssetBundle.LoadFromFile("AssetBundles/" + name);
}
}
}
这样就完成了完整打包和加载的过程工作。当然这些都是从硬盘的加载方法,下一篇讲从网络服务器加载assetbundle的方法。
标签:ab,AssetBundle,manifest,Assetbundle,打包,AssetBundles,详解,加载 From: https://blog.51cto.com/u_8378185/5990721