1)Target API level降级到31后Android 12启动黑屏卡死
2)Unity Renderer中SortingLayer、SortingOrder底层如何实现渲染排序
3)如何用Addressable实现按需下载
4)多个Package须要不同版本的DLL的解决方案


这是第309篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)

Android

Q:以后海内版本有硬性要求:Target API level必须降级到31,降级之后在Android 12机型上启动游戏,Unity闪屏之后卡死,其余Android版本失常。

咱们应用的Unity版本:2017.4.27f
其余一些简略测试:去掉闪屏, 导出新的空工程,都会呈现启动卡死。

其余一些Unity论坛上的形式尝试均失败:
https://forum.unity.com/threa...
https://forum.unity.com/threa...

之前咱们也遇到降级之后无奈装置的问题,而后参照其余解决了装置,只是黑屏无奈解决。以后最新尝试Unity 2019版本是失常,初步判断是与以下问题同时修复的:
https://issuetracker.unity3d....

不晓得是否有其余大神遇到此问题并解决了?如果有降级之后失常,请告知一下Unity版本号,谢谢。

A:查了一下这个问题,是因为TelephonyManager的listen函数在Android 12过期了,如果没有受权READ_PHONE_STATE权限,此函数会抛出一个SecurityException。

而Unity在启用了自带的音频系统的状况下,凑巧在启动时机会去调用这个办法以实现“在用户接电话时游戏静音”的性能,抛出的异样影响了后续的流程导致卡死。

论坛上有人遇到了相似的问题,然而体现为解体:
https://forum.unity.com/threa...

我的项目能降级引擎的话,能够试试这里提到的修复的版本:
https://issuetracker.unity3d....

如果我的项目不能降级引擎,也有一个解决办法:

  • 反编译classes.jar
  • 批改UnityPlayer类的addPhoneCallListener实现,判断if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) return;据说Android 12开始不须要本人解决静音了
  • 再编回classes.jar

感激[email protected]问答社区提供了答复

Rendering

Q:Unity Renderer中SortingLayer、SortingOrder底层是如何实现渲染排序的?

A1:第一级是材质RenderQueue的区间:不通明(<2499)优先,而后半透明(>=2500)。
第二级是SortingLayer。
第三级是SortingOrder。
第四级是材质RenderQueue自身。

感激欧月松@UWA问答社区提供了答复

A2:Unity残缺渲染程序如下:

  1. CameraDepth从小到大
    开始渲染不通明物体(RenderQueue < 2500)
  2. SortingLayer从小到大
  3. SortingOrder从小到大
  4. RenderQueue从小到大
  5. 物体深度近到深度远
    开始渲染半透明物体(RenderQueue >= 2500)
  6. SortingLayer从小到大
  7. SortingOrder从小到大
  8. RenderQueue从小到大
  9. 物体深度远到深度近

感激萧小俊@UWA问答社区提供了答复

Addressable

Q:如何用Addressable实现按需下载,大体是想要实现上面两个性能:

1. 一部分资源是在游戏启动的时候去更新的。
2. 还有一部分资源是在玩家玩到某个关卡的时候,让玩家手动触发下载。当然,这些关卡,没有下载实现之前,玩家是不能玩的。

A:可参考Unity官网实例Git,其中Advanced/Play Asset Delivery这个案例很好地展现了AssetBundle和Google新格局aab的联合以及打包Asset Packs后,哪些资源预下载,哪些资源实时下载。
https://github.com/Unity-Tech...

感激郑骁@UWA问答社区提供了答复

Scripting

Q:具体情况就是Google ProtoBuf库的高版本会强制依赖 System.Runtime.CompilerServices.Unsafe.dll 4.0.4.1版本。

而后Unity内置的Package com.unity.collections会本人带进来一个DLL,并且版本不匹配。

当初有没有方法,导入一个DLL,并且只让某一个Package内的代码进行援用。或者有没有其余代替计划,比方禁止com.unity.collections带入本人的Unsafe.dll之类的流程?

其余就是思考一个流程从新编译ProtoBuf的动静库,使其内含一个本人用的依赖库。然而这个依赖库也不好找源码。

次要问题是:com.unity.collections是Unity原生并主动植入的,不进入Packages门路,间接植入到Library。所以没有方法手动调整门路。当初临时是用脚本在启动编辑器时替换Library外面的动静库。然而这个流程不洁净,心愿有个洁净的唱工。

A:先把我的项目中反复度高的DLL都放在一个Common Package中,而后把com.unity.collections拉到本地变成Local Package,再去依赖Common Package,最初就让Google ProtoBuf也去依赖这个Common Package。

对于Unity原生并主动植入的Package,个别从Library拉到本地就行,留神一下最初的package-lock.json文件中com.unity.collections的Version为file:XXXXX,并且Source显示为Embedded就代表胜利了。

感激萧小俊@UWA问答社区提供了答复

封面图来源于网络


明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官网技术博客:blog.uwa4d.com
官网问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官网技术QQ群:793972859(原群已满员)