着色器从构建里消失的那一天
在 Unity 编辑器里,一切看起来都完美。在做好的构建里:表面是粉红色的,特效也不见了。欢迎来到 Unity 最讨厌的陷阱之一——还有它的几个“亲戚”。
着色器剔除。构建时,Unity 会扔掉所有看起来用不上的东西——包括着色器。问题在于:如果你在运行时用 Shader.Find() 来加载着色器(我们就是这样加载 20 多个用于水、大气、全息影像等的自定义着色器的),Unity 在任何场景里都看不到对它们的引用。结果:着色器在编辑器里有,在构建里就没了。解决办法不起眼,却必不可少:每一个这样的着色器都必须加入图形设置里的始终包含的着色器列表。从那以后我们的规矩是:新着色器?马上加进去。
变成 -1 的那一层。类似的一类问题:我们在代码里按名称查找一个物理层。在编辑器里:能用。在构建服务器的批处理构建里:这个层不存在,查找返回 -1,所有基于这个层的东西都在悄悄地出错。从那以后,我们按固定的索引来引用层,而不是按名称。
寓意:Unity 编辑器和做好的构建是两个不同的世界。编辑器很宽容——所有素材、所有名称、所有着色器都触手可及。构建则毫不留情。所以在我们这里,对客户端的每一处改动,都要做一次真正的本地构建测试,而不是只在编辑器里按一下播放键。这样更花时间。但它还是帮我们避免了很多次尴尬的发布。
留言