前言:工程在打AB包模式后,运行结果模型的软阴影失效
一. 查看是否shader打AB包后丢失变种
分别使用AB包模式和本地资源模式运行程序,并做一下步骤
本地资源模式
步骤1:
打开Frame Debug分析器
步骤2 :
查看Frame Debug中RenderCamera节点下的Objects渲染
选中SPR Batch 查看右侧信息中的Keywords
AB包模式
明显能够看到,AB包模式中没有 _SHADOWS_SOFT 这个变体
这也就是为什么AB包模式运行后模型的阴影没有软阴影的原因
二. 通过AssetStudio排查在shader.ab内编译后的Shader文件,是否能够找到这个变体,确定这个变体实际上是否在包内
后续补充
三.解决方案
情况1:
在进行单元测试中,在一个空项目中打包uber.shader,发现打包后,变体正确。
但是开发项目和打包项目依旧生成不正确。怀疑是Unity缓存原因。
于是删除Library目录下shaderCache,再次打包,还是不正确。
再次删除已生成的AssetBundle资源,完全重新生成,终于正确。
所以multi_compile定义的关键字打包出现问题,需要删除缓存和已生成的AssetBundle才能最终正确生成新的AssetBundle。
情况2:
将Shader中的shader_feature还原成multi_compile形式
遍历场景收集变体的时候Editor是PC平台,只考虑了开启阴影+Cascade的时候的变体。
所以PC上同时存在_MAIN_LIGHT_SHADOWS和_MAIN_LIGHT_SHADOWS_CASCADE关键字,表现是正常的。
而Android机器上没开启级联阴影,所以只有这个关键字_MAIN_LIGHT_SHADOWS,其实变体没有收集到。
情况3:
也是我遇到的情况
我的项目在母包里(项目中)会有一份默认的UniversalRendererPipelineAsset
然后在AssetBundle中会存在多份不同情况下的UniversalRendererPipelineAsset
然而SoftShadow的勾选应用是在AB包里的URPAsset上的,默认的URPAsset上没有勾选SoftShadow
由于Unity在构建编译时,只会根据母包里(项目中)的所有资源来获取所用到的shader变体,才会被计入包体中,而其他的变体就会被当做未使用而被自动剔除掉(就像我这里遇到的:所有AB包里的资源所用到的shader变体是不会被Unity检测到的,因此被剔除了)
参考地址记录:【精选】如何动态获取URP设置里自定义的RenderFeatures_unity 动态开启 feature-优快云博客