关于unity 3d人物换装

要学习unity3d人物换装首先要大致认识一下SkinnedMeshRenderer(蒙皮渲染组件

我们要学习如何绑定如何换材质球和网格

1.代码

代码如下(示例):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Rehandling : MonoBehaviour
{
    
    public Button eyes;//头发
    public Button hair;//眼睛
    public Button pants;//衣裳
    public Button shoes;//裤子
    public Button top;//鞋
    public Transform Femaletarck;//要换衣服的小女孩模型
    public Transform FemaleModel;//拥有整个资源的模型
    public Transform[] Femaletarcks;//要所有小女孩所有的Transform
    public Transform[] FemaleModels;//要整个资源模型的Transform
    Dictionary<string, Dictionary<string, SkinnedMeshRenderer>> pairs = new Dictionary<string, Dictionary<string, SkinnedMeshRenderer>>();//字典方便储存
    Dictionary<string, GameObject> valuePairs = new Dictionary<string, GameObject>();
    string[] vs = new string[] { "eyes-1", "face-1", "hair-1", "pants-1", "shoes-1", "top-1" };
    // Start is called before the first frame update
    void Start()
    {
        GainTransform();//初始化
        Initialized();//换装的方法
        eyes.onClick.AddListener(() =>//头发
        {
            Getdressed("eyes-2");
        });
      
        hair.onClick.AddListener(() =>//眼睛
        {
            Getdressed("hair-2");
        });
        pants.onClick.AddListener(() =>//衣裳
        {
            Getdressed("pants-2");
        });
        shoes.onClick.AddListener(() =>//裤子
        {
            Getdressed("shoes-2");
        });
        top.onClick.AddListener(() =>//鞋
        {
            Getdressed("top-2");
        });
    }
    void GainTransform()//初始化
    {
        Femaletarcks=Femaletarck.GetComponentsInChildren<Transform>(true);//获取小女孩所有的Transform
        FemaleModels = FemaleModel.GetComponentsInChildren<Transform>(true);//获取模型下所有的Transform
    }
    void Getdressed(string name)//换装的方法
    {
       string[] keys=name.Split('-');
       if(pairs.ContainsKey(keys[0]))//判断是否已经穿上了
        {
            if(pairs[keys[0]].ContainsKey(keys[1]))
            {
                return;//如果已经穿上了直接返回
            }
            else//如果没有穿上
            {
                GameObject go;
                if(valuePairs.TryGetValue(keys[0],out go))
                {
                    Destroy(go);//销毁衣服
                }
                valuePairs.Remove(keys[0]);//移除
                pairs.Remove(keys[0]);//移除
            }
        }
        List<Transform> equipment = new List<Transform>();//保存
        List<Transform> skeleton = new List<Transform>();//保存所有的骨骼
        foreach (var item in FemaleModels)
        {
            if(item.name==name)//查找
            {
                Dictionary<string, SkinnedMeshRenderer> keyValues = new Dictionary<string, SkinnedMeshRenderer>();
                keyValues.Add(keys[1], item.GetComponent<SkinnedMeshRenderer>());
                pairs.Add(keys[0],keyValues);//存入
                GameObject subassembly = new GameObject();//new一个空物体
                subassembly.transform.SetParent(Femaletarck);//认父
                valuePairs.Add(keys[0], subassembly);//保存
                subassembly.name=item.name;
                subassembly.AddComponent<SkinnedMeshRenderer>();//添加SkinnedMeshRenderer组件
                subassembly.GetComponent<SkinnedMeshRenderer>().sharedMesh=item.GetComponent<SkinnedMeshRenderer>().sharedMesh;//网格
                subassembly.GetComponent<SkinnedMeshRenderer>().materials = item.GetComponent<SkinnedMeshRenderer>().materials;//材质球
                foreach (var items in item.GetComponent<SkinnedMeshRenderer>().bones)
                {
                    foreach (var itemss in Femaletarcks)//在自己的骨骼中查找
                    {
                        if(items.name==itemss.name)
                        {
                            skeleton.Add(itemss);
                            subassembly.GetComponent<SkinnedMeshRenderer>().rootBone = itemss;// 是骨骼节点;
                        }
                    }
                }
                subassembly.GetComponent<SkinnedMeshRenderer>().bones = skeleton.ToArray();//所有相关的骨骼
            }
        }
        
    }
    public void Initialized()
    {
        for (int i = 0; i < vs.Length; i++)
        {
            Getdressed(vs[i]);
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}


例子

这边不让我传视频发个百度网盘链接在这

链接:https://pan.baidu.com/s/13jSXzZPJ9g1r1X_zZ2jVWw 
提取码:bn9b

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只学习的小鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值