天天看点

Unity 角色模型优化要点(二合一)

在和朋友制作游戏的过程中,经常有人问到角色模型应该怎么建才更符合Unity的需要。在此,我将Unity官方网站中关于建模要求的部分翻译如下,供参考。

限于本人英文水平有限,而且并没有一字一句地翻译,而是基于自己对引擎的理解,采用更符合中文的语序来翻译。故采取在原文段落下方附加中文翻译的做法,以便大家对照。有些内容若朋友们觉得翻译得不妥,欢迎给我留言。

Modeling Optimized Characters

角色优化建模

Use one Skinned Mesh Renderer

一个角色仅使用一个SkinedMeshRenderer(后简称 SMR)

Your character should use only a single skinned mesh renderer. There is usually no reason to use multiple meshes for a character. Unity also has optimizations related to visibility culling and bounding volume updating which only kick in if you use one animation component and one skinned mesh renderer in conjunction. If you care about performance, multiple skinned meshes per character is not an option. If you use two skinned mesh renderers for one character instead of one, the time spent on rendering the character will most likely double!

在Unity中您应该每个角色仅使用一个SkinedMeshRenderer来绘制。一般来说单个角色没必要用到两个或更多的网格(译者:此网格应理解为Unity中Render组件所使用的Mesh,该Mesh可以包含多个sub mesh,各sub mesh有自己的材质,但都用一个Render绘制)。而且,Unity在优化视景裁剪和更新角色包围体时,是基于仅有一个动画组件和一个SMR的假设的。所以,如果你最求性能,就不应该为一个角色使用多个SMR。如果你用了两个SMR,则时间消耗可能是用一个SMR的两倍!

Don't Use Many Materials

不要使用过多的材质

You also want to keep the number of materials on that mesh as low as possible. There is only one reason why you might want to have more than one material on the character: when you need to use a different shader (e.g. if you want to use a special shader for the eyes). However, 2-3 materials per character should be sufficient in almost all cases. If your character is carrying a gun, it might be useful to have the gun a separate object, simply because it might get detached.

你还应该尽可能地减少角色所用材质的数量。你应该只有一个理由使用多个材质:那就是你想使用多个着色器(例如,你想为角色眼睛使用另外一个着色器)。但是,大多数情况下,每个角色2-3个材质就够了。如果你的角色还有一把枪,那你应该考虑把枪作为另外一个物体(而不是角色的一部分),因为它可以从角色身上拿走。(译者:我认为装备和武器网格点如果要求受到多个角色骨骼的控制,而不是单纯作为刚体随骨骼运动,则最好还是作为角色的一部分建模,然后用脚本动态组合实现换装,参见3D游戏引擎——Unity中网格合并示例研究)

Reduce Amount of Bones

减少骨骼数量

Medium Desktop games use bone hierarchies with 15-60 bones. The fewer bones you use the faster; with 30 bones you can achieve very good quality on Desktop platforms and fairly good quality on Mobile Platforms. Unless you really have to, we strongly recommend you use fewer than 30 bones if you are developing for Mobile Platforms and around 30 bones per character on Desktop platforms.

中型的PC游戏每个角色一般使用15-60个骨骼。骨骼越少,计算执行速度越快。一般用30个骨骼就可以在PC游戏中获得很好的表现效果,同时在手机平台上也如此。我们建议如果不是特别有需要的话,在手机平台上单角色的骨骼不要超过30个,在PC平台上也尽量只用30个左右的骨骼。

Polygon Count

三角片数量

How many polygons you should use depends on the quality you require and the platform you are targeting. Anything between 300-1500 triangles on Mobile Platforms and 500-6000 triangles on Desktop Platforms is reasonable. If you want lots of characters on screen or want the game to run on old machines, you will have to reduce the polygon count for each character. As an example: Half Life 2 characters used 2500-5000 triangles per character. Next-gen AAA games running on PS3 or Xbox 360 usually have characters with 5000-7000 triangles.

究竟用多少三角片取决于你所要求的细致程度和游戏运行的目标平台。一般手机上单角色200-1500,PC上500-6000个三角片都是合适的。如果你想同时显示很多个角色,或者想在较早的硬件平台上流畅运行,那么就需要再削减三角片数量。举个例子:半条命2 每个角色用2500-5000个三角片,在PS3或者Xbox360上运行的下一代的AAA(译者:这是啥。。。)游戏一般每个角色5000-7000三角片。

