【URP】Unity中自定义Render feature后Build模式下shader引用缺失
记录一下最近Unity项目中遇到的令人头大的bug。
问题描述
项目使用URP renderer,引入了自定义的Render feature。
编辑器中运行正常的游戏,在build后一直弹出材质未找到的log。
打开log,发现报错的信息大致如下(节选)
Cannot create required material because shader is null
UnityEngine.StackTraceUtility:ExtractStackTrace () (at C:/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs:37)
UnityEngine.DebugLogHandler:LogFormat (UnityEngine.LogType,UnityEngine.Object,string,object[])
UnityEngine.Logger:Log (UnityEngine.LogType,object)
UnityEngine.Debug:LogError (object)
UnityEngine.Rendering.CoreUtils:CreateEngineMaterial (UnityEngine.Shader) (at D:/Unity Projects/Payback_dev/Library/PackageCache/com.unity.render-pipelines.core@7.5.1/Runtime/Utilities/CoreUtils.cs:817)
HologramBlockRenderPass:.ctor ()
分析
注意到log中是自定义的HologramBlockRenderPass中出了问题。这是一个Render feature,引用了自定义的shader,但是这个shader无法引用到,猜测是在build的时候似乎没有被打包进去。
解决方案
网络上搜索到普通Unity项目的解决方法
https://www.likecs.com/show-203395921.html
1.想办法在场景中引用这个shader
2.将shader放入Resources文件夹内,并在Project Setting/Graphics中设置Always include shader.总是引用.
3.assetbundle热更新shader
参考后决定采用第二个方法,具体步骤如下。
- Edit->Project settings->Graphics
- 找到Always included shaders,将size设为相应的大小,并添加render feature里用到的shader
- Build!