热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Unity中的人物服装更换系统优化与实现

在Unity中,人物服装更换系统的优化与实现涉及多个关键技术点。本文重点探讨了SkinnedMeshRenderer组件的作用及其优化方法。SkinnedMeshRenderer负责角色模型的网格渲染,通过合理配置其属性,如材质和骨骼权重,可以显著提升服装更换的效率和效果。此外,文章还介绍了如何利用Unity的动画系统和脚本编程,实现动态的服装更换功能,以提高用户体验和游戏性能。

http://www.cnblogs.com/mcwind/archive/2011/02/18/1957453.html  原理

一、 SkinedMeshRender:该对象负责网格绘制。主要数据成员包括

var bones : Transform[] 骨骼

var materials : Material[] 材质

var sharedMesh : Mesh 网格


其中Mesh的主要成员是

vertices : Vector3[] 顶点

boneWeights : BoneWeight[] 骨骼权重

boneWeights数组与vertices数组对应,表示对应下标的顶点运动受骨骼影响的权重。BoenWeight结构记录了骨骼在SkinedMeshRender.bones数组中的索引。 

二、网格和材质的对应关系

      一张实际的网格只能施加一个材质。因此,当render所使用的mesh包含多个实际网格(sub mesh),它对每个sub mesh所施加的材质实际上是materials数组中对应下标的材质。


三、合并网格(CombineMeshes)函数的第二个参数是设置是否将多个子网格合并成一张实际的网格。

        正如前面所述,一个实际的网格只能施加一个材质,所以只有被合并的所有网格原来使用的就是同一个材质(即共享材质)时,将它们真正合并才能正确应用材质。否则,应该将该参数置为false,表示不实际合并这些submesh,而是将它们作为被合并后Mesh对象的sub mesh


四、数组对应问题:

        网格顶点和骨骼、sub mesh和材质之间的对应都是通过数组下标进行的,所以操作时保证新生成的个数组下标对应关系正确是非常重要的。


http://www.cnblogs.com/oldman/articles/2395518.html  操作

2.基础模型生成
基础模型是从characters目录下找fbx模型(名称里面不带@),如果找到(如female.fbx),则把模型下所有有SkinnedMeshRenderer的gameobject删除,然后给模型本身加了个SkinnedMeshRenderer。
因为female是带animation的,所以这样一个基础模型就生成了,此模型带animations, 并且带一个SkinnedMeshRenderer。


3.子模型包的生成
子模型包是根据前面找到的fbx模型的子模型,主要包括face, eye, shoes, top ,pants, hair几个部分,子模型包包括三个部分:一个pretab,用到的所有的material, bonenames, 


4.生成过程
生成过程主要在两个函数:
public GameObject Generate()                                  //生成基础模型    
public GameObject Generate(GameObject root)         //生成root下的子模型


每一个子模型包对应的类是CharacterElement,整个模型的构成过程,就是集合所有子模型SkinnedMeshRenderer的materials, mesh的CombineInstance,还有bonenames,
SkinnedMeshRenderer r = root.GetComponent();
        r.sharedMesh = new Mesh();
        r.sharedMesh.CombineMeshes(combineInstances.ToArray(), false, false);
        r.bOnes= bones.ToArray();
        r.materials = materials.ToArray();
全部赋值到了基础模型的SkinnedMeshRenderer上





在复杂的模型中,我们可以查找子组件的SkinnedMeshRenderer,然后进行操作就可以了。想换哪里就替换哪里的SkinnedMeshRenderer的信息,更新对应的骨骼列表和组合一下网格就行了。
List combineInstances = new List();CombineInstance ci = new CombineInstance();
ci.mesh = SrcSkinMeshRender.sharedMesh;
combineInstances.Add(ci);
还有一个想法是这样的,源资源中是否需要骨头。我发现重组骨头结构的时候其实只是读取了骨头的列表信息,所以我觉得可以写成一个配置信息,直接读取配置信息来重组

来源: > 

对一个人物模型里的个别模块换装,可分为:材质更换,模型更换和骨架更换。


就像下面这段程序那样。

在得到人物SkinnedMeshRenderer后,它的模型进行更换,对其骨架进行更换,最后对其材质球进行更换。



蒙皮绑定到骨架



http://www.cnblogs.com/mcwind/archive/2011/02/18/1957453.html



http://www.manew.com/4136.html








来自为知笔记(Wiz)


推荐阅读
author-avatar
夜-依晨_920
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有