Separate Out IK and FK

将IK和FK分开

Separate out inverse kinematics (IK) and forward kinematics (FK). When animations are imported, the IK nodes are baked into FK, thus Unity doesn't need the IK nodes at all. You can either kill the GameObjects in Unity or the nodes in the modelling tool. By removing them, the IK nodes don't need to be animated every frame anymore. For this reason it is a very bad idea to intermix IK and FK hierarchies. Instead, you should create two hierarchies: one strictly for IK and one for FK. This way you can very easily select the whole IK hierarchy and delete it.

将IK和FK分开。当Unity导入模型动作时,IK节点会被烘焙成FK,因为Unity根本不需要IK节点。你可以在Uniy中将IK节点对应生成的GameObject删除,或者直接在建模工具(如maya、MAX等)中将IK节点删除后再导入。这样,Unity在绘制每帧时就不需要再考虑IK节点的动作了,由此提高了性能。所以,建模时将IK和FK混在一起可不是什么好主意。正确的做法是:你应该将IK和FK分成两组。这样删除的时候就非常方便。(译者:本人对Max等建模工具完全不懂,不妥之处请多指教)

Use Reusable Rigs

创建可重用的Rig

Create a rig which you can reuse. This allows you to share animations between different characters.

创建并使用可重用的rig。这样,你就可以将一套动作应用到不同的角色。(译者:基于骨骼设计动作,然后在骨骼上设计多套Mesh,就可以实现不同外貌的角色具有相同的动作。这个在游戏中提供用户自定义角色外貌时很有用。)

Name Bones Correctly

为骨骼取直观易懂的名字

Name the bones correctly (left hip, left ankle, left foot etc.). Especially with characters, naming your bones correctly is very important. For example if you want to turn a character into a Ragdoll you will have to find the right bones for each body part. If they are not named correctly, finding all the body parts will take much longer.

为骨骼取上直观易懂的名字(例如左臀、左踝、右腿等等)。对于人物角色,为骨骼取个正确的名字尤其重要。举个例子:如果你要让一个角色进入纸娃娃(译者:一种靠物理引擎驱动的动作模型,常用于模拟人体与真实环境相互作用下的动作)状态,你就需要正确定位角色的各段骨骼。如果名字取得不好(例如 1、2、3之类的),程序的兄弟写起脚本来就很费劲。

在上一篇Unity角色模型优化要点中,我主要是翻译了官方的原文,并加了少量自己的注释。随后,经过这几天对角色换肤的测试,总结出一些建模和导入的要点,供大家参考。

所谓角色换肤也就是游戏中常见的角色自定制功能:玩家开始游戏前,一般需要创建一个游戏角色,选择性别、容貌、发型等等。进入游戏后,就可以操作自己创建的角色做出行走、跳跃、攻击等动作。很多游戏还允许玩家在中途变换发型甚至改变体态(例如升级后肌肉变得发达)等等。下图就是WOW中角色选择的画面示例。

Unity 角色模型优化要点(二合一)

从游戏开发者的角度来看,由于可定制元素排列组合的结果非常多,不可能事先将所有结果都一个一个建出来并施加动作。所以必须采取分部位建模,然后通过编程控制,在游戏中将用户选择的各部位重新组合成完整角色。这个制作流程大致包括下列几步:

步骤 执行人员(建议)
1.规划换肤区域 策划
2.制作标准模型 美工
3.制作动作 动作
4.制作可替换部位的模型 美工
5.导出标准模型和动作 程序
6.导出可替换部位的模型 程序
7.在Unity中导入上述模型 程序
8.编写控制代码 程序

1.规划换肤区域

这主要是一项策划工作。负责策划的朋友应该事先规划好角色的哪些身体部位可以替换,并作出原图,方便美工和动作进行设计。需要注意一点就是,对于可能经常离开人体的对象,例如盔甲、武器等,不应包括在内。

2.制作标准模型

