当前位置: 首页 > news >正文

Unity3d爬坑篇(2)之Assetbundle、Shader和Keyword

Unity3d爬坑篇(2)之Assetbundle、Shader和Keyword

https://zhuanlan.zhihu.com/p/77635689

Unity3d爬坑篇(2)之Assetbundle、Shader和Keyword

奶泡泡

奶泡泡

猫/游戏全栈开发/心理咨询/名侦探

本系列基于:BDFramework 、Unity3D 2018.4.0

BDFramework:Simple! Easy! Beautiful! This is a powerful Unity3d game workflow!

框架地址:

GayHub: yimengfan/BDFramework.Core,

码云 : yimengfan/BDFramework.Core欢迎赏星。

第九艺术 、第十艺术讨论群 : 763141410

爬坑关键字,方便其他小伙伴搜索: Assetbundle Shader异常, keyword Assetbundle打包。

题外话:最近比较忙,又开了新坑UniReact,一个react思想的unity实现版本。主要是为了重整UI的工作流,和提高ui的工作效率。并不是翻译+实现的实验产品。可能很多小伙伴要喷了,什么游戏ui和app webui不一样,游戏ui复杂...也正是这种心理 ,才导致游戏UI开发十分落后和混乱(大部分游戏ui开发停留在网页三剑客时代的水平),这里我就不多说了,等我后面博文发出来,再深入喷我吧...

进入今天的主题,如果你问我,人能不能改变自己的命运,我不晓得,我只晓得出包就是我的命.

0x001:问题引出

首先,我们遇到了这样的问题 : 打包成AssetBundle后,移动端现实的效果异常,具体怎么个异常法,比较随机:

于是乎我们开始苦逼排查:

1.Shader的平台性问题(此时的shader并没打成ab):经过我们验证,pc端切换到Android平台,加载Android的ab包,显示正常。此时就很纳闷,why?

当时我们认为,shader没有带进包体。

2.于是乎我们就提出第二个问题:Android上Shader怎么打进包体,并被正常引用的?

无论怎么百度,你都会得到下面的结果:

大家都会一堆的,往这上面答。当时我想,这个是打包时候需要带进包体的shader。当时我就内心一顿mmp,发出灵魂3问:莫非在我发完版本之后就不能使用新shader了?使用新shader只能重新发包?Shader不能打Assetbundle?

于是乎,半小时后,enmmmm,我觉得能用就行了,解决包要紧,包要紧.

即使这样,也是接着狗带 ,再次尝试失败。

3.于似乎,我只能去google搜shader和Assetbundle的问题了。

当时我内心各种wtf,老外不做热更的么?老外不打 Assetbundle的么?

终于我在Unity的社区里,找到了关键字Keyword。

0x010: Keyword

首先,想看到keyword,你需要在inspector下进行卐解:

这时候 你打开材质球,就能看到 keyword

keyword,你可以看成是Shader中的一种特殊宏。一般内置shader会在面板上很多选项,选项开关,就产生一个shader变体。而我们打包shader时候,并没有打包正确的shader变体,所以shader会 显示,但是不正常,是因为keyword丢失。

关于Keyword又要解释:multi_compile与shader_feature,

关于更多的解读,看下面这个链接:

https://blog.csdn.net/RandomXM/article/details/88642534​

blog.csdn.net

 

我们主要关心怎么解决这个问题。

问题找到后,我们就更好处理了,顺便还解决我们上面两个疑问:

1.shader可以单独打包成ab,所以建议把unity内置shader全部放到项目工程中 !!!(这个很重要)

像这样的当个勇士!!!

2.关于keyword怎么打包进AB。
首先你需要一个.ShaderVariant 文件,这个可以自行百度。然后选择Shader 自己手撸Keyword完事~

然后需要把这个ShaderVariant 和对应shader打包到一个ab包中,会自动加载。这样keyword就正常了~~

最后:

你以为这样就完事了?太天真了吧!!!

一个项目中,百来个Shader总要用的吧,然后 每个shader,多少变体,特别 unity内置shader,一堆keyword,总计变体几十万个,你还需要一个个手撸?

当然BDFramework,送了你一个大礼包啊~

一键收集 Keyword,0冗余~

关于编辑器过程 ,还是比较复杂的,先是刷了所有使用到的keyword,然后和shader本身求交集,再把keyword 输出到ShaderVariant文件。

中间,还有很多坑,比如获取shader keyword的接口是私有的,只能反射调用。

....

然后BD默认策略,是收集所有使用的shader和keyword,打包成一个ab,游戏启动一次性加载~

有兴趣的小伙伴可以去看源码,这里就不赘述,

主要记住Shader打包Assetbundle的问题,方便各位小伙伴排查错误~

 

最后,祝大家天天不用加班!!!!!

 

 

 

 

 

 

相关文章:

  • Unity AssetBundle Shader
  • Shader变体使用策略
  • AndroidStudio Gradle Plugin 下载失败
  • [原创]安卓U3D逆向从Assembly-CSharp到il2cpp
  • Unity Android il2cpp
  • Unity 找到原因了,如果你在Update里Instantiate一个prefab,上面的脚本会在这个update后执行start,然后执行lateupdate,这帧的update会被跳过
  • Unity -- Error
  • Unity iOS 删除 UIWebView
  • Jenkins 自己使用
  • Jenkins Pipeline语法(中)
  • Unity小技巧——设置代码编译时机
  • Unity 使用遇到的不足问题
  • 在eclipse中安装groovy插件详细步骤
  • Groovy 语言快速入门
  • Groovy常用语法总结
  • 0基础学习移动端适配
  • FineReport中如何实现自动滚屏效果
  • gf框架之分页模块(五) - 自定义分页
  • HTTP--网络协议分层,http历史(二)
  • JavaScript 基本功--面试宝典
  • js递归,无限分级树形折叠菜单
  • Kibana配置logstash,报表一体化
  • ReactNativeweexDeviceOne对比
  • Redis 中的布隆过滤器
  • 从tcpdump抓包看TCP/IP协议
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 基于webpack 的 vue 多页架构
  • elasticsearch-head插件安装
  • 说说我为什么看好Spring Cloud Alibaba
  • ​2021半年盘点,不想你错过的重磅新书
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • # 数据结构
  • #if #elif #endif
  • #微信小程序(布局、渲染层基础知识)
  • (16)Reactor的测试——响应式Spring的道法术器
  • (C)一些题4
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (Note)C++中的继承方式
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (过滤器)Filter和(监听器)listener
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (四) Graphivz 颜色选择
  • (五)网络优化与超参数选择--九五小庞
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)shell调试方法
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .net CHARTING图表控件下载地址
  • .net生成的类,跨工程调用显示注释
  • @property @synthesize @dynamic 及相关属性作用探究
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [1204 寻找子串位置] 解题报告