您的当前位置:首页正文

assetbundle是什么文件

2023-04-18 来源:赴品旅游

assetbundle是什么文件:答案是存档文件。

assetbundle是什么文件:答案是存档文件。

assetbundle是存档文件,包含可在运行时由Unity加载的特定于平台的非代码资源;AssetBundle可以表示彼此之间的依赖关系;例如,一个AssetBundle中的材质可以引用另一个AssetBundle中的纹理,为了提高通过网络传输的效率,可以根据用例要求选用内置算法选择来压缩AssetBundle。

演示机型:华为MateBook X    系统版本:win10    APP版本:unity2020.3.25f1

assetbundle是从unity项目中打包出来的资源文件。AssetBundle文件,也叫AB包,可以存储任何一种Unity可以识别的资源,如模型、纹理图、音频、场景等资源,也可加载开发者自定义的二进制文件。AssetBundle支持3种格式的压缩,分别是LZMA、LZ4、无压缩,默认是LZMA格式的压缩,使资源文件体积减小,便于下载和传播。

小编还为您整理了以下内容,可能对您也有帮助:

AssetBundle介绍

在网上说的:

所有资源的一个容器,像Zip压缩包一样,这些资源都可以在运行时进行加载。

压缩选项:Uncompressed、LZMA、LZ4

自身保存着互相的依赖关系。

两种类型:

场景Bundle、松散的Bundle

自己实践的:

当导出AB后会生成两个文件。

官方给的AssetBundle的文件结构:

想要了解里面是什么怎么做呢?

(此处拿普通的AB为例,场景AB会生成BuildPlayer-<SceneName>和BuildPlayer-<SceneName>.sharedAssets)

通过 WebExtract 和 Binary2Text 查看AssetBundle文件的内部。(路径:UnityEditorDataTools)

使用命令:WebExtract路径 + assetbundle文件路径。

解压成功会有如上提示,并在该目录生一个xxx_data的文件夹。

文件夹内有一个 CAB-<GUIDString> 的二进制文件。

再使用命令:Binary2Text路径 + CAB-<GUIDString>文件路径 + -detail

成功后会生成一个txt文本文件,打开后可以看到三个结构。

1.External References

2.AssetBundle

内容:

a.m_Name:名称

b.m_PreloadTable:一张表(fileID 是依赖的索引,对应上面的Extern References,pathID 是本文件的唯一ID)

c.m_Container:(资源列表,first是key second是value,通过 preloadIndex 与 preloadSize)

d.m_MainAsset:(4.x的时候用的,现在没啥用)

3.Object

里面就是Object的具体信息。

这样就和上面的结构对应上了。

可用工具:

AssetBundle Graphic Tool:打包

AssetBundle Browser Tool:浏览内容

AssetBundle Inspector:查看包的内容

unity3d开发2d游戏中Assetbundle有什么作用

在unity3d开发2d游戏中,Assetbundle 是Unity Pro提供提供的功能,它可以把多个游戏对象或者资源二进制文件封装到Assetbundle中,提供了封装与解包的方法使用起来很便利。在如下几个方面的作用明显:

1.预设

Assetbundle可以将Prefab封装起来,这是多么方便啊! 而且我也强烈建议大家将Prefab封装成Assetbundle,因为Prefab可以将游戏对象身上带的游戏游戏组件、游戏脚本、材质都封装在一起。当从服务器上将Assetbundle下载以后直接Instantiate就可以放入游戏中。

试想一下,如果只能将原始的二进制资源文件放在服务器上下载,当资源文件下载完毕后,需要动态的创建游戏对象、然后动态的将脚本绑定在游戏对象、动态的将贴图赋予游戏对象等等各种动态的操作。。所以强烈建议使用Prefa,不解释!!!!!

另外,我在举个例子,因为模型有可能会带很多动画文件,那么这样一组模型资源就可能是多个FBX 文件 和 若干png贴图文件 材质文件。这时我只需要把原始模型放入Prefab中,它就会包含这个模型的所有组件、甚至包括它的动画资源、贴图。那么如下图所示,Mode就是模型的Prefab文件,那么我仅仅只需要把Mode这个预设打包成Assetbundle即可。 当我在服务器上下载这个Assetbundle并且载入游戏中就可以直接使用了,切换动画、换贴图都可以。。

2.二进制文件

也并不是Assetbundle中全都要用预设,Assetbundle它也可以将二进制文件直接封装在里面,比如图片、声音、文本信息等等。

3.场景文件

在Unity中可以将一个场景保存在Scene中,Scene就会包含这个场景中的所有,那能不能把Scene也封装成Assetbundle中?答案是能,但是它不能在移动平台上用,因为移动平台上是不能更新脚本的,换句话来说就是即使将脚本绑定在Prefab中,然后下载Assetbundle后,所有脚本是不会执行的,后面说另外一种巧妙用法。

4.移动平台

