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(原群已满员)
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问答社区提供了回答
Q:在 iOS 14 发布之后,就出现闪退问题了。和机型没关,只要是 iOS 14 就必闪退的那种,iOS 13 就正常。用的 Unity 版本是 2018.2.3。请教有人遇到过吗?
A:我们 iOS14 也出了状况,有两个表现:
启动就闪退,多起几次可以过去。
启动后到某个阶段之间卡死(必卡跳不过)。
XCode 里看,始终是 GfxDriver 报错,我们渠道方发现,XCode 里【BuildSetting - Packaging - Product Name】不能含有中文,有中文就出这个问题,改掉就好了。根本原因尚不明确,个人猜测 Product Name 会影响 Header Folder Path,可能是代码加载路径中出现中文会出问题(类似早期 Unity 的状况)。希望对你有帮助。
感谢 Walker@UWA 问答社区提供了回答
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 问答社区提供了回答
Q:我们的需求是希望用程序实现灵活的拍掌动作,如下图:
中间一个大模型,左右两手,两手掌要做拍掌动作,蓝色点都可作为拍掌点,就是说要让程序控制拍到哪里。目前想到的方案是:
1. 做很多个拍掌动画,然后在 Blend Tree 里用二维混合,但那样不够精确。
2. 用 Final IK,控制两手掌运动,但那样做的动作不自然。
我们希望尽量减少 K 动作工作(外包耗不起),问有没有其它方案可用?
A1:这种需求基本上都需要使用 IK 来做,Final IK 是目前看到的 Unity 引擎中最为成熟的 IK 解决方案了。如果还是不行,可能需要考虑自行研发了。
该问答由 UWA 提供
A2:我们之前用过 2D Freeform Directional 的 Blend Tree 来融合前后左右移动的动作,融合效果是比较理想的。道理上你分别做最左最右最上和最下四个拍掌动作,然后通过两个参数分别控制左右和上下的融合,能够比较线性地对应起来,精确度应该能接受,不过我没资源测试,也不确定你对精确度要求程度,还是建议做个 Demo 试试。
感谢邓永健@UWA问答社区提供了回答
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问答社区提供了回答
封面图来源于网络
今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在 UWA 问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之 “石”,也能攻你之 “玉”。
官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA 学堂:edu.uwa4d.com
官方技术 QQ 群:793972859(原群已满员)