Unity下换装的主要流程

首先,美术可能会给这样一个游戏物体,里面含有所有的部位,并且每个部位上都有SkinnedMeshRenderer
Unity下换装的主要流程_第1张图片
可以先剥离一个只含有骨骼信息的预制体出来,方便等会儿再这个预制体上生成
Unity下换装的主要流程_第2张图片
需要两个字典,第一个字典用来存储模型上的所有SkinnedMeshRenderer信息,因为模型里面每个部位会有多个不同的装扮,所以嵌套了一个字典,还有一个字典用来存储target上的SkinnedMeshRenderer信息
Unity下换装的主要流程_第3张图片

1.生成需要的两个预制体

Unity下换装的主要流程_第4张图片
在这里把原始模型和带骨骼的空预制体target生成

2.保存需要的数据

Unity下换装的主要流程_第5张图片
在这个方法中通过获取原始模型中每个部位的的SkinnedMeshRenderer组件,然后遍历,将此组件所在的节点的名字做一个拆分,刚好形成了“部位名”,“编号”的一个数组,然后在target中生成对应部位名的物体,并添加上SkinnedMeshRenderer,然后使用名字数组将数据存入两个字典。

3.设置target中每个部位的SkinnedMeshRenderer

Unity下换装的主要流程_第6张图片
通过字典获取到当前需要改变的SkinnedMeshRenderer组件,然后遍历组件的bones数据,和之前保存的骨骼数据做对比,将骨骼信息存入列表,那么当前部位SkinnedMeshRenderer需要的东西就全部可以赋值了,分别是骨骼,材质,mesh。

4.合并网格

Unity下换装的主要流程_第7张图片
前三步其实已经实现了换装效果,但是一般还会对所有部位的网格做合并,降低性能消耗,首先,获取刚刚已经拥有了所有部位mesh的target物体的SkinnedMeshRenderer,遍历这个数组,将每个SkinnedMeshRenderer的mesh信息添加到CombineInstance列表中,顺便获取所有的骨骼和材质信息,添加到列表中。
接下来就可以赋值了,在target根节点中添加SkinnedMeshRenderer组件,对sharedMesh进行合并,给骨骼信息和材质信息,最后再把各个分部的节点隐藏掉
Unity下换装的主要流程_第8张图片

5.合并材质贴图

一般为了达到优化,降低drawcall,需要合并模型网格,重新计算UV,合并贴图材质。新的步骤:合并网格,合并贴图,重新计算UV,刷新骨骼,附加新材质再设置UV。
先参考此篇文章

你可能感兴趣的:(Unity,C#,unity)