打开网易新闻 查看更多图片

这是第245篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com

UWA QQ群2:793972859(原群已满员)

本期目录:

  • Addressable编辑器相关开发问题
  • Addressable动态设置更新地址
  • Addressable在网络差的环境中下载资源
  • Android ETC2 Fallback的疑问

  • 内置Shader中“Dependency”的定义

Addressable

Q:我想通过编辑器脚本来做自动导入下图这个选项并打钩,能自己设置相关的Key。有没有参考的工程或代码示例?谢谢!

A:用AssetDatabase.AssetPathToGUID和AddressableAssetSettings.CreateOrMoveEntry。

感谢老王@UWA问答社区提供了回答,欢迎大家转至社区交流:

https://answer.uwa4d.com/question/60616b62f2c8273bbbf2a648

Addressable

Q:Addressable动态配置的热更新地址,使用了文档里面的静态变量 (放大括号里),Addressable启动后获取到的Catalogs.Count一直为零,怀疑是地址的问题,有没有要求这个类也是静态的?

打开网易新闻 查看更多图片

如果我配死地址,是能更新下来的,比如这样:

这种更新已经测试通过,目前是想在生成首包后动态去改这个RemoteLoadPath。

A:我们是这样子的,RemoteLoadPath指向一个static的property,这个property从配置表里返回资源更新的地址。

感谢jim@UWA问答社区提供了回答,欢迎大家转至社区交流:

https://answer.uwa4d.com/question/6065c723afbc233466c02cf7

Addressable

Q:我们使用Addressable来做资源的热更新。现在模拟了一个较差网络环境下的下载资源情况,使用Windows上模拟丢包的软件模拟了网络环境,丢包率设置为30%。

Addressable的下载会卡死在某个百分比,DownloadDependenciesAsync的Completed事件不会被触发,所以无法通过AsyncOperationHandle的status判断是失败还是成功。

Log显示的报错是:

请问这种情况有什么好的解决方法吗?

A:后来发现是有几个资源的Time Out值设置得太大了,导致一直在等待,所以进度条卡死。解决方法是将Time Out值设置的小一点,并增加retry次数。

我Time Out设置的是20。感觉不宜太长,否则超时的时候下载进度感觉会长时间卡死;太短的话,移动网络太差,也经常会超时导致超时下载失败。

感谢题主jim@UWA问答社区提供了回答,欢迎大家转至社区交流:

https://answer.uwa4d.com/question/605bfa43cfa35d5b53669c47

Editor

Q:我们的游戏在模拟器上运行一会儿就会崩溃,怀疑是图片被解压成RGBA32导致内存过大产生的崩溃。Android ETC2 Fallback设置为16 bit是不是能够大幅降低在低端手机的内存占用呢?

另外我在Build Setting选择ETC2 Fallback后,Project Setting没有任何变化,这个值是保存在哪里的?应该怎么上传?(版本:Unity 2018.4.31)

A:模拟器一般内存都够的,如果怕是内存问题可以调整一下分配给模拟器的内存。最好还是连上Logcat看一下Log,是因为内存问题,还是32位或者64位应用的问题,又或者是64位LuaJit之类的问题。这个值存在Library\EditorUserBuildSettings.asset文件中。

感谢郑骁@UWA问答社区提供了回答,欢迎大家转至社区交流:

https://answer.uwa4d.com/question/6062e8bdafbc233466c02cb5

Shader

Q:正在尝试自定义Terrain的Shader,发现内置Shader的末尾有这样两行,想问问其中的“Dependency”是做什么用的,后面指定的Shader起什么作用?

Dependency “AddPassShader” = "Hidden/TerrainEngine/Splatmap/Diffuse-AddPass"

Dependency “BaseMapShader” = “Diffuse”

A:Dependency是一个未文档的关键词,其用于指定Shader依赖关系,实际作用有两个:

  • 打包的时候依赖不会遗漏,可以通过AssetBundle Browser验证。

  • Unity 2019之后可以通过C#接口Shader.GetDependency(等号左侧依赖名) 获取等号右侧Shader名。

地形系统那么做,是因为有三种光照模型,通过GetDependency(依赖名) 可以减少一些Shader名的硬编码,依赖名充当了接口的作用。

感谢庄沁@UWA问答社区提供了回答,欢迎大家转至社区交流:

https://answer.uwa4d.com/question/5ab8b537d35eb22c10a0a426

封面图来源于网络

今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com

官方技术博客:blog.uwa4d.com

官方问答社区:answer.uwa4d.com

UWA学堂:edu.uwa4d.com

官方技术QQ群:793972859(原群已满员)

UWA Pipeline正式上线!

近期精彩回顾 【学堂上新】Unity引擎渲染模块 【学堂上新】屏幕后处理效果系列之常见后处理效果篇 【学堂上新】URP从原理到应用——基础篇 【厚积薄发】Unity性能优化系列—渲染模块