Unity中的3D角色自定义

本教程适用于中级和高级游戏开发人员和建模人员,并假定您具有C#,Unity Architecture和3D建模和装配的知识。

注意:我知道模型存在问题。 我正在使用具有固定模型的教程的新版本,以及使用此方法进行自定义的新资产以及另一个更灵活的方法。 我希望我能尽快发布更新和新资产。

  • 可以在此处下载源项目: https : //www.dropbox.com/s/gl7appsvxav2ofw/3d_char_customizer.unitypackage?dl=0 请注意,这是使用旧版本的Unit(5.x)制作的,因此可能会有错误。
  • 可以在以下位置找到该项目的高级版本: https : //github.com/keawstudio/Clothing-System-3D
  • 可以在我的YouTube频道上找到视频: https : //www.youtube.com/channel/UCn2P6tlajFWFdW2TWZ8cEbA

我不会在这里解释所有内容,仅会显示如何实现视频演示中显示的结果。 因此,不要指望分步教程。 源代码有很多注释,因此很容易遵循。

字符自定义可用于两种类型的对象:

*不会因骨头变形的刚性物体,例如头盔,武器,戒指

*需要骨骼变形的衣服,以跟随角色的动作

这两种类型的对象具有不同的使用形式。

实例化刚性对象并将其指定为骨骼的子代。 它也可以用于衣服吗? 好,是的,但是效果不是很好。 对于衣服,我们使用Unity具有的漂亮组件:SkinnedMeshRenderer。

如文档所述,Unity使用“蒙皮”来渲染骨骼动画,该动画在对象的网格中执行变形。 因此,当您导入具有骨架系统(称为骨架)的模型时,Unity会为对象创建一个蒙皮的网格以与骨骼交互。 骨骼是不可见的,但是您可以在编辑器中(或在运行时的脚本中)进行访问。

让我们看一下我们的模型赤壁,以了解蒙皮网格的工作原理。

如您所见,对象具有网格(在本例中为各种网格,将在后面进行说明)和骨骼骨架(称为metarig)。 如果展开metarig对象,则可以看到赤壁的骨骼层次。

选择其中一个网格时,我们可以访问其蒙皮网格渲染器和分配给它的材质。 因此,每个具有骨骼影响力的网格物体都有其自己的蒙皮网格物体渲染器。

Skinned Mesh Renderer具有各种属性,但使我们“神奇”发生的一个属性是Mesh。 这说明了它使用什么网格。 您可以将其更改为另一个对象的另一个网格。

它是如何工作的? 将骨骼分配给网格后,该网格的每个顶点都会存储有关骨骼将如何变形的信息。 因为这样您可以将网格划分为另一个网格。 但是另一个网格需要具有适合骨骼的权重图。

我的系统要做的是获取另一个对象(例如盔甲)的网格,并将其分配给我要更改的身体部位。 一旦使用相同的骨架制作了char的身体和装甲,它们在其重量映射中共享相同的骨骼信息,并且使用此信息,Skinned Mesh Renderer将知道如何渲染网格。

赤壁模型由其身体组成,分为多个部分(头部,手臂,腿等),电枢和代表每种可用布料的对象,例如上部(用于衬衫),下部(用于裤子),鞋子和手套。 这些布料部分是将接受网眼以制造炭灰穿着的衣服的部分。

例如,我想在赤壁上放一个圣诞节跳线,所以我得到了跳线对象网格并将其分配给上层布料对象的网格。 然后我套上材料,瞧,赤壁现在穿着一件漂亮的红色套头衫。 无需删除现有对象并在该位置实例化一个新对象。 仅更改网格和纹理。 容易,不是吗?

为什么我将身体分成多个部分,然后再换衣服呢? 因为有些衣服不能像无袖T恤那样覆盖整个身体。 躯干的一部分会出现,因此无需在T恤中建模躯干的各个部分,而只需对T恤本身进行建模。 因为模特有身体部位和衣服部位。 使用跳线可以将躯干和手臂隐藏起来,减少渲染次数。

看一下下面的图片:

这是隐藏衣服部分的赤壁身体。 只有它的皮肤。

衣服部分可见的赤壁,都是洋红色的材料。 如您所见,衣服部件只需要用作占位符就不需要完整,也不需要具有纹理(可以使用任何材料)。

为了使其正常工作,所有对象(char主体,衣服和占位符)都必须在同一位置具有原点(或锚点)。 可以在《 /灭/天际》这样的游戏中看到,它们的模型的原点位于地面,两脚之间。 这样可以确保零件放置正确。 并检查所有对象是否具有相同的比例尺,因为现在,如果比例尺不同,骨骼可以更改网格的大小。

您无需在与角色正文相同的文件中创建衣服,只需在占位符上创建衣服即可。 每个布料部分可以有一个文件; 它们只需要具有相同的电枢和相同的起点。

在项目的Models文件夹中,有所有models文件:

*赤壁,即具有角色网格,骨架和衣服占位符的角色文件

*每个锉刀的每个锉刀,带有织物网眼和电枢

* infiback,即用于制作无限背景的模型,而不是使用飞机和天空盒。

动画位于一个单独的文件中,位于“动画”文件夹中。 所有模型文件和动画均为Blender格式。 我不使用从Blender导出的fbx,因为我在动画方面遇到一些奇怪的问题。 Unity导入Blender文件后,便会使用它。

