1)使用 SBP 后,如何查询 Bundle 的依赖关系
2)大量同样的怪物的骨骼动画如何优化
3)DynamicBone 动态骨骼插件是否在项目里使用
4)音频换 Wwise 的成本
5)运行时如何保存 Prefab
这是第 225 篇 UWA 技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间 10 分钟,认真读完必有收获。
UWA 问答社区:answer.uwa4d.com
UWA QQ 群 2:793972859(原群已满员)
Q:使用 ContentPipeline.BuildAssetBundles 接口打出 Bundle 文件后,没有产生 AssetBundleManifest 文件,请问该如何查询某个 Bundle 所依赖的其他 Bundle 呢?
A:可以从 ComatibilityBuildPipeline.cs 的源码里面看到下面的代码,
用上图中的方法来生成 Manifest 对象,然后参考《使用 SBP 打 Bundle 如何读取 AssetBundleManifest》生成资源文件和打包 AssetBundle。
感谢 Xuan@UWA 问答社区提供了回答
Q:大量同样的怪物的骨骼动画应该怎么优化?
1.如果有 N 个怪物,是否同样的骨骼动画会计算 N 遍来得到每个 Mesh 的新的顶点位置。
2.如果 1 是对的,能否计算完一个怪物在动画这一帧的顶点位置后,其他怪物都用这个计算好的结果进行渲染。
第二个问题的这个方法我认为是和 GPU Instancing 的贴图动画是有区别的。不知道第二个方法有没有实现的可能,或者已经有人实现了吗?
就是这一群模型表现都一样,变换矩阵每一帧都一样。请问 Shared SkinnedMesh 方案是什么思路,或者有没有参考链接?
A:请参考以下答案:
1.不同模型的动画序列帧不同,骨骼的变换矩阵必然有差异,除非这一群模型表现都一样,可以自己写一套 Shared SkinnedMesh 的方案。如果需要在 CPU 端蒙皮把 Shader 中的蒙皮计算拿出来就好。
Shared SkinnedMesh 的方案参考:https://lab.uwa4d.com/lab/5bc6f85504617c5805d4eb0a
2.GPU Instancing 的方案也是通过将序列帧骨骼动画烘培到贴图中,然后在顶点着色器中实现蒙皮计算的过程。
具体细节可参考:《移动游戏开发核心技术讲解:3D UI、GPU Skinning 和 DOTS》中 GPUSkinning 相关内容。
感谢羽飞@UWA问答社区提供了回答
Q:DynamicBone 动态骨骼插件有人测试过性能吗?是否建议在项目里使用?
A1:这插件的性能真费,项目里主角 30 根骨骼用上这个插件后,高端机每帧耗时 1ms。2 个人就是 2ms 了。
感谢剑影蒙残@UWA问答社区提供了回答
A2:可以用,但是不能大面积用,最好用在重点对象上,适合搞一些骚操作。
感谢与我相关@UWA问答社区提供了回答
A3:完全可以使用。
我们上一个项目中有大量的舞蹈动作,最多支持 16 人的同台表演。在服装制作上使用了和 DynamicBone 类似的 Unity 日本开源的 UnityChan 中的 SpringBone。同时进行了魔改,加入了横向约束防止在抬腿等大幅度动作时的穿模。魔改后的版本计算量比原版更大。
这类弹簧骨骼系统的计算量主要在两方面,一方面是计算弹簧间的力传导,另一方面是计算碰撞,都是重 CPU 的计算,是非常适合放入子线程去做的。刚好可以应用 Unity 的 ECS 来进行优化。
目前网上开源的实现中,可以参考下https://github.com/EsProgram/uSpringBone的实现。但由于 ECS 目前还未正式 Release,所以稳定性不是特别好。
前段时间在逛 AssetStore 时,发现一个新的插件,使用 JobSystem+BurstCompiler,推荐你们去看看。
感谢范君@UWA问答社区提供了回答
Q:我们现在 Unity 原生的音频,使用的是一个 Resonance-Audio 插件,可能我们自己也没用好,但能凑合着用。
听说 Wwise 不错,打算都换上。但昨天下载了一天没安装上,而且和现有音频不能一起用,不知大家是否也遇到过这样的问题,有没有什么好的思路?
大家在项目中途转 Wwise 的成本大吗?
A1:我们也转了 Wwise,与原生确实不能共用。需要把现有的音频放到 Wwise 工程之后,再分平台统一导出,Wwise 导入导出以及管理还是蛮方便的。安装也是装了两三遍才装完。
Wwise Launcher 软件和 Unity Intergration 似乎是分两次下的,集成入 Unity 工程需要等那个页面反应一下,否则一不小心又会点到下载。
问题确实在安装,设置,打包,打热更都会有一点。
链接里是我碰到过的几个问题,虽然不是很全,可以参考看看:https://kmageek.com/2020/06/23/wwiseUnity/
感谢 Maggie@UWA 问答社区提供了回答
A2:做好音频文件和项目工程的解耦(音频播放配表,不是通过 Prefab 关联),转过去会很方便,Wwise 通过 Bank 加载、ID 播放,做好 ID 和音频名称的映射。一般会进行二次开发,在 Editor 做个 Bank 解析、播放、关联的小标签会方便策划配置。
感谢郑骁@UWA问答社区提供了回答
Q:运行时代码克隆了一个 Prefab,然后我改了坐标或者角度,如何再保存回 Prefab?
我这个保存的数据只是举了简单的例子,实际是运行时美术会改特效特效 Particle system 里面一堆参数的。
A1:建议使用 ScriptableObject 来实现相关功能。
不同对象的参数调整要分开考虑。如果是粒子系统,编辑模式下基本都可以调了。大部分参数在编辑模式下调好,非常少量的可以在运行模式下调。调好后拷贝一下,然后退回编辑模式粘贴一下应该也可以了。
当然也可以把一些参数提出到 ScriptableObject,调这个序列化,每次运行启动的时候赋值给目标对象。如果有必要也可以做个按钮,运行时按后直接去修改 Prefab 内的值,只是这样处理起来比较麻烦。不是很大很复杂的需求还是尽量避免。
其他的一些 Prefab 内编辑器模式下不方便调的,还是建议提出到 ScriptableObject 来处理更好。
感谢黄程@UWA问答社区提供了回答
A2:PrefabUtility.SaveAsPrefabAssetAndConnect
感谢与我相关@UWA问答社区提供了回答
封面图来源于网络
今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在 UWA 问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之 “石”,也能攻你之 “玉”。
官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA 学堂:edu.uwa4d.com
官方技术 QQ 群:793972859(原群已满员)