关于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文件夹里。

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 02:14:43

关于AssetBundle,Shader丢失的问题的相关文章

Unity切换到安卓平台Shader丢失

Unity安卓平台shader平台丢失 Unity的工程切换到Android平台后,运行游戏出现shader丢失 解决办法:在Unity桌面图标的快捷方式后添加 -force-gles20 示例:"C:\Program Files\Unity_5_3_7_p4\Editor\Unity.exe" -force-gles20 原文地址:https://www.cnblogs.com/zhaoqingqing/p/10150959.html

Unity场景打AssetBundle包,加载后天空盒材质丢失问题及解决

环境:win10, Unity2018, vs2015 最近在研究把场景打成AB包进行加载但是发现之前设置的天空盒,这样加载场景后就一片粉了 其实就是材质shader丢失导致天空变粉如上图,如果是直接在Unity里运行这个场景当然是没问题的 那么要解决这个问题,需要几个步骤,还要借助代码(注:这只是我个人的解决办法) Graphics设定Unity菜单:Edit->Prject Settings->Graphics注意在Always Included Shaders选项里把这个Skybox用的

AssetBundle使用心得(转)

使用Assetbundle需要考虑的问题 Assetbundle资源打包时需要考虑如下几个问题: 1.如何有效地将依赖资源完整打包?如何减少资源重复打包,同时保证加载时不会导致内存超标? 2.如果多个资源打包在一个Assetbundle中,如何通过指定资源名查找定位到对应Assetbundle包名并加载? 3.创建多份相同资源(如副本中刷出多个相同的怪)GameObject时,想做到只加载一次Assetbundle和Prefab,提升加载效率,降低内存,如何设计缓存机制? 4.Assetbund

空Shader重新指认工具

using UnityEngine;using UnityEditor;using System.Collections; public class CheckCharacterShader : EditorWindow{ /// <summary> /// 检测Character材质是否丢失shader丢失后重新指认 /// 请把脚本拷贝到Editor文件件下右键执行 /// </summary> static CheckCharacterShader listWindow; p

关于unity 中使用AssetBundle加载资源,shader偶尔会丢失的问题解决办法

问题描述: 因为项目中要进行热更新设计,所以用unity官方推荐的打包方式assetbundle进行打包,打包好了以后再电脑上运行正常,但是当发布到android上后发现偶尔场景背景会出现空白,多方查找,发现unity存在使用assetbundle加载资源会丢失shader的问题.网上找了一些解决方式,测试可用,分享出来. 方案一:(亲测可用) 第一步,在将用到的Shader加到Editor->Graphics Settings的Shader列表里再进行打包(依赖打包) 第二步,在代码中给sha

OpenGL ES2.0 shader内部return语句返回失败和数据精度丢失,花屏问题

最近客户反映遇到我们的产品一个很奇怪的问题,字体花屏现象 shader使用两张纹理贴图(图标和文字纹理)做多重纹理映射时,部分手机出现花屏现象,dicard后不起作用,后面的语句继续执行 添加了return语句同样问题 纠结了两三天,今天终于查出原因,如题 shader内部return语句返回失败和数据精度丢失,大部分手机一切正常. 问题机器型号ID: HM2013022 ANDROID.VERSION.RELEASE: 4.2.1 GL_VERSION: OpenGL ES 2.0 build

assetbundle 对自定义shader的打包

http://docs.unity3d.com/Manual/managingassetdependencies.html Managing asset dependencies Any given asset in a bundle may depend on other assets. For example, a model may incorporate materials which in turn make use of textures and shaders. It is pos

Unity5 Shader Stripping 导致 LightMap 全部丢失的解决方法

当使用 SceneManager.LoadScene 的时候,会自动载入LightMap 和 NavMesh的数据.然后再对MeshRender 进行指定 LightMapIndex 以及 LightMapScaleOffset 就可以了. 这真是很方便的一个功能. 以上是前提. http://www.magicsite.cn/blog/Windows/cpp/cpp64011.html 迷惑了一下午+一晚上. 在Graphic 设定面板上看到一个 Shader stripping设置…… 这让

解决AssetBundle包加载预制体时,Shader显示异常的问题

现象: 预制体上的粒子效果显示为紫色方块. 原因:shader在打成AB包后与指定平台产生相关性,Editor中无法正常读取. 解决办法: 遍历所有加载的对象,重新赋值Shader 代码: //修正shader不正确的问题 public void ShaderRecover(GameObject obj) { if (obj == null) return; Image[] images = obj.GetComponentsInChildren<Image>(true); for (int