5

Unity应用在手机息屏或切入后台时与正常运行之间的区别

 1 year ago
source link: https://blog.uwa4d.com/archives/TechSharing_310.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

1)Unity应用在手机息屏或切入后台时与正常运行之前的区别
​2)PSD转Prefab方案的流程
3)HUD UI的资源加载问题
4)2021.3 Android从AssetBundle中加载视频播放失败问题


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

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

Android

Q:想请教一下各位,Unity应用在手机息屏或者切入后台时与正常运行之间有哪些区别?除了不需要渲染,是否会降帧运行呢?网络通讯会受影响吗?有没有可能在编辑器上模拟这种息屏或者切后台的效果?

A1:在Android中,Unity是作为Activity运行的,在息屏或者切入后台后,Activity会被暂停。Unity会依次收到OnApplicationPause和OnApplicationFocus这两个事件。

网络通讯肯定是会受到影响的,在模拟上可以复现这种情况。

感谢萧小俊@UWA问答社区提供了回答

A2:iOS是假后台,渲染会暂定,网络会延迟一段时间后断开,必须有断线重连机制。

现在Android系统,如果发现APP占用内存大、耗能较高,也会被kill掉,建议监听进入后台事件,进行相应的同步处理,方便后台拉起到前台继续游戏。

感谢郑骁@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/62fb5bb89a8289532640adef


Q:找到了一个PSD转Prefab开源的插件:https://github.com/zs9024/quick_psd2ugui

该方案的思路:
1. 使用PS的内置脚本导出PS中的图片、文字为一份配置文件(需要命名规范)。
2. 使用Unity编辑器解析配置文件,生成UGUI。

问题:
如果以PSD作为Prefab的源文件,原则上就不能手动修改Prefab了,所有改动都必须通过修改PSD来完成,那么PSD的规范就需要支持Unity的所有组件。如果大型项目组件很多,感觉不太现实。

如果PSD不作为源文件,前端可以进行Prefab的修改,但是后续有任何改动都不能再使用该工具导出。游戏开发如果是先用临时界面完成开发的,这种情况下工具几乎就完全用不上。

想请教有经验的同学,上面的情况怎么处理才能使该流程通顺?

A1:我们之前一般只有做新功能的时候,才会用PSD2UGUI。因为动效、性能、遮罩等因素,Prefab是不能直接使用的,需要做UI的人进行单独调整。之后一般小的改动就直接在Prefab上改了,毕竟再走一遍流程还是比较浪费效率的。

其实可以看一下FairyGUI,然后美术工程全部交由美术管理,效率上会高一点。

感谢萧小俊@UWA问答社区提供了回答

A2:理想是美好的。
现在PSD转NGUI、UGUI、FGUI的方法都大同小异,解析PSD文件中的节点,生成对应UI框架的配置文件,例如Prefab、XML等。题主的想法挺好,但是实现成本较高。

第一点,一般美术来制作PSD,如果作为UI源文件,就需要PSD支持自定义属性,其实就是在PS里写插件来做一些自定义功能,或者在图素命名的时候,就要规范功能性的内容,方便后续解析。也要根据图层来组织UI的结构,这对UI美术来说成本极高。

第二点,做一套Livelink机制,PS修改后实时刷新Prefab。后续需求来了,也要刷新Prefab实例化之后的GameObject。

第三点,PSD2UI做完了,如果进行微调,肯定在引擎里最方便,转身找美术从PS开始流程有点繁琐了,是不是还要做一套UI2PSD?

第四点,总会有一些只能在引擎里表达的节点在PS里无法表达,这一部分二次开发量也不小。

整体算下来,这一套工具链从制作到落地,再到后期维护,有点得不偿失。

感谢郑骁@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/632d6d00e73cb53fa4da183a


AssetBundle

Q:想请问一下HUD UI的资源加载问题是怎么处理的,我现在用的URP管线,AssetBundle包的模式,功能已经实现了,但是打AssetBundle资源以后加载出来显示不正确,我想请问下这个有没有什么解决方案?

A1:Shader丢失?先判断Resouce模式加载是否正常,Editor中用AssetBundle加载是否正常,不过大概率是Shader没打进包内。

感谢Knight-132872@UWA问答社区提供了回答

A2:可能原因:Shader变体丢失,未打进AssetBundle里。打包时Shader和UI未进行依赖关系绑定。加载时,依赖的Shader未Load。

感谢郑骁@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/632846ac8d3e026b0d390433


Video

Q:在Unity 2021.3版本下,Android从AssetBundle中加载视频播放 AndroidVideoMedia::OpenExtractor could not translate archive

1. 使用的版本是Unity 2021.3.8
2. 在打包视频的时候设置了不压缩
3. AssetBundle放在StreamingAssets目录下
4. 相关代码

    btn.onClick.AddListener(() =>
        {
            AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/assetbundle/videos"+ "/1109.ab");
            Debug.Log(ab == null);
            videoPlayer.clip = ab.LoadAsset<VideoClip>("1109");
            videoPlayer.Play();
        });
///build
 BuildPipeline.BuildAssetBundles(config.OutPath, BuildAssetBundleOptions.UncompressedAssetBundle, config.buildTarget);

出现的问题:
在Android 9.0以下手机加载视频播放不了,日志:

Unity AndroidVideoMedia::OpenExtractor could not translate archive:/CAB-8621c60d70de42f9c22e8270082bc81a/CAB-8621c60d70de42f9c22e8270082bc81a. resource to local file.  Make sure file exists, is on disk (not in memory) and not compressed.

Android 9.0以上则没有问题。

一些参考:
从论坛帖中了解如果要想从AssetBundle加载视频播放必须设置成不压缩:
https://forum.unity.com/threads/video-support-for-reading-videos-from-assetbundles-on-android.513983/

官方文档也说明了:
Unity supports playback from uncompressed asset bundles. For Android Pie and above, Unity supports playback from compressed asset bundles.

https://docs.unity.cn/cn/2021.3/Manual/android-requirements-and-compatibility.html

按照上面来说,应该是可以加载视频播放,但是还是有问题,不知道有没有道友遇到过。

另外请问各位在处理视频资源的时候是什么方案,也是打进AssetBundle,还是原封不动直接放到资源目录?

A1:一般打包时,AssetBundle作为二进制文件进行处理,不要基于AssetBundle作为资源更新的基本文件,这样很多二进制文件要单独写逻辑处理。

如果按照二进制文件处理,那么视频可直接按原格式打包进包里,就不会出现上述问题,包括Lua、静态数据表、版本号记录文件、文件MD5文件、依赖关系表等都可处理,一劳永逸。

感谢郑骁@UWA问答社区提供了回答

A2:有没有可能StreamingAssets目录被压缩了,可以从最终的APK里面的AssetBundle内存大小来Check,可以解压出APK来看AssetBundle资源的压缩前和压缩后的大小是否相同,如果相同,就没有被压缩,如果不一样,则是被二次压缩了。

1.png

感谢Xuan@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/6333b35ee73cb53fa4dfe17b

封面图来源于网络


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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK