unity4.x unityassetbundlee能打包场景吗

没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!Unity AssetBundle打包机制详解(5.x) - 推酷
Unity AssetBundle打包机制详解(5.x)
昨天的分享
,我们主要剖析了4.x版本下的AssetBundle管理机制,那5.x版本究竟有些什么变化呢?今天我们来一探究竟。
同时如果你恰有相关疑问,欢迎后台留言给UWA,或者加入QQ群()讨论,当然也不要忘记关注UWA哦。
AssetBundle打包(5.x)基础
(1)唯一API
public static AssetBundleManifest BuildAssetBundles(string outputPath, BuildAssetBundleOptions
assetBundleOptions = BuildAssetBundleOptions.None,BuildTarget targetPlatform = BuildTarget.WebPlayer);
调用BuildPipeline.BuildAssetBundles,引擎将自动根据资源的assetbundleName属性(以下简称abName)批量打包,自动建立Bundle以及资源之间的依赖关系。
(2)打包规则
在资源的Inpector界面最下方可设置一个abName,每个abName(包含路径)对应一个Bundle,即abName相同的资源会打在一个Bundle中。如果所依赖的资源设置了不同的abName,则会与之建立依赖关系,避免出现冗余。
支持增量式发布,即在资源内容改变并重新打包时,会自动跳过内容未变的Bundle。因此,相比4.x,会极大地缩短更新Bundle的时间。
(3) 新打包选项
除了前文提到的,5.x下默认开启的三个选项(CompleteAssets ,用于保证资源的完备性;CollectDependencies,用于收集资源的依赖项;DeterministicAssetBundle,用于为资源维护固定ID)之外,5.x中新增了以下选项:
ForceRebuildAssetBundle
用于强制重打所有AssetBundle文件;
IgnoreTypeTreeChanges
用于判断AssetBundle更新时,是否忽略TypeTree的变化;
AppendHashToAssetBundleName
用于将Hash值添加在AssetBundle文件名之后,开启这个选项,可以直接通过文件名来判断哪些Bundle的内容进行了更新(4.x下普遍需要通过比较二进制等方法来判断,但在某些情况下即使内容不变重新打包,Bundle的二进制也会变化)。
与4.x不同的是,对于移动平台,5.x下默认会将TypeTree信息写入AssetBundle,因此在移动平台上DisableWriteTypeTree选项也变得有意义了。
(4)Manifest文件
在4.x版本中,我们通常需要自行维护配置文件,以记录AssetBundle之间的依赖关系,并供运行时使用。而在5.x版本中,Manifest文件可以免去这一过程。
(5) Variant参数
Variant参数能够让AssetBundle方便地进行“多分辨率支持”,相关详解请移步下文。
AssetBundle 打包(5.x)进阶
在新系统中,添加了以下两个实用的新特性,也许能够给开发者带来事半功倍的效果。
(1) Manifest文件
在打包后生成的文件夹中,每个Bundle都会对应一个manifest文件,记录了Bundle的一些信息,但这类manifest只在增量式打包时才用到;同时,根目录下还会生成一个同名manifest文件及其对应的Bundle文件,通过该Bundle可以在运行时得到一个AssetbundleManifest对象,而所有的Bundle以及各自依赖的Bundle都可以通过该对象提供的接口进行获取。
(2) Variant参数
在资源的Inspector界面最下方,除了可以指定abName,在其后方还可以指定Variant。打包时,Variant会作为后缀添加在Bundle名字之后。相同abName,不同variant的Bundle中,资源必须是一一对应的,且他们在Bundle中的ID也是相同的,从而可以起到相互替换的作用。
当需要为手机和平板上的某个UI界面使用两套分辨率不同的纹理、Shader,以及文字提示时,借助Variant的特性,只需创建两个文件夹,分别放置两套不同的资源,且资源名一一对应,然后给两个文件夹设置相同的abName和不同的variant,再给UI界面设置abName,然后进行打包即可。运行时,先选择合适的依赖包加载,那么后续加载UI界面时,会根据已加载的依赖包,呈现出相对应的版本。
开发者注意事项
abName可通过脚本进行设置和清除,也可以通过构造一个AssetBundleBuild数组来打包。
新机制打包无法指定Assetbundle.mainAsset,因此无法再通过mainAsset来直接获取资源。
开启DisableWriteTypeTree可能造成AssetBundle对Unity版本的兼容问题,但会使Bundle更小,同时也会略微提高加载速度。
Prefab之间不会建立依赖,即如果Prefab-A和Prefab-B引用了同一张纹理,而他们设置了不同的abName,而共享的纹理并未设置abName,那么Prefab-A和Prefab-B可视为分别打包,各自Bundle中都包含共享的纹理。因此在使用UGUI,开启Sprite Packer时,由于Atlas无法标记abName,在设置UI界面Prefab的abName时就需要注意这个问题。
5.x中加入了Shader stripping功能,在打包时,默认情况下会根据当前场景的Lightmap及Fog设置对资源中的Shader进行代码剥离。这意味着,如果在一个空场景下进行打包,则Bundle中的Shader会失去对Lightmap和Fog的支持,从而出现运行时Lightmap和Fog丢失的情况.而通过将Edit-&Project Settings-&Graphics下shader Stripping中的modes改为Manual,并勾选相应的mode即可避免这一问题。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致4.2k 人阅读
标签:至少1个,最多5个
最近给项目改造AssetBundle系统,又重新摸起了AssetBundle这块儿。。因为现在使用4.x版本的情况已经越来越少,而在5里面unity3d已经原生支持了依赖分析增量构建等重量级功能,所以我就不再浪费篇幅去讲系统设计相关的话题。我花了一些时间做了一些小实验,可以明确一些unity3d在AssetBundle上的处理细节。希望看到这篇文章的人能够从中获取一些营养。
问:当使用WWW加载AssetBundle时,WWW.Dispose()和AssetBundle.Unload(false)两个释放操作分别会如何影响内存?答:单独调用WWW.Dispose会释放掉一部分内存(并不知道是什么内存,猜测是和网络相关的部分);单独调用AssetBundle.Unload不会带来任何内存变化;同时调用这两个接口可以完全释放内存。
实验过程:打包9个AssetBundle,每个Bundle中有一张的RGBA32格式纹理(16MB)。使用Profiler和任务管理器观察内存变化。
问:重复从同一个AssetBundle中加载资源,会带来怎样的内存变化?答:只会在CPU端占用一份内存,但在GPU部分,每次加载都会额外占用一份内存。
实验过程:打包一张的RGBA32格式纹理(16MB)为AssetBundle。反复进行"加载,取得ResourceObject,卸载Bundle"的操作,使用Profiler观察内存变化。其中,来自Unity的16MB增长是什么呢?从Profiler Detailed里可以看到具体项目。一个叫做GfxClientDevice的项目从8.0MB提升到了24.0MB。至于这个GfxClientDevice项目到底是什么呢? 我日后再调查补充。。。。
问:如果我打包Bundle和运行并不在一个AssetBundle中,可以正确的加载资源吗?答:可以。
问:如果我把Shader随着Bundle一起打包出来,而运行的工程并没有这个Shader,那么Shader可以正常运作吗?答:可以。
问:如果两个Bundle都包含同样的资源(未处理共享依赖),加载Bundle的时候unity3d如何处理引用?答:会各自加载自己包里的资源。
问:在两次不相干的打包过程中,依赖是否可以有效的保持。答:如果使用Deterministic参数,则可以保持。反之则不能,需要重新打包所有相关Bundle。
实验过程: 有资源A,B,C,其中资源B和资源C都依赖于A。每个资源打一个Bundle。
不开启Deterministic。先带依赖打包A和B,不包含C。然后重新带依赖打包A和C,不包含B。在运行时B会丢失对A的引用。
开启Deterministic。同上流程,在运行时B依然可以保持对A的引用。
0 收藏&&|&&2
你可能感兴趣的文章
你可能感兴趣的文章
分享到微博?
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。【求助】我打包场景成assetbundle资源包但是里面的脚本内容没了【unity3d吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:86,742贴子:
【求助】我打包场景成assetbundle资源包但是里面的脚本内容没了收藏
原先做的是,将场景打包成assetbundle资源包,放在本地磁盘上。通过www来获取加载场景。但是,我的场景“XXX.unity3d”貌似有点大,加载的时候很慢,就想换种方法测试了。但是换了一种,结果发现上面自己写的脚本却没有了,即使生成了但是也没有上面的所定义的变量值。现在真不知道怎么做才能完善好,求各位大大们给点助攻吧~~之前说什么用assetbundle和xml结合用,这个是什么意思呢?
关注逆鳞小说吧,并且捧场5000及以上T豆,支持柳大~,
SiKi学院上有大量的项目案例课程,可以让学员随时随地学习!通过案例来从入门到深入的学习Unity!
之前吧里好像有几个人问个这问题。帮顶。我也想了解下是什么情况。
跪求大神们帮助啊。
关注逆鳞小说吧,并且捧场5000及以上T豆,支持柳大~,
解决没啊。我也遇到同样的问题啊
assetbundle 里面包含脚本貌似是从你工程里面找同名的,如果工程没有,那assetbundle里面的脚本永远不会执行.貌似是这样.
弱弱的问一句
加载assetbundle的脚本挂在哪里使用呢
登录百度帐号没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 unity加载assetbundle 的文章

 

随机推荐