assetbundle能不能删除_Unity3d爬坑篇(2)之Assetbundle、Shader和Keyword

6e2ddc94b06e48b81b0b4eeb85392eb5.png

本系列基于: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打包。

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

0x001:问题引出

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

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

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

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

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

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

09b3910c6712e7153fb8f060ef60e6b6.png

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

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

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

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

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

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

0x010: Keyword

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

4855e9f0a8f6eeda123aff78baf4328e.png

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

dddc5e2942ef9950417cbc1d2f193291.png

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全部放到项目工程中 !!!(这个很重要)

bb189af07d8b73e7cac7997e36de7569.png

像这样的当个勇士!!!

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

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

最后:

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

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

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

86e3bc52d9ada7a56014234daae286f9.png

一键收集 Keyword,0冗余~

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

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

....

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用一个透明度渐变的Shader来实现模型的渐变消失效果。我们可以使用Shader中的_Alpha属性来控制模型的透明度,然后通过在材质中设置透明度渐变的参数来实现渐变消失效果。 以下是一个简单的透明度渐变Shader代码示例: ```shader Shader "Custom/TransparentFade" { Properties { _MainTex ("Texture", 2D) = "white" {} _Color ("Color", Color) = (1,1,1,1) _FadeStart ("Fade Start", Range(0,1)) = 0.5 _FadeEnd ("Fade End", Range(0,1)) = 1.0 } SubShader { Tags {"Queue"="Transparent" "RenderType"="Opaque"} LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _Color; float _FadeStart; float _FadeEnd; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag (v2f i) : SV_Target { float alpha = 1.0 - saturate((length(i.uv - 0.5) - _FadeStart) / (_FadeEnd - _FadeStart)); fixed4 col = tex2D(_MainTex, i.uv) * _Color; col.a *= alpha; return col; } ENDCG } } } ``` 在这个Shader中,我们添加了两个渐变参数_FadeStart和_FadeEnd,它们分别表示渐变开始和结束的位置(0-1之间的值)。在顶点着色器中,我们使用UnityObjectToClipPos将顶点位置从对象空间转换为裁剪空间,并在片段着色器中计算模型的透明度。我们使用saturate函数将渐变参数限制在0-1的范围内,并将其应用于alpha值。最后,我们将alpha值乘以颜色值的透明度并返回结果。 要将此Shader应用于模型,请创建一个新材质,将该Shader分配给材质,并使用材质属性面板中的_FadeStart和_FadeEnd参数来控制渐变消失的位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值