Unity换装功能

http://blog.sina.com.cn/s/blog_64ab3f630100y6dj.html

= =题目为了各位百度谷歌能更好地搜到而改的= =好吧,我承认我的确搜这个关键词了= =。。。

前文再续
如何给角色更换部件,发现前文的不太科学。。。特意重发
更换骨骼部件 必须获取SkinnedMeshRenderer组件,如果不存在这个属性 请按照前文替换方式 保存Mesh和Material进行替换

首先说说
SkinnedMeshRenderer

Variables变量

  • The bones used to skin the mesh.
    用于蒙皮网格的骨骼列表。
  • The maximum number of bones affecting a single vertex
    影响单个点的最大骨骼数量。
  • The mesh used for skinning
    用于蒙皮的网格
  • If enabled, geometry normals will be updated with the bone animation.
    如果开启,几何体法线将随着骨骼动画更新。
  • If enabled, the Skinned Mesh will be updated when offscreen. If disabled, this also disables updating animations.
    如果启用,蒙皮网格将在离开屏幕的时候更新。如果禁用,也将禁用动画更新。
  • AABB of this Skinned Mesh in its local space.
    在本地坐标空间这个蒙皮网格的AABB。


  • 请原谅我从圣典那可耻的复制相关描述 实在懒得打 而且这样也容易各位了解
不得不说 前文的方法是对了一部分, 只是由于骨骼需要绑定的节点很多 所以实际使用上会出现其他问题
例如 定点数不一致 缺少骨骼信息 没有网格与材质

如何更换skinmesh呢?
首先 需要把需要的mesh、material、骨骼信息打包成一个prefab
例如
class BonesData
{
Mesh mesh;//网格
Material[] materials;//材质
//关键是这个 骨骼信息
String[] bonesInfo;//骨骼信息
}
骨骼信息存储的是 骨骼模型对应的SkinnedMeshRenderer组件的bones信息,由于bones是一个数组,而打包时候transform是不能作为存储介质的,所以需要保留bones的路径一边更换时候通过寻找获取骨骼绑定点信息.
至于如何获取完整的bones路径 思路就是获取transform.parent然后通过String类下的Insert把遍历的结果组成字符串
而mesh和materials则存放对象物件的mesh和shareMaterials(方便扩展 使用数组的)

至于如何替换旧的mesh
首先 按照前文的
先获取打包后的prefab再把BonesData获取出来,其次获取 SkinnedMeshRenderer的对象,把对象sharedMesh和sharedMaterials替换
伪代码:
    GameObject go = 获取prefab//可通过assetbundle,resources等方法获取
    BonesData bd = go.GetComponent( BonesData );
    成功获取后
    SkinnedMeshRenderer smr = 欲替换骨骼部位的transform获取 SkinnedMeshRenderer组件;
    //mesh和materials赋值
    //然后使用循环 遍历源物件(从角色的根节点的transform寻找骨骼节点信息)
    //得出Bones的Transform的list
    //进而list替换smr.bones
    //最后记得把创建的资源回收Destroy~~~
于是乎 就能把骨骼部件的mesh替换掉
前提 必须是同一套骨骼的部件才能替换 不然会出错的...

顺道求渣浪微博如何显示代码框= =

猜你喜欢

转载自blog.csdn.net/a351945755/article/details/51941167
今日推荐