【原】Unity 骨骼节点对象优化,AnimatorUtility.OptimizeTransformHierarchy

本文介绍了Unity中的 AnimatorUtility.OptimizeTransformHierarchy 接口,用于优化角色模型的骨骼节点,减少CPU计算。该接口会删除GameObject下的所有transform,仅保留指定的骨骼。需要注意的是,该接口要求Animator和SkinnedMeshRenderer在同一对象上,暴露的骨骼名称不能含有空格,模型的Optimize选项需勾选,且在优化过程中需保存并还原额外的挂点和模型。文章提供核心代码示例,展示如何重新组合mesh、骨骼、材质并暴露指定骨骼。
摘要由CSDN通过智能技术生成

关键接口: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 =
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值