Optimize Game Objects骨骼节点优化后SkinMesh以及动态骨骼

news/2025/2/13 11:07:18/

为了降低模型动画的性能开销,可以进行骨骼节点优化。

一、接口

unity官方提供了有两种方式可以进行节点优化:

注意当骨骼节点被优化后, Transform节点被剔除,因此需要将挂点等需要用到的节点暴露出来,即下面两个接口中的exposedTransNameList可以传入需要保留的节点路径。

1.在非运行时,直接对FBX文件进行操作 

 var importer = AssetImporter.GetAtPath(fbxPath) as ModelImporter;if (importer == null){return;}importer.optimizeGameObjects = true;importer.extraExposedTransformPaths = exposedTransNameList.ToArray();importer.SaveAndReimport();

以下为FBX文件 保留的节点

2.运行时,隐藏/显示节点

AnimatorUtility.DeoptimizeTransformHierarchy(GameObject go);
AnimatorUtility.OptimizeTransformHierarchy(GameObject go, string[] exposedTransNameList)

骨骼节点优化后发生了什么?

不Optimized的prefab,这里的FileID对应的是Prefab内部的骨骼结点

m_Bones:
-{fileID: 4136033779980552}
-{fileID: 4068391989916132}
-{fileID: 4929649166801780}
-{fileID: 4756659351305440}
-{fileID: 4146386435630952}
-{fileID: 4992511966160680}
m_RootBone: {fileID: 4929649166801780}

  Optimized之后的prefab:

m_Bones: []
m_RootBone: {fileID: 0}

即SkinMeshRender中存储的根骨,有相应权重的骨骼节点列表都空了,那么蒙皮怎么生效呢?

二、原理

骨骼节点优化后,骨骼信息映射到了ConfigureAvatar空间内

注意预制体内的Animator组件下的avatar必须引用骨骼节点优化的FBX文件中的avatar,否则蒙皮不生效,游戏运行后,蒙皮不再根据原始骨骼节点的transform中的位置以及旋转变化,而是从avatar的映射空间获取(因此动态骨骼也不生效)

skinMeshRender组件引用的Mesh,包含骨骼、权重、索引等信息。但是没有骨骼的名称,只有名称的Hash值信息。在Optimized之后,Animator的hasTransformHierarchy为false,转发AnimationClip中对骨骼的控制至Mesh的蒙皮过程。

三、模型换装有两种方案

https://blog.csdn.net/f_957995490/article/details/108985716?ops_request_misc=&request_id=&biz_id=102&utm_term=%E9%AA%A8%E9%AA%BC%E8%8A%82%E7%82%B9%E4%BC%98%E5%8C%96%E5%90%8E%E5%A6%82%E4%BD%95%E6%9B%B4%E6%96%B0skinMeshRender&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-108985716.nonecase&spm=1018.2226.3001.4187

1.修改skinMeshRender中的Mesh以及材质球,需要保证骨骼和mesh不拆分;

2.骨骼mesh拆分,游戏运行后加载mesh预制体,然后根据skinMeshRender中记录的骨骼节点重新进行绑定。

若采用第二种方案,在进行骨骼节点优化后,因为骨骼节点都被剔除,因此无法绑定骨骼,会出现蒙皮不显示了,解决方案是保证skinMeshRender预制体加载路径和之前FBX文件内层级一致,之后重新激活Animator组件即可(暂未找到其他方法),确保animator中的avatar引用骨骼节点优化后的FBX文件内的avartar。

四、Optimize Game Objects与动态骨骼节点优化冲突

因为动态骨骼插件的原理是获取动态骨骼链上的所有节点transform,通过修改位置旋转,来影响蒙皮,但由于节点优化后,映射到了configure avatar 空间,因此即使保留了动骨节点,修改了transform,依然不生效。

动骨源码

 

 


 

 

 


http://www.ppmy.cn/news/235805.html

相关文章

发布npm包时,你要考虑的东西都在这了

老标题党了 &#xff08;一&#xff09;切换源 // npm 官方 npm config set registry<http://registry.npmjs.org> // 新淘宝源 npm config set registry https://registry.npmmirror.com&#xff08;二&#xff09;经验分享 a&#xff09;https 若 npm 包中 method …

笔记本外接显示器时打开Disney+出现黑屏,无信号输入。需要重新插拔HDMI线才可以显示

出现这种情况是因为Disney不支持飞利浦显示器24E1N5500 75Hz刷新率屏幕&#xff0c;需要把显示器的刷新率在设置里调回60Hz。 值得一提的是&#xff0c;笔者将电脑接入戴尔显示器后发现可以正常以75Hz刷新率观看D

黑苹果开机几分钟就死机

我的配置是X79寨板 E5 2689CPU 华硕RX588 15号凌晨装好的15.5 当时用了两三个小时都没有出任何问题。 可就在昨天&#xff0c;我一开机就死机&#xff0c;鼠标键盘失效&#xff0c;声音卡住的那种。多次强制重启依然如此&#xff0c;反复套娃 重启了10多次之后&#xff0c;终于…

计算机网口百兆改千兆,如何将电脑百兆网卡更改为千兆网卡?

直接买个千兆网卡装上即可。 另外&#xff0c;若光纤是百兆的&#xff0c;还得换成千兆的&#xff0c;要不就是出口大管子小&#xff0c;换了千兆网卡也没用。 百兆网卡 百兆网卡是网络带宽的一种&#xff0c;指百兆级别的光纤。普通的百兆网卡理论传输速度为100Mbps&#xff0…

主板怎么开启csm_主板的Launch CSM的开启和关闭是什么作用?会有哪些影响?

展开全部 CSM开启使得可以支持UEFI启动和非UEFI启动。若是需要启动传统MBR设备636f70793231313335323631343130323136353331333366303831&#xff0c;则需开启CSM。关闭CSM则变成纯UEFI启动&#xff0c;且完全支持安全启动。 Launch是启动的意思&#xff0c;CSM全名Compatibili…

主板怎么开启csm_手把手教你查看电脑主板是否支持UEFI+GPT启动模式-网络教程与技术 -亦是美网络...

今天亦是美网络给大家讨论的是关于电脑的UEFIGPT启动模式&#xff0c;在说这个东东之前呢&#xff0c;先给大家普及一下几个名词&#xff0c;UEFI&#xff0c;统一可扩展固件接口&#xff1b;GPT&#xff0c;硬盘的一种分区模式&#xff1b;对于这两个名词&#xff0c;大家知道…

h264编解码器知识点

缩写&#xff1a; 1&#xff0e;DTS, PTS 对于一个ES来说&#xff0c;他又许多I,P,B帧&#xff0c;而P, B帧都是以I&#xff0c;P帧作为参考。 由于B帧是前向后向参考&#xff0c;因此要对B帧作decode的话&#xff0c; 就必须先decode该B帧后面的P,或者I帧&#xff0c; 于是&am…

树莓派安装Opencv方法总结,包括各种报错解决方法

前言&#xff1a;最近因为毕设在树莓派上使用Opencv&#xff0c;因此花了两天时间分别装了opencv-3.4.0版本、opencv-4.0.0版本&#xff0c;期间遇到了各种坑&#xff08;我感觉遇到了安装过程几乎所有的坑了T T&#xff09;&#xff0c;但最后在网上查找相关问题都一步步解决了…