首页 > 其他分享 >Assetbundle打包及加载入门详解(二)

Assetbundle打包及加载入门详解(二)

时间:2023-01-05 13:04:01浏览次数:56  
标签:ab AssetBundle manifest Assetbundle 打包 AssetBundles 详解 加载


接着上篇,本节写如何更加科学的打包,以及打包中的一些依赖关系。

科学打包:

一般来说会把物体打成一个assetbundle包,把材质打成另个包,然后在加载的时候都加载出来。

当然如果是有的模型会频繁更新,那就要把更新的单独打包了。这些都是在打包之前的计划工作,但是非常重要。

接下来继续讲打包的知识:

下面要打包三种东西,一种是模型、一种是材质、一种是场景。

如下图,有一个工程,exprot是从max里导入的模型文件,prefabs是做成的预制物体。一般来说被打包的物体都会做成预制物体。

 

Assetbundle打包及加载入门详解(二)_加载

现在要把prefabs里的所有的物体全选然后统一打包成名字为mod后缀为mo的assetbundle文件

Assetbundle打包及加载入门详解(二)_bundle_02

材质球名为为tietu.ab的格式的assetbundle文件

Assetbundle打包及加载入门详解(二)_ci_03

将场景testscene也进行打包,该场景中只有一个cube。

Assetbundle打包及加载入门详解(二)_bundle_04

定义assetbundle名为testscene.unity。如下:

Assetbundle打包及加载入门详解(二)_bundle_05

然后在文件夹中会看到打包出来的文件及对应的manifest文件。如下:

Assetbundle打包及加载入门详解(二)_bundle_06

然后我们打开mod的manifest文件,会看到mod在路径对应的模型文件有哪些,以及他们的依赖关系。如下:

很明显Dependencies的是在该文件夹下的tietu.ab这个assetbundle文件。说明如果要加载这个模型文件,必须要把所依赖的tietu.ab这个也加载了,不然就会出现依赖丢失。如

上篇文章中出现贴图丢失的现象。

Assetbundle打包及加载入门详解(二)_ci_07

然后再看一下大boss级别的assetbundle.manifest文件,可以看到整个文件夹里有三个assetbundle文件,只有mod存在依赖关系,其他的都没有。

Assetbundle打包及加载入门详解(二)_bundle_08

 

至此我们的打包工作都完成了。。。也明白了如果要加载某个模型或者场景的时候应该把对应的依赖关系也加载上。

下面开始加载,方法有两种,第一种是我们通过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打包及加载入门详解(二)_加载_09

 

-----加载场景的方法也是一样----因为加载的场景如果不跳转是看不出的所以加载之后加上了跳转方法,代码如下:

//加载场景,并跳转
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

相关文章

  • VRTK插件之瞬移详解
    在 VRTK插件中有两个瞬移的方法。所有的瞬移都是由手柄发出一条线,线与地面的交点就是瞬移所到的目的地。一个是VRTK_BasicTeleport,另一个是VRTK_HeightAdjustTeleport。下......
  • Unity3d碰撞器与触发器的区别详解(rigidbody移动和charactercontroller移动区别)
    Rigidbody或者charactercontroller移动才可以用collider的碰撞。正文:要产生碰撞必须为游戏对象添加刚体(Rigidbody)和碰撞器,刚体可以让物体在物理影响下运动。碰撞体是物理......
  • Assetbundle打包及加载入门详解(一)
    Assetbundle是unity的一种加载方式。这种加载可以从互联网上或者本地的文件夹中加载。要求被加载的文件必须是Assetbundle定义的格式首先制作Assetbundle:在project的Editor......
  • 一文详解RocketMQ的存储模型
    摘要:RocketMQ优异的性能表现,必然绕不开其优秀的存储模型。本文分享自华为云社区《终于弄明白了RocketMQ的存储模型》,作者:勇哥java实战分享。RocketMQ优异的性能表现,......
  • git commit 详解
    gitcommit命令用来将本地暂存的修改提交到版本库。gitcommit-m'提交信息'。我们用的比较多的应该就是-m参数。添加提交信息。经常手抖的同学可能会知道,gitcommit......
  • 详解kubernetes五种暴露服务的方式
    部署完服务终将是为了访问,那么kubernetes中service和ingress都可以将集群内部的服务能够支持外部访问。service可以让一组Pod(称为“后端”)为集群内的其他Pod(称为“前端”......
  • Day 06 模块加载机制
    模块加载机制一、优先从缓存中加载模块在第一次加载后会被缓存,多次调用require()不会导致模块的代码被执行多次不论内置模块、自定义模块、第三方模块都会从缓存中加载......
  • css中word-break和word-wrap用法详解
    css中的word-break和word-wrap属性在遇到中文和英文时的表现是不一样的,所以我们会在这些属性遇到中文、英文时分别进行说明。常用于换行word-wrap:break-word;word-b......
  • MapReduce详解
    1 MapReduce是什么​​Hadoop​---MapReduce是一个软件框架,基于该框架能够容易地编写应用程序,这些应用程序能够运行在由上千个商用机器组成的大集群上,并以一种可靠的,具......
  • 构建Feign项目时候,装载bean失败,只加载到一个
    描述:加载过程当中发现注入的bean只会加载本地包下的实现。无法访问远程服务。解决方案:启动类加上@EnableFeignClients,开启feign的功能远程方法由于是实现api模块下......