关键接口:AnimatorUtility.OptimizeTransformHierarchy
需求:角色模型换装,角色模型由多个部位组合而成,暴露的骨骼节点非常多,可以通过AnimatorUtility.OptimizeTransformHierarchy接口进行优化。
但是 Unity 提供的接口AnimatorUtility.OptimizeTransformHierarchy里面有一些坑,我在这里进行讲解。
接口定义:public static void OptimizeTransformHierarchy(GameObject go, string[] exposedTransforms);
对于该接口Unity的注释是:
This function will remove all transform hierarchy under GameObject, the animator
will write directly transform matrices into the skin mesh matrices saving alot of CPU cycles.
意思就是使用该接口将会删除目标对象下的所有transform组件,然后animator将写入transform移动矩阵到skin mesh矩阵中以节约大量cpu时间。
简单解释也就是:将需要更新的transform对象保留,不需要的去掉,省掉很多不必要的计算。
1:骨骼全展开
2:骨骼用OptimizeTransformHierarchy优化后,显示指定骨骼对象
该接口使用,有几个条件,在此会列出:
//condition: 1: Animator togather with Render 2: Optimize is selected 3:all bones trans right 4: bone name can't contain space char
1: Animator 组件和SkinnedMeshRenderer必须在同一个对象中。
2:OptimizeTransformHierarchy 接口的参数 exposedTransforms是 需要暴露的骨骼名称数组,并且暴露骨骼名称不能带空格,否则模型会出现显示问题(unity自己接口这样,我也没办法)
3:模型fbx设置Optimize选项必须勾选
4:对SkinnedMeshRenderer中参数bones进行赋值时,必须保证对应transform存在,因为优化接口会删掉所有对象,然后从新生成骨骼节点对象。如果骨骼对象下有挂点,需要对挂点进行保存,优化完成后再对挂点或者其他额外模型进行还原。
以下是粘贴的核心代码,用于组合一个角色的多个部位,重新合成mesh,骨骼,材质,暴露指定骨骼节点对象(只暴露挂点)
private void CombineMesh(bool comine) {
//所有部位的SkinnedMeshRenderer对象,用于合成一个SkinnedMeshRenderer
var smrArr = GetAllBodySMR(); List<Transform> bonesdArr =