关于AssetBundle,Shader丢失的问题

从Unity4.2开始,为了减少首包大小,不会默认将所有Shader引擎加到游戏程序中,据Unity技术支持人员所说,Unity会将Shader引擎打包到Assetbundle资源中,但是我测试发现不行(可能是我打开方式不对...),不过只要将用到的Shader加到Editor->Graphics Settings的Shader列表里再进行打包即可。

直奔问题,unity的assetbundle是对资源的管理方式,但是会有一些注意的地方,对于具体的打包的使用详细看Unity AssetBundle爬坑手记。下面说一下依赖打包后对于移动设备上出现的一个问题:

依赖打包后,进行加载时却发现丢失,但是贴图信息还在。如图:


在发现对于shader却报了一个错


目前错误是使用的unity的unlit/transparent cutout,通常我们的解决办法是,在将用到的Shader加到Editor->Graphics Settings的Shader列表里再进行打包即可,然后用下面的脚本的方法去解决:

public class FixShader : MonoBehaviour {

    private List<Material> thisMaterial;
    private List<string> shaders;
 
    void Start ()
    {
        thisMaterial = new List<Material>(6);
        shaders = new List<string>(6);

        MeshRenderer[] meshRenderer = GetComponentsInChildren<MeshRenderer>();
        int length = meshRenderer.Length;

        for (int i = 0; i < length; i++)
        {
            int count = meshRenderer[i].materials.Length;
            for (int j = 0; j < count; j++)
            {
                Material _mater = meshRenderer[i].materials[j];
                thisMaterial.Add(_mater);
                shaders.Add(_mater.shader.name);
            }
        }

        SkinnedMeshRenderer[] meshSkinRenderer = GetComponentsInChildren<SkinnedMeshRenderer>();
        length = meshSkinRenderer.Length;

        for (int i = 0; i < length; i++)
        {
            int count = meshSkinRenderer[i].materials.Length;
            for (int j = 0; j < count; j++)
            {
                Material _mater = meshSkinRenderer[i].materials[j];
                thisMaterial.Add(_mater);
                shaders.Add(_mater.shader.name);
            }
        }

       
        for( int i = 0; i < thisMaterial.Count; i++)
        {
            thisMaterial[i].shader = Shader.Find(shaders[i]);
        }
    }
}
这样是解决了丢失问题,但是自己编写一个shader,或者使用一个shader时,总不能每次都用去进行 Editor->Graphics Settings里去添加shader,然后在进行发包。如果不进行添加或者忘记添加,发布在移动设备后还是会丢失。

那对于编辑的shader的解决方法是

1.依赖打包
2.shader放到Resources文件夹,必须是Resources文件夹里。

对于资源的热更新,难免有新的shader进行使用,要考虑到对shader的热更新来解决。主要丢失的原因是预加载失败。

如有不当之处,还请指教补充。





 

以下是可能会问到的一些 Cocos Creator Shader 的面试问题: 1. 什么是 ShaderShader 是一种在 GPU 上执行的程序,用于控制渲染管道的不同阶段,从而实现高级的图形效果。 2. Cocos Creator 中的 Shader 是什么? Cocos Creator 中的 Shader 是一种用 GLSL 语言编写的脚本,用于控制渲染管道的不同阶段,以实现各种图形效果。 3. Cocos Creator 中的 Shader 有哪些阶段? Cocos Creator 中的 Shader 有三个阶段:顶点着色器、片段着色器和几何着色器。 4. 什么是顶点着色器? 顶点着色器是 Shader 中的一部分,用于将 3D 对象中的每个顶点转换为屏幕坐标,并对每个顶点应用一些变换(如旋转、平移、缩放等)。 5. 什么是片段着色器? 片段着色器是 Shader 中的一部分,用于计算每个像素的颜色值,并在屏幕上呈现出 3D 对象。 6. 什么是几何着色器? 几何着色器是 Shader 中的一部分,用于在渲染管道中的几何阶段中对顶点进行更高级的操作,例如几何变换和顶点剪切。 7. Cocos Creator 中的 Shader 如何与材质一起使用? Cocos Creator 中的 Shader 可以与材质一起使用,通过在材质的属性面板中选择 Shader 并设置 Shader 的属性来实现各种图形效果。 8. 如何在 Cocos Creator 中创建自定义的 Shader? 在 Cocos Creator 中创建自定义的 Shader 需要编写 GLSL 代码,并在项目中创建一个新的 Shader 资源文件。然后,将编写的 GLSL 代码复制到 Shader 资源文件中,并在编辑器中设置 Shader 的属性。 9. Cocos Creator 中的 Shader 如何进行优化? Cocos Creator 中的 Shader 可以通过使用纹理压缩、减少计算量、使用简单的算法等方式进行优化,以提高渲染性能和效率。 以上是一些可能会问到的 Cocos Creator Shader 的面试问题,希望能对你有所帮助。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值