Unity 实现 角色的换装

Posted lesjay0824

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity 实现 角色的换装相关的知识,希望对你有一定的参考价值。

换装的三个要点 材质 网格 模型

unity中换装 即更改角色部位上的skinnedMeshRender组件的属性

更换mesh

mesh 和骨骼的重新绑定

最后更换材质

一个模型 带有skinnedMeshRender组件 的子节点 和对应坐标信息的骨骼绑定的子节点

face-1 中的root bone 就对应着female_Hips

得到 skinnedMeshRender 中的材质 和mesh 加上骨骼绑定子节点的bones =新的模型

如何实现:

换装的角色带所有信息的模型预制体 (源) 让其只保留带骨骼信息点的子节点的新预制体(新)

  

保留2个预制体

将源预制体中的skinnedmeshrander信息通过字典的方式保存并传入新预制体中并在新预制体中只会每个部分单独出现。

每个替换存入字典中的mesh信息即达到换装效果。

private GameObject girlSource; // 骨骼模型资源(源)
   private GameObject girlTarget; // 骨骼信息(新)
   private Transform  girlSourceTrans; // 模型信息
 
    Transform[] girlHips;    // 骨骼bones信息
   
 private Dictionary<string, Dictionary<string, SkinnedMeshRenderer>> girlData = new Dictionary<string, Dictionary<string, SkinnedMeshRenderer>>(); 
    //小女孩所有的资源信息   //部位的名字,部位编号,部位对应的skm
 
    private Dictionary<string,SkinnedMeshRenderer> girlSkm = new Dictionary<string,SkinnedMeshRenderer>();
    //新骨骼的资源信息  一个部位对应一个mesh

    private string[,] grilstr = new string[,]   "eyes", "1" ,  "hair", "1" ,  "top", "1" ,  "pants", "1" ,  "shoes", "1" , "face","1" ;
    //实例化模型的数组信息

需要用到2个字典 Dictionary<string, Dictionary<string, SkinnedMeshRenderer>> girlData 去遍历存储所有的带skinnendmeshrender组件的子节点

Dictionary<string,SkinnedMeshRenderer> girlSkm 存储新的单一子节点

存入信息方法

void SaveData(Transform SourceTrans,GameObject Target, Dictionary<string, Dictionary<string, SkinnedMeshRenderer>> Data,
        Dictionary<string, SkinnedMeshRenderer> Skm)

      //将模型资源 新预制体对象 2个字典传入
        Data.Clear();
        Skm.Clear();
        if(SourceTrans == null)
        
            return;
        
        SkinnedMeshRenderer[] parts = SourceTrans.GetComponentsInChildren<SkinnedMeshRenderer>();//拿到资源下的SkinnedMeshRenderer组件属性s
        foreach (SkinnedMeshRenderer part in parts)
        
            string[] names=part.name.Split('-');
            //根据子节点命名方式 分割字符 拿到模型人物换装部位 名字 和编号
            if (!Data.ContainsKey(names[0])) //第一次拿到
            
                GameObject go = new GameObject();
                go.name = names[0];  //重命名
                //生成新的skinnedmeshrender子节点
                go.transform.parent = Target.transform; //设置父物体
                go.AddComponent<SkinnedMeshRenderer>();
                Skm.Add(names[0], go.GetComponent<SkinnedMeshRenderer>()); //将可换装mesh信息 存入字典并赋予skimeshren 组件
               
                Data.Add(names[0], new Dictionary<string, SkinnedMeshRenderer>());//new 嵌套字典
            

            Data[names[0]].Add(names[1], part);      //存入 嵌套字典
        
        

    
 void Change(string part,string num, Dictionary<string, Dictionary<string, SkinnedMeshRenderer>> Data, Transform[] Hips,
      Dictionary<string, SkinnedMeshRenderer> Skms, string[,] shuzu)
    

        // 对应更改 部位  对应更改的换装编号  2个字典  存储的数组  模型bones 数组
        SkinnedMeshRenderer skm = Data[part][num]; //拿到嵌套字典中对应的mesh属性

        List<Transform> bones= new List<Transform>();

        foreach (var trans in skm.bones)   //遍历bones 拿到mesh对应的模型bones数组中的bones
        
            foreach(var bone in Hips)
            
                if(bone.name==trans.name)
                
                    bones.Add(bone);
                    break;
                
            
        
        //更换mesh 材质 bones 达成换装
        Skms[part].bones = bones.ToArray();// list to数组
        Skms[part].materials = skm.materials; 
        Skms[part].sharedMesh = skm.sharedMesh;

        //保存数据到数组中

换装的逻辑 完成

以上是关于Unity 实现 角色的换装的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D游戏开发之换装系统的实现

Unity3D换装系统

角色换装

unity实现换装系统

unity人物换装

Unity体感设备KinectV2虚拟换装解决方案