上面MOMO已经将Assetbundle 的使用原理大致介绍了一下 ,我们在谈谈移动平台。脚本不能更新是移动平台下最大的伤,这就意味着开发者无法绕过App store和 google Play这种在线商店升级应用程序。唯一能做到的就是更新资源、举个例子,游戏中在处理版本升级时,一般会有个大版本号和一个小版本号,大版本号就是 2.0、3.0这种 版本需要在AppStore中更新,大版本主要是升级游戏脚本,然后当小版本号,比如2.0.1 或2.0.2这种只是更新游戏中的资源,通过自己游戏的服务器就可以完成,通过Assetbundle在自己服务器上下载,然后适应在游戏中。如果非要更新脚本,或不得不更新脚本那么只能在Appstore或者google Play去更新大版本。

移动平台上不能更新脚本,那么Prefab上绑定的脚本怎么办?在任何平台上都可以把脚本添加到Prefab上,然后打包成Assetbundle,只有移动平台上有点特殊,比如将Test.cs这条脚本绑定在Prefab中,最后程序通过服务器下载这个Assetbundle ,当载入工程中这条脚本是不会被执行的。

但是如果本地工程有Test.cs这条脚本,那么Unity会自动将这条脚本绑定在下载的Prefab中,并且他们执行的非常好。如果本地工程中没有Test.cs这条脚本,那么Prefab上的脚本是永远都不会执行的。有时我们会在脚本中写一些Public的变量,有可能不同的Prefab上绑定的是相同的脚本,只是Inspector 脚本中的public参数不同。别担心这一点Assetbundle 中的Prefab也是没问题,所以说只要大版本中的脚本没问题,在小版本中只更新游戏资源是一点问题都么有的。

5.移动优化

之前我们说过可以将游戏中的某个游戏对象封装成Assetbundle,也可以将游戏中的整个场景也封装成Assetbundle。但是我认为需要巧妙的使用封装场景,因为场景中肯定有很多公用的模型,如果打包场景的话那么内存与size就是 公用模型的size * N个场景,想想其实挺恐怖的。其实我们可以巧妙的使用,首先把场景中公用的部分和私有的部分统统放入Unity, 然后烘培整个场景。 当场景烘培完毕后把公用的模型部分在拿出去,场景只只保留私有的模型。还可以做一个工具将公用模型在场景中的坐标保存在XML中(每个场景文件会对应一个公用模型的XML信息),最后在将公用的模型分别封装在别的Assetbundle中。

服务器上提供每个场景的Assetbundle ,和公用模型的Assetbundle,一般公用模型的Assetbundle可以放在常驻内存中(可能使用频繁、根据项目的不同而定)场景Assetbundle下载完毕后,现载入场景然后在根据场景对应的XML信息将公用模型部分动态的在添加到场景中,这样就完成了一个场景的构建。

1.6.0.assetbundle是什么文件,可以删除吗?

你有用.net开发工具或者运行.net程序吧?删掉不会影响你的系统,不过有可能影响你的程序使用。给你个建议,将这些文件移到其他盘,然后尝试运行系统和一些程序,如果你需要的程序都可以正常工作,那就可以把这些备份都删除

Unity 资源管理与AssetBundle详解

http://blog.csdn.net/u014230923/article/details/51433455

Unity常用的资源大概有3类:

还有一些平时不太关注的:脚本对象,文本文件,unity自己内置的资源(像新建粒子时的默认材质之类的),这些也是资源。

http://blog.csdn.net/qq_18995513/article/details/51955609

Unity的资源管理模式,包括在编辑器管理(使用AssetDatabase)和在运行时管理(使用Resources和AssetBundle)。

在编辑器内加载卸载资源,并不能在游戏发布时使用,它只能在编辑器内使用。但是,它加载速度快,效率高, 适合在测试时使用 。

因为只能在编辑器使用,要加个宏防止报错:

https://docs.unity3d.com/ScriptReference/Resources.UnloadAsset.html

Unloads assetToUnload from memory.

This function can only be called on Assets that are stored on disk.

If there are any references from game objects in the scene to the asset and it is being used then Unity will reload the asset from disk as soon as it is accessed.

需要注意的是,调用Resources.UnloadAsset()来清理资源时,只是标记该资源需要被GC回收,但不是立刻就被回收的。需要调用

运行脚本后,会发现在编辑器里就会出现:Project视窗中多了一个刚创建的1.mat资源。

具体见上面链接

Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时 动态加载,可以指定路径和来源的。

注意下图有一些错误需要更新:

小米手机assetbundle_0.pak是什么文件

AssetsBundle简单打包(根据文件夹打包)什么叫打包打包就是将一些资源压缩为什么要对资源进行打包因为在实际的游戏商业开发中,美术资源很大,如果直接把资源打成apk的包,那么会导致包很大,而且加载起来也十分消耗性能。引入资源打包,可以对资源进行压缩,直接减小apk包的容量。况且打包以后在游戏运行的过程中,可以用到哪个模块加载哪个模块的资源,也会大大降低性能消耗,比如王者荣耀的万象天宫的不同模式下载就是这样。简单文件夹打包工具介绍今天本文介绍的打包工具是根据CSDN中神码编程大佬的代码进行了

