Optimized GameObject时到底发生了什么

  • 问题:Optimize前后生成的prefab结点数量发生了明显的变化,容易让人误以为骨骼空结点只是展示看的,但是如果直接删除空结点就会发现蒙皮动画出现错误。所以问题就是, Optimize的时候发生了什么?Unity做了什么修改?
  • 尝试1:查看UnityEditor.Dll里的代码,Apply Optimized GameObject时仅仅修改了m_ExtraExposedTransformPaths的内容
  • 尝试2:查看使用和不使用Optimize生成的Prefab有什么不同
    - Optimized之后的prefab:
    m_Bones: []
    m_RootBone: {fileID: 0}
    - 不Optimized的prefab,这里的FileID对应的是Prefab内部的骨骼结点
    m_Bones:
    -{fileID: 4136033779980552}
    -{fileID: 4068391989916132}
    -{fileID: 4929649166801780}
    -{fileID: 4756659351305440}
    -{fileID: 4146386435630952}
    -{fileID: 4992511966160680}
    m_RootBone: {fileID: 4929649166801780}
  • 初步结论:m_Bones决定了SkinnedMeshRenderer是否操纵Prefab内的骨骼结点
  • 实验推证:清空没有Optimized的m_Bones并修改Animator的私有属性HasTransformHierarchy,可成功的将其转为完全Optimized的效果!
  • 疑惑:打印SkinnedMeshRenderer的bones数量,发现Optimized之后的的Prefab的bones数量是0!可是既然没有骨骼信息,蒙皮是怎么动起来的呢?
  • 接着实验:去掉Animator的Avatar组件,发现Optimized过的模型立刻停止了工作,而非Optimized的模型删除掉Avatar还在继续运动,可以看出来Optimized过的模型中Avatar起到了关键的作用。
  • 换个角度:SkinnedMeshRenderer是如何取得骨骼的信息的(权重、顶点),这些信息是怎么组织的?
  • 继续实验:从Fbx文件里面取出来Mesh,发现Mesh具有Skin信息,包含骨骼、权重、索引等信息。但是没有骨骼的名称,只有名称的Hash值信息。可以推断,在Optimized之后,Animator的hasTransformHierarchy为false,即Animator不再根据Transform骨骼的位置当作信息,而是根据Avatar作为中间层,转发AnimationClip中对骨骼的控制至Mesh的蒙皮过程。
  • 最终结论
    - 非Optimized的情况下:Animator的hasTransformHierarchy为true,此时根据fbx生成的Prefab内m_Bones包换完整的信息以及对应的Transform层级结点。当运行时,Animator通过修改Transform的位置来控制蒙皮的运动。此时Avatar并没有真正的被使用。
    - Optimized的情况下:Animator的hasTransformHierarchy为false,此时根据fbx生成的Prefab内m_Bones为空,且不再具有完整的Transform节点,所有需要被保留的骨骼节点都成为父物体的直接子物体。当运行时,Animator通过Avatar做映射驱动被保留的节点进行蒙皮。Avatar此时必不可少,因为其包含了骨骼的ID,AnimationClip播放时修改对应ID骨骼的信息,而Avatar将ID转发给SkinnedMeshRenderer,SkinnedMeshRenderer根据ID找到SkinnedMesh中对应的信息,进而重新计算整个蒙皮的信息。在Awake时,将寻找Prefab下同名骨骼,发现则绑定为保留的骨骼,因此甚至不需要在FBX面板进行配置就可保留相关挂点。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值