现在,它如何在代码中工作? 这非常简单:通过新对象更改对象的SkinnedMeshRendener的共享网格:

  //从源对象加载网格 
  GameObject sourceObject = Resources.Load(“ Clothes /” + cloth.MeshName)作为GameObject; 
 网格mSource = sourceObject.GetComponentInChildren ()。sharedMesh; 
  //分配给最终对象 
  GameObject objDest = ClothesParts.Find(x => x.ClothType == cloth.TypeCloth).ObjectCPart; 
  objDest.GetComponent ()。sharedMesh = mSource; 
  objDest.SetActive(true);  //确保布料对象是可见的 

源对象是预制的,存储在Resources文件夹中。 您无需为每块布料的每种纹理创建一个预制件,只需一个布料的预制件即可充当网格的供体,以后将在布料占位符中应用该纹理:

 物料来源垫= Resources.Load (“衣服/物料/” +物料); 
  GameObject objDest = ClothesParts.Find(x => x.ClothType == objToChange).ObjectCPart; 
  objDest.GetComponent ()。material = sourceMat; 

因此,您需要使每种材料具有衣服的每种质地。 在此示例中,我们有一个称为跳线的预制件和两种用于跳线纹理的材料:jumper_black和jumper_red。

在这个示例项目中,我使用关系表来告诉脚本哪个对象代表身体的哪个部分或什么类型的衣服。 因此,我不需要在脚本中按名称查找每个部分。 关系表是公共列表,可以在检查器中访问该列表,从而可以直接在编辑器中设置对象属于身体或衣服的哪个部分。

脚本CustomizeObject具有更改衣服网格,应用纹理以及将其他对象(例如头发)分配给骨骼的所有代码。 它还具有身体和衣服部件的枚举,以及身体部件,衣服占位符和可以接收附加件的骨骼的关系表。 该脚本已添加到角色模型中。

具有布料选项的面板由脚本ChangeClothes控制。 它已添加到场景中的空GameObject。 选择布料后,脚本将调用CustomizeObject方法来更改衣服。 该面板由UI控件(滚动视图和按钮在运行时创建)组成。

脚本ClothesDB包含有关所有可用衣服和附加组件的信息,从一个名为Clothes_db.json的JSON文件加载它,并存储在集合中。 衣服面板由此类信息构成。 它还被添加到场景中的空GameObject中。 为了解析JSON文件,我使用了SimpleJSON插件(您可以在这里找到它:http://wiki.unity3d.com/index.php/SimpleJSON)。

您可以使自己的系统存储有关衣服的信息,以及保存有关角色的信息。 本教程的目的仅在于展示如何仅使用统一的对象来实现布料系统,并展示SkinnedMeshRenderer的功能。

有关Unity如何与网格一起工作的更多信息,请查看文档:http://docs.unity3d.com/Manual/comp-MeshGroup.html

  • 创建模型的提示

这个问题非常广泛,但是在这里我将重点介绍有关创建模型的一些提示。

*如前所述,SkinnedMeshRenderer将使用的所有模型都必须具有相同的原点中心。

  • 对于添加到骨骼的刚性元素,“原点中心”必须与将接收对象的骨骼的底部相同。

请注意此处:我仅与Blender合作。 Unity中的对象通过其锚点(或原点中心)对齐,因此您需要在建模软件中对其进行检查。

*衣服不需要与模型在同一文件中,只需使用相同的电枢(骨骼名称)即可。

*如果要隐藏字符的某些身体部位,则需要将模型“切割”成不同的对象。 首先,将char建模为一个对象,它们选择零件并将它们分开。 所有对象将保留权重映射。

制作衣服很有用。 在Blender中,进入“编辑”模式,选择要用作基础的面,将其复制,然后使用这些复制的面创建一个新对象。 从这里创建衣服。 不要忘记稍后检查权重映射。

*最好只使用一种材料来制作衣服,以方便以后更换网眼的材料。 如果需要多种材料,则需要使代码与多种材料一起使用。

  • 最后注意事项:

*我可以使用您的模型吗?

是的你可以。 我只是警告您,从我学习到建模时,它们都是旧模型,因此拓扑结构不好,并且polys有点高。

*导入模型时,我需要使用哪种“钻机动画类型”?

泛型或类人动物,两者均有效。 但是,如果将人形模型与通用模型一起使用,可能会遇到问题。

*镜子是如何制成的?

使用第二个摄像机(“镜像摄像机”)渲染到纹理(摄像机的“目标纹理”属性)。 然后将纹理应用于3D平面(镜像)。

*您使用什么软件制作模型?

Blender3d,版本2.72b。 任何可以与索具配合使用的3D建模软件都可以完成这项工作。

*如果在使用自己的代码来实现时遇到问题,您会帮助我吗?

否。正如我在开始时所说,本教程适用于高级开发人员。 如果您有硬币,Khajiit会有所帮助

*为什么要使用教程? 为什么不将其作为资产出售?

嗯,只有在阅读了很多其他人谈论过的模块后,该模块才可能实现。 我只需要加入我发现的作品即可使其工作。 因此,我不会出售它。 但是,如果有人想为我的努力表示感谢,这一捐赠将非常高兴