使用SBP后,如何查询Bundle的依赖关系

使用SBP后,如何查询Bundle的依赖关系

1)使用SBP后,如何查询Bundle的依赖关系
​2)大量同样的怪物的骨骼动画如何优化
3)DynamicBone动态骨骼插件是否在项目里使用
4)音频换Wwise的成本
5)运行时如何保存Prefab


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

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

AssetBundle

Q:使用ContentPipeline.BuildAssetBundles接口打出Bundle文件后,没有产生AssetBundleManifest文件,请问该如何查询某个Bundle所依赖的其他Bundle呢?

A:可以从ComatibilityBuildPipeline.cs的源码里面看到下面的代码,


用上图中的方法来生成Manifest对象,然后参考《使用SBP打Bundle如何读取AssetBundleManifest》生成资源文件和打包AssetBundle。

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


Animation

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问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5f9ab69edc477370c2c1efa6


Animation

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,推荐你们去看看。

MagicaCloth

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


Audio

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问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5f9843355d9aea5aa97198ad


Script

Q:运行时代码克隆了一个Prefab,然后我改了坐标或者角度,如何再保存回Prefab?

我这个保存的数据只是举了简单的例子,实际是运行时美术会改特效特效Particle system里面一堆参数的。

A1:建议使用ScriptableObject来实现相关功能。

不同对象的参数调整要分开考虑。如果是粒子系统,编辑模式下基本都可以调了。大部分参数在编辑模式下调好,非常少量的可以在运行模式下调。调好后拷贝一下,然后退回编辑模式粘贴一下应该也可以了。

当然也可以把一些参数提出到ScriptableObject,调这个序列化,每次运行启动的时候赋值给目标对象。如果有必要也可以做个按钮,运行时按后直接去修改Prefab内的值,只是这样处理起来比较麻烦。不是很大很复杂的需求还是尽量避免。

其他的一些Prefab内编辑器模式下不方便调的,还是建议提出到ScriptableObject来处理更好。

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

A2:PrefabUtility.SaveAsPrefabAssetAndConnect

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

封面图来源于网络


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

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