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

问题描述:

因为项目中要进行热更新设计,所以用unity官方推荐的打包方式assetbundle进行打包,打包好了以后再电脑上运行正常,但是当发布到android上后发现偶尔场景背景会出现空白,多方查找,发现unity存在使用assetbundle加载资源会丢失shader的问题。网上找了一些解决方式,测试可用,分享出来。

方案一:(亲测可用)

第一步,在将用到的Shader加到Editor->Graphics Settings的Shader列表里再进行打包(依赖打包)

第二步,在代码中给shader再次赋值,代码如下:

public static void ResetShader(UnityEngine.Object obj)

{

List<Material> listMat = new List<Material>();

listMat.Clear();

if (obj is Material)

{

Material m = obj as Material;

listMat.Add(m);

}

else if (obj is GameObject)

{

GameObject go = obj as GameObject;

Renderer[] rends = go.GetComponentsInChildren<Renderer>();

if (null != rends)

{

foreach (Renderer item in rends)

{

Material[] materialsArr = item.sharedMaterials;

foreach (Material m in materialsArr)

listMat.Add(m);

}

}

}

for (int i = 0; i < listMat.Count; i++)

{

Material m = listMat[i];

if (null == m)

continue;

var shaderName = m.shader.name;

var newShader = Shader.Find(shaderName);

if (newShader != null)

m.shader = newShader;

}

}

经过这两步后,基本可以解决丢shader问题。

方案二:

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

方案二是我在网上看到的,其实方案一用的也是依赖打包,shader虽然没放到Resources目录下,不过也没有再出现丢shader的问题。

我刚才说“基本可以解决”丢shader问题,是因为还有一些情况是没有解决掉的,如下:

一、spine动画资源

在把spine动画资源进行了依赖打包后,发现总是会丢失材质(shader),使用方案一,方案二都无效,因为spine动画资源是做成prefab的,依赖也都加载了,依赖加载顺序也没错,关键是丢材质(shader)的情况不是必现,所以就很难查到问题。无奈只好只打包spine动画资源原文件(.json,.atlas,.png三个文件),然后在代码中创建spine组件,初始化。不过问题又来了,那就是创建spine组件很耗时,加载方式也只能改为预加载,虽然这个解决方式并不满意,但因为没有找到更好的方式,就暂时先这样。至于,spine动画在代码中创建的方法,会另写博文与大家分享。

二、NGUI的图集有时会丢材质(shader)

这个现象也不是必现的,在电脑上一切正常,但发布到android上就有一定的几率会丢材质(shader),试了几次都不行,就把图集放到了Resoures目录下,用Resoures.Load进行加载。

在此也发一下求助,有能解决这两个问题的好方案,还请您不吝赐教!先行谢过。

欢迎大家评论指正,很乐意与大家一同成长。

时间: 2024-08-25 21:10:40

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

Unity中场景异步加载

引入命名空间 using UnityEngine.UI; using UnityEngine.SceneManagement; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; //引入命名空间 using UnityEngine.SceneManagement;//引入命名空间 public class S2Manager : MonoBeha

Android应用程序UI硬件加速渲染的预加载资源地图集服务(Asset Atlas Service)分析

我们知道,Android系统在启动的时候,会对一些系统资源进行预加载.这样不仅使得应用程序在需要时可以快速地访问这些资源,还使得这些资源能够在不同应用程序之间进行共享.在硬件加速渲染环境中,这些预加载资源还有进一步优化的空间.Android系统提供了一个地图集服务,负责将预加载资源合成为一个纹理上传到GPU去,并且能够在所有的应用程序之间进行共享.本文就详细分析这个预加载资源地图集服务的实现原理. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 资源预加载

Egret制作Loading页面及分步加载资源教程

我们都知道,当游戏越做越大,资源越来越多的时候,加载资源会造成大量时间的浪费.为避免加载资源时游戏黑屏,导致玩家误认为游戏非正常运行,Loading界面起到至关重要的作用.今天就为大家带来用Egret制作Loading页面及分步加载资源的教程. 本文涉及以下内容: · RES加载Loading界面所使用的资源· 分步加载资源 加载LoadingUI所需要的资源 把LoadingUI所需要的资源配置到default.res.json的loading组中,组名任意.如下: 在Main.ts修改loa

Unity之如何从AssetBundles加载资源

加载和卸载资源包 (AssetBundle) 中的对象 使用下载的数据构建资源包 (AssetBundle) 对象后,可以使用三种不同的方法加载其中包含的对象: AssetBundle.Load 会将其名称标识符用作参数加载对象.其名称即工程 (Project) 视图中显示的名称.可选择将对象类型作为参数传递到 Load 类函数,确保加载的是特定类型的对象. AssetBundle.LoadAsync 的作用原理与上述 Load 类函数相同,但不会在加载资源后阻塞主线程.此方法对于加载较大资源或

升级MAC OS到10.13, 10.14系统后UNITY工程无法加载资源的解决办法

升级MAC OS到10.13, 10.14系统后,出现UNITY工程无法加载资源的情况: Unity项目中Asset目录显示为空! 解决办法一: 打开Launchpad中的磁盘工具 (也就是实用工具下的"磁盘工具") 新建一分区,名称大小任意,格式为MAC OS 扩展(日志式) 将unity工程移至新分区 OK,工程已经可以正常加载了 解决办法二: 1. 升级Unity版本 (如Unity5.6.6, Unity 2018.1 均可以)   2. 安装相应的补丁版Unity3D 参考链

unity3d Resources.Load动态加载资源

初步整理并且学习unity3d资源加载方法,预计用时两天完成入门学习 Unity3d常用两种加载资源方案:Resources.Load和AssetBundle Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源 而一般AssetBundle文件需要你自己创建,运行时动态加载,可以指定路径和来源的.其实场景里所有静态的对象也有这么一个加载过程,只是Unity后台替你自动完成 一:Resources.Load:使用这种方式加载资源,首先需要下Asset目录下创建

AssetBundle加载API

AssetBundle加载API 在Unity 5当中,可以通过4个不同的API来加载AssetBundle,4个API可以用两个条件来区分: AssetBundle是 LZMA压缩. LZ4压缩还是不压缩的 加载AssetBundle的平台 这4个API分别是: AssetBundle.LoadFromMemoryAsync AssetBundle.LoadFromFile WWW.LoadFromCacheOrDownload UnityWebRequest 的 DownloadHandle

WebGL AssetBundle 加载 缓存

U3D的AssetBundle真的是博(坑)大精(坑)深啊 安卓的话要先打包到StreamingAssetPath中,安装后第一次运行,自动把Streaming 中的解压到PersistentDataPath中,因为persistent目录是在运行过一次才创建的. 这样,之后再更新资源就直接下载到persistent目录下了 但是,WebGL项目呢 这个就不存在什么streaming或者persistent了,因为不能加载本地路径 所以就只有缓存,加载包时就要用 WWW.LoadFromDown

Spring boot 国际化自动加载资源文件问题

Spring boot 国际化自动加载资源文件问题 最近在做基于Spring boot配置的项目.中间遇到一个国际化资源加载的问题,正常来说只要在application.properties文件中定义正确的资源文件路径,Spring boot就启动时就会自动加载资源. spring.messages.basename=i18n/message 但是我的项目修改后获取消息时系统报错,找不到对应语言的资源配置.于是试图找到原因.Google好久都没找到,简直好像就我一个人遇到这鬼问题一样??.只好自