开发期资源管理的策略选择

开发期资源管理的策略选择

1)开发期资源管理的策略选择
​2)iOS14启动就Crash
3)IL2CPP加密:global-metadata.dat在iOS下的解密问题
4)如何实现可程序控制的3D动作
5)Unity Editor内Screen的Width和Height


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

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

Resource

Q1:因为打包需要用AssetBundle,但是开发中用AssetBundle不太友好,以上两种加载都会有各自的问题:
Resources:需要放在Resources文件夹下,打包不好处理。
AssetDatabase:没有异步加载方法,开发中没办法模拟一些需要异步加载的情况。

目前项目用的Resources,打包机分了两个项目,打APK的项目阉割了Resources,写了单独版本管理更新命令,但是依然挺麻烦。大部分公司都是用的AssetDatabase,请问是否有一些方法可以模拟异步加载?

另外以上两种方法都无法模拟真实的卸载情况,导致组员不合理操作时,打AssetBundle后会有内存泄漏或者丢失引用的情况,可以说一些大家公司开发时用的资源管理方案吗?

A1:用AssetDatabase可以加一些随机延时模拟异步,资源加载的接口可以封装一下,做到根据配置来决定走AssetDatabase还是走AssetBundle。

我们打包机会把打好的AssetBundle自动提交到SVN,可以随时更新下来,在编辑器下测AssetBundle比较方便。

另外:新的Addressable也可以试试看。

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

A2:听说过一个项目组做法是:平时开发使用Resources来加载;打AssetBundle或者正式包时,按某些规则根据Resources的目录自动生成一个新工程,这样就不用维护两个工程了。

感谢张迪@UWA问答社区提供了回答

A3:之前是协程模拟AssetDatabase下的异步,即LoadFromFileAsync。

后面尝试过一种方法,就是使用单独的美术工程处理AssetBundle,然后程序工程不负责任何资源,只使用美术工程打包生成的AssetBundle。初听上去流程比较复杂,一点点小的改动即需要操作2个Unity工程。但是其优点也是非常多的。

代码上可以保留AssetDatabase的加载部分用于调试,当然能在日常开发中使用AssetBundle大部分时候能把AssetBundle的Bug暴露在Editor端,而不是上了真机才出问题。

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

A4:以前是用Resources来加载,只不过会把资源放到Editor/Resources目录下来避免被打进包内。

然后要发布的时候切换Flag,并读取Editor/Resources目录下资源进行打AssetBundle包。不过现在全部交给Addressables来管理了。

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


iOS

Q:在iOS 14发布之后,就出现闪退问题了。和机型没关,只要是iOS 14就必闪退的那种,iOS 13就正常。用的Unity版本是2018.2.3。请教有人遇到过吗?

A:我们iOS14也出了状况,有两个表现:

  1. 启动就闪退,多起几次可以过去。
  2. 启动后到某个阶段之间卡死(必卡跳不过)。

XCode里看,始终是GfxDriver报错,我们渠道方发现,XCode里【BuildSetting - Packaging - Product Name】不能含有中文,有中文就出这个问题,改掉就好了。

根本原因尚不明确,个人猜测Product Name会影响Header Folder Path,可能是代码加载路径中出现中文会出问题(类似早期Unity的状况)。希望对你有帮助。

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


iOS

Q1:为了加大破解难度,需要对global-metadata.dat文件进行加密。
实现方式是:
1. 加密在导出Android和Xcode工程后进行,对global-metadata.dat按字节加密。
2. 修改:
Android:\Editor\Data\il2cpp\libil2cpp\vm\MetadataLoader.cpp
Mac:Unity.app\Contents\il2cpp\libil2cpp\vm\MetadataLoader.cpp
文件中的LoadMetadataFile函数,对从文件中读取出来的内容按字节解密。

现在出现的问题是:在Android上没有问题,可以正常加密和运行游戏。但是在Mac上,貌似解密函数没有生效,导致启动游戏崩溃。

请教一下各位大佬:在Mac上,global-metadata.dat的读取是不是不是通过这个函数。我看到Mac上Unity安装目录还有一个PlaybackEngines文件夹,里面也有IL2CPP相关文件,例如MetadataLoader.h,但这个文件是只读的,无法修改,而且也没有找到MetadataLoader.cpp。Mac上解密不生效和这个文件有关吗?

A:iOS上是直接链接预编译好的PlaybackEngines\iOSSupport\Trampoline\Libraries\libil2cpp.a
可能需要自己把.a从工程里移除,把IL2CPP源码引入到工程里。

Q2:工程是指iOS Support/Tramponline文件夹下的Xcode工程吗?要把Unity.app\Contents\il2cpp\libil2cpp中的文件全部加入到这个工程里面是吗?

A:是指导出的项目工程。具体哪些文件可能需要自己试试了。可以在Windows上导个IL2CPP的VS工程对照一下文件和编译参数。

Q3:我们最近遇到这个iOS加密Metadata的问题,请问最后有找到解决方案吗?https://forum.unity.com/threads/how-to-cross-compile-libil2cpp-for-ios-platform.785315/ 看这个帖子,似乎是需要Unity源码才可以?

A:IL2CPP的代码直接拖到XCode工程里应该就可以了。

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


Animation

Q:我们的需求是希望用程序实现灵活的拍掌动作,如下图:


中间一个大模型,左右两手,两手掌要做拍掌动作,蓝色点都可作为拍掌点,就是说要让程序控制拍到哪里。目前想到的方案是:
1. 做很多个拍掌动画,然后在Blend Tree里用二维混合,但那样不够精确。
2. 用Final IK,控制两手掌运动,但那样做的动作不自然。

我们希望尽量减少K动作工作(外包耗不起),问有没有其它方案可用?

A1:这种需求基本上都需要使用IK来做,Final IK是目前看到的Unity引擎中最为成熟的IK解决方案了。如果还是不行,可能需要考虑自行研发了。

该问答由UWA提供

A2:我们之前用过2D Freeform Directional的Blend Tree来融合前后左右移动的动作,融合效果是比较理想的。道理上你分别做最左最右最上和最下四个拍掌动作,然后通过两个参数分别控制左右和上下的融合,能够比较线性地对应起来,精确度应该能接受,不过我没资源测试,也不确定你对精确度要求程度,还是建议做个Demo试试。

感谢邓永健@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5f0de05f125d6020412cc118


Editor

Q:在Unity 2018.4.23版本中测试,新增一个9:16的分辨率,此时获取到的Width与Height是515x916,如果改动Game窗口大小,这个值也会变,请问这个具体规则是怎样的呢?

发现应该是乘以了对应分辨率下的Scale值,比如在720x1280的分辨率下看Game窗口的Scale值是0.741,切成9:16后的分辨率正好是533x948(720x0.741 : 1280x0.741)。现在有API能获取到这个值么?

因为有一些UI操作,比如会把一张图设为和屏幕一样大的大小,但在Editor下UI分辨率是720x1280,所以会和期望的值不一样。如果把分辨率设为720x1280(也是9:16),那么获取到的值就是对的。

主要是想知道规则,然后能根据515x916换算出来720x1280。

A:编辑器下,如果Game窗口采用的比例(Aspect Ratio)的模式,Screen获取的就是Game窗口的实际大小。如果Game窗口采用的是固定分辨率(Fixed Resolution)。Screen获取的就是设定的窗口大小。

感谢张首峰@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5f0d6e2f6ef758272c63739e

封面图来源于网络


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

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