1)多个 Submeshes 模型合并,显示异常
2)Addressable 如何删除旧资源
3)对 NGUI 字体错乱的解决方案
4)GLSL link error: L0010 Uniform '_Color' differ on precision
5)iOS 键盘上的输入框提示内容如何去掉
这是第 233 篇 UWA 技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间 10 分钟,认真读完必有收获。
UWA 问答社区:answer.uwa4d.com
UWA QQ 群 2:793972859(原群已满员)
Q:测试一个 Skinmesh 合并功能,发现当 Mesh 包含多个 Submeshes 时,合并成功后,无法渲染显示出来。当测试的 Mesh 不包含 Submeshes 时,可以合并显示。难道 CombineMeshes 只能合并不带 Submeshes 的 Mesh?
注:不管是使用 r.sharedMesh.CombineMeshes(combineInstances.ToArray(), false, false);带上所有材质,还是 r.sharedMesh.CombineMeshes(combineInstances.ToArray(), true, false) ;合并一张贴图材质,带多个 Submeshes 的模型只能合并无法渲染显示出来。不带多个 Submeshes 的模型却能够正常合并显示。
A:测试发现,需要对每个 CombineInstance 重新指定三角面,才能正常显示带多个 Submeshes 的模型。如下代码:
foreach (SkinnedMeshRenderer smr in allSkineMeshList) { for (int sub = 0; sub < smr.sharedMesh.subMeshCount; sub++) { CombineInstance ci = new CombineInstance(); ci.mesh = smr.sharedMesh; ci.mesh.triangles = smr.sharedMesh.triangles; //这里重新指定 ci.subMeshIndex = sub; ci.transform = matrix * smr.transform.localToWorldMatrix; combineInstances.Add(ci); }
感谢题主牛头人不服@UWA问答社区提供了回答
Q:目前计划使用 Addressable 来实现资源热更新,实际真机测试发现当资源更新后,旧的资源 Addressable 并不会把它删除,同时可以看到 App 占用的数据文件会越来越大。请问有什么办法可以把指定的 Group 或 Label 的资源删除吗?
A:我们用的是覆盖式更新的流程(不是增量更新),Addressables 版本是 1.15.1。在把 Bundle Naming 设置为 Filename 后发现,在 Caching 中的 AssetBundle 目录还是带有 Hash 值的。
图中可看到 AssetBundle 包名已经是 Group 的名字了,但是下载到 Caching 中还是有 Hash。
然后我们是这么解决的:还是开启文件名的 Hash,将 Caching 中的 AssetBundle 文件夹名保存到 PlayerPrefs 中,当检测到有下载的时候,读出 PlayerPrefs 中的值,把旧的对应 AssetBundle 包删除,并更新 PlayerPrefs。
获取当前 Catalog 中所有 AssetBundle 文件夹名的方法,是从 Addressables 中复制出来的。
// 获得当前catalog中所有 assetbundle 保存的文件夹名 // 这个函数中引用到的方法没有列出,可以去 addressables 中源码中找 // 示例:CollectBundleNames(new string[]{ "SkllIcons", "ItemIcons", "AvatarIcons" }) private static List<string> CollectBundleNames(object[] keys) { List<string> result = new List<string>(); #if ENABLE_CACHING foreach(var key in keys) { IList<IResourceLocation> locations; if (key is IResourceLocation resourceLocation && resourceLocation.HasDependencies) { foreach (var dep in resourceLocation.Dependencies) { if (dep.Data is AssetBundleRequestOptions options) { result.Add(options.BundleName); } } } else if (GetResourceLocations(key, typeof(object), out locations)) { var deps = GatherDependenciesFromLocations(locations); foreach (var dep in deps) { if (dep.Data is AssetBundleRequestOptions options) { result.Add(options.BundleName); } } } } #endif return result; }
删除 AssetBundle 包文件夹的方法:
// 这里的 bundleName 就是 CollectBundleNames 的返回值 private static void ClearCacheForBundle(string bundleName) { List<Hash128> hashList = new List<Hash128>(); Caching.GetCachedVersions(bundleName, hashList); foreach (Hash128 hash in hashList) { Caching.ClearCachedVersion(bundleName, hash); } }
需要注意的是调用 CollectBundleNames 的时机,如果已经更新了 Catalog,那么返回的是即将要写入 Caching 中的 AssetBundle 文件夹名。如果要得到当前 AssetBundle 文件夹名,要在更新 Catalog 之前调用。
感谢 jim@UWA 问答社区提供了回答
Q:对 NGUI 字体错乱有什么好的解决方案吗?
A:究其原因是 NGUI 的代码逻辑 Bug。
感谢毛尹航@UWA问答社区提供了回答
Q:Android 真机报错,表现未发现异常,但是 Bugly 检测到报错日志:
相关信息:
异常进程 # 线程:com.go7game.jewelclassic#main(1)
用户 ID:unknown
发生时间:2020-12-23 15:10:53
上报时间:2020-12-23 14:11:21
应用包名:com.go7game.jewelclassic
应用版本:1.20.11
使用时长:39 秒
前后台状态:前台
设备机型:金立 M5
系统版本:Android 6.0,level 23
ROM:LEAGOO/full_wf562k_leagoo
CPU 架构:armeabi-v7a
报错的详细信息请戳原问答查看。
A:问题中有提到这个 Error 是金立 M5 上发现的,从网上资料可以查到这款手机的 SoC 为联发科 MT6735,对应的 GPU 为 Arm Mali-T720。
Google 类似问题时发现有几个类似问题会出现在部分 Mali 设备。
https://github.com/cocos2d/cocos2d-x/issues/17256
https://forum.unity.com/threads/glsl-link-error-l0010-uniform-_-differ-on-precision.639451/所以猜测是由于 GPU 硬件或者驱动导致的浮点数精度的问题。上面帖子里也有提到一些能绕过这个 Bug 的方案,可以参考下。
感谢范君@UWA问答社区提供了回答
Q:iOS 平台,NGUI 输入框中的默认内容会显示在键盘上,这栏怎么去掉,请指导一下。
A1:iOS 可以修改 XCode 工程中的 Keyboard.mm 代码定制。
感谢 Kenji@UWA 问答社区提供了回答
A2:遇到类似问题,是接入第三方 SDK 导致的。
感谢谢志勇@UWA问答社区提供了回答
封面图来源:GLTFUtility
https://lab.uwa4d.com/lab/5bc4223b04617c5805d4d437
今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在 UWA 问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之 “石”,也能攻你之 “玉”。
官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA 学堂:edu.uwa4d.com
官方技术 QQ 群:793972859(原群已满员)