unity3d中Resources和 AssetBundle 有什么区别?麻烦详细的。

Resources是动态内部调用,Resources在编辑环境下是project窗口的一个文件夹,调用里面的资源,可以用Resources类,比如Resources.Load,打包后这个文件夹是不存在的,会统一生成assets资源,AssetBundle 是外部调用,要用AssetBundle 首先要先把资源打包为.assetbundle文件,再动态的去加载这个文件,本地或者网络服务器都可以。

简单说,Resources资源的加载是动态加载内部的,AssetBundle 是动态加载外部的追问恩,谢谢。你上面说的“打包后”是用什么打包?发布后?还是用AssetBundle打包?

只是现在没把资源放服务器上,感觉用AssetBundle好麻烦,打包的时候要写那么多代码。

ET框架中怎样动态加载资源

Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大。 Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时动态加载,可以指定路径和来源的。

(1).assetBundle就是内部数据读取完后自动创建了一个assetBundle而已Create完以后,等于把硬盘或者网络的一个文件读到内存一个中,这时也就是个AssetBundle内存镜像数据块。释放方式是AssetBundle.Unload(false)

(2).用AssetBundle.Load(同Resources.Load) 会从AssetBundle的内存镜像里读取并创建一个Asset对象,使用Resources.UnloadUnusedAssets()释放全部和Resources.UnloadAsset(gameobject);释放单个;

(3).Instaniate一个Prefab,是一个对Assets进行Clone(复制)+引用结合的过程,使用GameObject.Destroy(gameobject);

(注意)游戏对象可能不是动态加载时,但是可能他的材质、图集是动态加载的请把这些应用置为空。

unity中Assetbundle打包windows成功,为什么打包Android失败

Unity5新的AssetBundle系统大大简化了这一操作。Unity打包的时候会自动处理依赖关系,并生成一个.manifest文件,这个文件描述了assetbundle包大小、crc验证、包之间的依赖关系等等,是一个文本文件。加载资源的时候Unity会自动处理好其依赖包的加载。打包代码简化为一个函数(其实也没什么必要了,因为流程固定了,做成内嵌的菜单选项也没什么影响)BuildPipeline.BuildAssetBundles(outputPath);

怎么查看assetbundle文件反编译

Unity会下载Assetbundle本地中,它的工作原理是先通过(版本号和下载地址)先在本地去找看有没有这个Assetbundle,如果有直接返回对象,如果没有的话,在根据这个下载地址重新从服务器或者本地下载。这里版本号起到了很重要的作用,举个例子,同一下载地址版本号为1的时候已经下载到本地,此时将版本号的参数改成2 那么它又会重新下载,如果还保持版本号为1那么它会从本地读取,因为本地已经有版本号为1的这个Assetbundle了。你不用担心你的资源本地下载过多,也不用自己手动删除他们,这一切的一切Unity会帮我们自动完成,它会自动删除掉下载后最不常用的Assetbundle ,如果下次需要使用的话只要提供下载地址和版本后它会重新下载。

我们在聊聊Assetbundle 中的脚本,在移动平台下Assetbundle里面放的脚本是不会被执行的,还记得我们打包前给两个Prefab挂上了脚本吗?在手机上将Assetbundle下载到本地后,加载进游戏中Prefab会自动在本地找它身上挂着的脚本,他是根据脚本的名来寻找,如果本地有这条脚本的话,Prefab会把这个脚本重新绑定在自身,并且会把打包前的参数传递进来。如果本地没有,身上挂的条脚本永远都不会被执行。

在Prefab打包前,我在编辑器上给脚本中的变量 name 赋了不同值,当Prefab重新载入游戏的时候,它身上脚本的参数也会重新输出。

如果你的Assetbundle中的Prefab上引用的对象,那么这样做就会出错了,你需要设定他们的依赖关系。或者运行时通过脚本动态的载入对象。

如何修改assetbundle

需要写脚本的,脚本如下

[MenuItem("Custom Editor/Create AssetBunldes Main")]

static void CreateAssetBunldesMain ()

{

//获取在Project视图中选择的所有游戏对象

Object[] SelectedAsset = Selection.GetFiltered (typeof(Object), SelectionMode.DeepAssets);

//遍历所有的游戏对象

foreach (Object obj in SelectedAsset)

{

string sourcePath = AssetDatabase.GetAssetPath (obj);

//本地测试:建议最后将Assetbundle放在StreamingAssets文件夹下,如果没有就创建一个,因为移动平台下只能读取这个路径

//StreamingAssets是只读路径,不能写入

//服务器下载:就不需要放在这里,服务器上客户端用www类进行下载。

string targetPath = Application.dataPath + "/StreamingAssets/" + obj.name + ".assetbundle";

if (BuildPipeline.BuildAssetBundle (obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies)) {

Debug.Log(obj.name +"资源打包成功");

}

else

{

Debug.Log(obj.name +"资源打包失败");

}

}

//刷新编辑器

AssetDatabase.Refresh ();

}

显示全文