unity 关于unity assetbundlee shader怎么打成一个包

Unity中打包Texture到AssetBundle反而比原资源jpg格式还要大,该怎么减小空间? - 知乎149被浏览7172分享邀请回答3812 条评论分享收藏感谢收起86 条评论分享收藏感谢收起查看更多回答5.3.4版本 自定义shader打包assetBundle后加载无法显示
在研究5.3.4版本的assetBundle打包加载机制,碰到一个奇怪的问题如下:1.所有的自定义shader文件放在Resources下,并且作为共享资源打成一个assetBundle包,名为B2.另有一个包含模型、贴图、网格、动画的角色打成一个assetBundle包,名为A现在的问题是,开始游戏后先预加载B包,即将所有的自定义shader加载到内存,但是加载A包中的模型后,shader丢失(显示为紫色),在性能分析面板中可以看到,内存中的B包shader已被A包中的材质球所引用,但不能正常显示,为丢失状态(紫色);这里经测试,unity内置shader,只需要加入Editor—&Project Setting—&Graphics中即可正常显示,但是这里我们自己写的shader确不行;查了相关的资料和旧版的解决方案,有说是依赖打包的问题,但在5.3版本中unity在打assetBundle包时已默认启用BuildAssetBundleOptions.和BuildAssetBundleOptions.模式。所以就不明白自定义shader为什么不能正确显示,有谁还碰到了类似的问题,请问是怎么解决的?或者说这里哪个步骤有问题?
要评论请先&或者&unity5.x&&shader打包AssetBundle总结
最近比较忙,好久没有更新博客了,新项目切换到unity5.x后使用了新的打包机制,在打包的时候遇到了一些问题,这里来记录一下吧。
在上一个项目中,我们使用unity4.7,对于并没有进行依赖打包,而是由打包到了每个用到的中去,其实这样是“很不科学的”。这样不仅增加了的总体积,而且还会在运行时产生很多的实例,增加很多的显存占用。所以我们决定把自定义的打包成一个。
用到的工具:
1、UnityStudio:
这是一个解包AssetBundle的工具,可以查看和导出中的资源。
下面是一些尝试和结果分析:
一、不进行依赖打包(不需要设置GraphicsSetting,不给自定义shader设置AssetBundle Name)
这种情况unity5.x还是与unity4.x一样,把打包到每一个使用它的中去,这样就会同时存在多个一样的,并在运行时产生多个实例。
这个Character是我们自定义的一个,在运行时产生了多个实例:
使用UnityStudio解包一个ab可以看到,我们自定义的被打包到中:
打包后的运行结果如下:
1、编辑器是pc平台的时候,打出来的包在编辑器里运行是正常的。
2、编辑器是时,打出来的包在编辑器里运行显示粉红(查看材质可以发现并不是丢失材质和shader),但在手机正常。
这是为什么呢?这是因为以安卓为平台打包的时候被打包的shader被编译成安卓平台的版本,在编辑器中运行会发生异常。这是从到一直有的问题。
解包后我们可以看到不同平台编译出来的shader&subProgram不同。
二、依赖打包(将shader设置AssetBundle Name打包)
使用这种方式,需要将shader添加到GraphicsSetting-& always included shader设置中,否则shader也会显示粉红。注意要在设置Graphics之后把重新打包,在能生效。
文档中也有说到:
测试结果如下:
1、编辑器是pc平台的时候,打出来的包在编辑器里运行是正常的。
2、编辑器是安卓时,打出来的包在编辑器里运行显示粉红(查看材质可以发现并不是丢失材质和shader),但在手机正常,原因同上。
再使用profiler查看,可以发现可以被物体共用了,随着物体数量的增加也不会产生多个实例。(下图有两个是因为编辑器中跟踪到了这个,也算一个引用)
这时解包模型的ab,也不会看到被打进中了,它们只存在与自己的包中。
三、注意事项
1、细心的朋友会发现,一中我们profiler中看到的是,而二中是,这是因为是一个多变体的,而加入了GraphicsSetting-&
always included shader后,会将它所有的变体打包到游戏中。
2、在测试打包的过程中我发现一个有趣的现象--- unity5.4和4.x打包后的shader解包(非依赖打包)出来看起来不一样:
5.4没有看到代码,而是看到GPUProgramID
而4.7是直接看到代码
结合最新更新的unity5.5的更新日志,似乎可以看出点端倪:
.com/cn/unity/whats-new/unity-5.5.0
---Shaders: Shaders are now exported to the Unity player completely in binary. There is no Shader text string and parsing in run time.
3、关于内置
如果没有设置到GraphicsSetting-& always included shader中,那么会打包到依赖它的中,如果设置了就不会打包进去。而是再构建的时候,就导入到你的游戏。
4、手动设置加入很麻烦,怎么办?
其实是可以使用代码设置的:
[csharp]&&
5、加入的是开始游戏的时候就全部编译了吗?
答案是不会,加到always include&的,会将的所有变体打包到游戏,用到的时候才会加载用到的变体到内存!需要预加载变体可以使用:
相关文档:
值得注意的是unity5.x内置的 &是一个有成千上万变体的,要谨慎的把它加入到-&
always included shader,因为中的原因,会使得你的包体非常大,打包也非常耗时。至少在我测试下是一直卡在这个界面到下班都没有响应。。
文档里面也有提到:
6、关于加载和预热的一些资料:
本文已收录于以下专栏:
相关文章推荐
1、我们一般把资源和代码作为两个工程。资源工程导出assetbundle供代码工程使用。这么做主要是防止资源过多导致代码工程启动速度慢,影响开发效率。
2、尽量避免使用Resources文件夹。这个...
转载请注明出处!  打包AssetBundle时,不注意的话,某些Shader是无法打包到AssetBundle中的。这两天一直被这个问题困扰,抽空就研究了一下。  Unity打包Assetbundl...
丢失效果如下:
解决办法:
经过上面的设置后,然后再打包,就成功解决内置的shader丢失的问题FR:海涛高软(QQ技术交流群:)
shader打包AssetBundle总结
最近比较忙,好久没有更新博客了,新项目切换到unity5.x后使用了新的打包机制,在打包shader的时候遇到了一些问题,这里来记录一...
http://blog.csdn.net/aceyan0718/article/details/
unity5.x  shader打包AssetBundle总结
最近手痒痒,老是想跟着大大们从头到尾撸项目。无奈身为一个美术屌丝,大大们都是看不上我的。
只好自己做个项目练练手,其实也有好处:
一来可以算是从头学习:之前有过一段时间的迷茫期,不知道怎么该怎么学习。...
在手游的运营过程中,更新资源是比不可少的。资源管理第一步是资源打包。传统的打包可以将所有物件制成预设Prefab,打包成场景。今天我们来一起学习官方推荐的Assetbundle,它是Unity(Pro...
1 游戏API简介    MIDP 2.0相对于1.0来说,最大的变化就是新添加了用于支持游戏的API,它们被放在javax.microedition.lcdui.game包中。游戏API包提供了一系...
版本:unity 5.4.1  语言:Unity Shader
Shader Forge版本:1.32
在具体介绍Shader之前准备再写一篇有关于ShaderForge的,虽然我们可能使...
他的最新文章
讲师:刘文志
讲师:陈伟
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)之前遇到了一件事情就是打包安卓的ab后,unity在editor启动下,加载出来的abshader丢失,其实发布安卓后运行是正常的,当时还纠结了半天,还写了个重新赋值的脚本
下面是unity开发的一些注意事项
=======================================================================================
1、我们一般把资源和代码作为两个工程。资源工程导出assetbundle供代码工程使用。这么做主要是防止资源过多导致代码工程启动速度慢,影响开发效率。
2、尽量避免使用Resources文件夹。这个文件夹就相当于一个系统默认的AssetBundle。只不过不能增量更新。它会严重影响打包速度。我们把资源从Resources移出来后,打包时间从半个多小时,减少到2~5分钟。
2、Shader都要加入到Proejct Settings--Graphics--Always Included Shaders中。否则代码工程中没有使用到的Shader可能会被裁剪,导致的问题是Shader丢失。
3、Shader要打包到一个AssetBundle中,即Shader需要指定一个AssetBundle包名。如果Shader没有指定的话,那么每个AB包都会包含这个Shader。一方面造成资源浪费。另一方面当Shader被修改的时候,所有的模型都需要重新导出。另外由于我们代码工程里面肯定也维护了一份Shader,模型实际使用的Shader是它自己包内的,不是代码工程的Shader。
& & & 这里要注意,2和3必须都要做。之前我认为加入到Always Included Shaders中,Unity打包ab的时候就不会打包Shader。然而并不是这样。这个列表只负责预先加载Shader。防止资源被裁剪,以及临时加载造成的卡顿。
4、Unity打包后的Shader是平台相关的,Editor下是无法直接使用的。所以Editor下加载AB包中的模型或特效会出现Shader错误。这个时候需要重新指定一下Shader,即遍历所有的Render把Material的Shader重新附下值。
阅读(...) 评论()

我要回帖

更多关于 unity加载assetbundle 的文章

 

随机推荐