Unity换装系统实现

公司的新游戏最近要实现一个换装系统,与开发的程序讨论了一下,发现在unity下实现换装还是比较容易的。这里综合公司的代码和网上的讨论,把实现的思路简单说一下。

先是背景介绍。我们首先明确一些基本术语:

  • bone:骨骼动画中人或者物体的形体结构,动画看成是bone连接处关节的运动。
  • mesh:可以理解为物体表面,因为3D模型中表面都是由一个个小的网格(mesh)拼接。成
  • 蒙皮:将mesh顶点与bone绑定到一起,这样bone运动时,mesh才会跟着动。
  • Animator:动画编辑器。unity 5中基于的是最新的Mechanim动画系统,它具有retargeting功能,可以方便实现在多个角色间重用动画。Animator包含Animator Controller和Avatar两个元素,前者定义使用那些动画素材及如何播放,后者是Mechanim系统可识别的骨骼结构。
  • SkinnedMeshRenderer:负责蒙皮计算,在Animator每帧指定的bone位置,计算相应的mesh顶点位置,并结合材质进行渲染。它有三个关键元素:bone, material, mesh,分别是对应的骨骼、材质、网格信息。

然后结合上述概念,我们来谈换装的实现。

首先要将人物拆成不同部件,如脑袋、头发、身体,每个部件单独替换。我们先定义一个人物对象,因为它是活动的,所以有相应的Animator和Avatar。在Animator下面挂载三个SkinnedMeshRenderer,分别对应脑袋、头发、身体三个部件,从而实现对三部分分别渲染。这样,在换装时我只需替换相应SkinnedMeshRenderer的material和mesh属性即可。

对上述方案还可以做材质球合并减少draw call。我们在渲染时,可以将三个部件的material、mesh和bone都做合并,再赋给新创建的SkinnedMeshRenderer,这样只用1次draw call。对于人物众多的场景,这样可以大量减少draw call,如果有10个部件,就可以降低到原来的1/10。其中合并material就是合并texture,具体做法是:新建一个material,使用的shader与被合并的material使用的shader相同,其他属性也一致,然后将texture合并到一张大texture,赋给新建的material;合并后的mesh还需重新计算uv。

参考资料:

  • 技巧| Unity中Avatar换装实现

  • 浅谈角色换装功能–Unity简单例子实现

  • Unity中的网格与材质球合并

你可能感兴趣的:(unity)