标准模型就是包含了角色网格、骨骼和动作的模型。策划设计的角色可能有多种组合方案,但美工可以随便选取其中一种来做标准模型。标准模型的用途有两个,首先是美工可以基于它制作余下的各种可选部位的模型;其次在游戏中程序也是通过替换标准模型中的某一部分来完成换装的。在3DS Max中制作标准模型要点是:

  • 必须包含全套骨骼和一张带蒙皮的网格。只有包含骨骼和蒙皮的模型导入Unity后才能作为后续编程的基础。注意网格必须有且仅有一张,但其形状可以随便。因为最后我们用到的只是骨骼,这张蒙皮的作用仅仅是导入时触发Unity的一个自动功能而已(美工不必关心,我就不展开说了)。它最后会在换肤时被替换掉的。
  • 必须为每块骨骼用英文取一个好识别的名字(拼音也行)。因为后续程序要用到这些名字,太怪异程序员兄弟难理解,中文或太长也不利于程序处理。
  • 材质和动作可有可无,按美工自己的喜好来就行。反正材质导入Unity后还得重新设,动作全部做在一个文件里或者分开文件单独做Unity都能正确识别;
  • 角色最好站立在原点,这样便于导入Unity后定位;
  • 文件最好干净点,不要包含不必要的几何或其他元素。
  • Max里角色身高方向一般是Z向,而Unity里面是Y向。所以为了导入Unity后好用,可以在Max里就把角色建成身高沿Y向,面朝Z向。不过这样美工可能觉得别扭,不做强求,Unity导入后加个旋转也能解决。
  • 单位的问题。Max里按1单位=1米或者1单位=1厘米都可以,导入Unity的时候可以选缩放比例的。

3.制作动作

动作师应该基于标准模型的骨骼来制作角色的全套动作。把所有动作做在一个文件里或者分开做在多个文件里都可以。Unity导入的时候处理下就行了,详见7节。

特别说明一下,有些文章说制作动作时不能使用IK。其实是可以的,对此官方也有说明。只要导出前处理下就行。详见5节。

4.制作可替换部位的模型

美工应该基于标准模型的骨骼来制作角色的各个可替换部位,并将该部位的蒙皮做好。每个部位只能包含一张网格和一个材质。看美工的喜好,既可以把所有部位都做在一个文件里,也可以分开做。反正导出的时候人工控制好一个一个分开就行了。至于接缝什么的美工应该懂得怎么处理好。

5.导出标准模型和动作

Unity接收FBX格式的文件。如果程序懂一点max的话,我建议导出工作都让程序来做,省得导不合适的话反复传文件,当然美工来导也是可以的。

标准模型需要导出的是蒙皮和骨骼,如果包含动画的话也可以导出动画。我在3DS Max8中的导出FBX设置如下图

Unity 角色模型优化要点(二合一)

注意:如果骨骼动作使用了IK,导出前需要做一下处理,否则导入Unity后动不了。选择所有骨骼和IK,然后在“运动”面板中选“轨迹”,在下面点“塌陷”按钮,就可以创建基于关键帧的动作。然后再把所有IK节点删除,检查下动作正常,就可以继续导出了。

如果动作时单独做在其他文件里的,那么打开该文件,仅导出动画和骨骼,按如下设置导出。

Unity 角色模型优化要点(二合一)

注意导出的FBX文件名必须参考标准模型按规则来取。假设标准模型导出FBX文件取名叫AAA.fbx ,那么动作导出的FBX取名就必须以[email protected]开头,例如[email protected], [email protected]等等。

6.导出可替换部位的模型

可替换部位的模型主要导出网格蒙皮和材质。导的时候注意一个fbx应该只包含一个部位。导出设置如下图

Unity 角色模型优化要点(二合一)

7.在Unity中导入上述模型

标准模型、动作和各部位的FBX都导好后,就可以将它们放置到Unity游戏工程目录的Assets目录下了。Unity会自动检查文件并导入它们。该环节主要注意2点

  • 不要把所有fbx都放在Assets根目录下。应该建立一些便于管理的子目录来存放。
  • 如果一个fbx包含多个动作的,记得在Unity项目视图中选择该fbx文件对应的节点,在面板中设置各段动作的起始帧、结束帧位置,让Unity将动作分段提取出来。

8.编写控制代码

参见我以前的文章Unity中网格合并示例研究

继续阅读