2022.2.19日总结

今天完成了换装代码的部分逻辑实现。

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

public class AvatarSys : MonoBehaviour
{
    private GameObject GirlSource;//资源model
    private GameObject GirlTarget;//骨架,换装的人

    private Transform GirlSourceTrans;
    private Transform GirlTargetTrans;

    private Dictionary<string, Dictionary<string, SkinnedMeshRenderer>> girlData = new Dictionary<string, Dictionary<string, SkinnedMeshRenderer>>();
    //新建字典,根据Key数的值来获取Value,得到小女孩的所有资源信息
    private Dictionary<string, SkinnedMeshRenderer> Smr = new Dictionary<string, SkinnedMeshRenderer>();
    //换装骨骼身上的SkinnedMeshRenderer信息

    Transform[] GirlHips;//小女孩骨骼信息

    public Transform OccurPosition;
    
    // Start is called before the first frame update
    void Start()
    {
        InstantiateSource();
        InstantiateTarget();
        GirlHips = GirlTarget.GetComponentsInChildren<Transform>();

        SaveData(); 
    }

    void InstantiateSource()
    {
        GirlSource = Instantiate(Resources.Load("FemaleModel")) as GameObject;//加载资源物体
        GirlSourceTrans = GirlSource.transform;
        GirlSource.SetActive(false);
    }

    void InstantiateTarget()
    {
        GirlTarget = Instantiate(Resources.Load("FemaleTarget")) as GameObject;
    }

    void SaveData()
    {
        if (GirlSourceTrans == null)
            return;
        SkinnedMeshRenderer[] parts = GirlSourceTrans.GetComponentsInChildren<SkinnedMeshRenderer>();
        //遍历所有子物体有SkinnedMeshRenderer的进行存储
        foreach (var part in parts)
        {
            string[] names = part.name.Split('-');
            if (!girlData.ContainsKey(names[0]))
            {
                //生成对应的部位且只生成一个
                GameObject partGo = new GameObject();
                partGo.name = names[0];
                partGo.transform.parent = GirlTarget.transform;

                Smr.Add(names[0], partGo.GetComponent<SkinnedMeshRenderer>());
                //把骨骼身上的skm信息存储到换装中

                girlData.Add(names[0], new Dictionary<string, SkinnedMeshRenderer>());
            }
            girlData[names[0]].Add(names[1],part);//存储所有的Smr信息到字典
        }
    }

    void ChangeMesh(string part,string num)//传入部位编号,从girldata里面拿对应的skm
    {
        SkinnedMeshRenderer skm = girlData[part][num];//要更换的部位

        List<Transform> bones = new List<Transform>();
        foreach (var trans in skm.bones)
        {
            foreach (var bone in GirlHips)
            {
                if (bone.name == trans.name)
                {
                    bones.Add(bone);
                    break;
                }
            }
        }
        Smr[part].bones = bones.ToArray();
        Smr[part].materials = skm.materials;
        Smr[part].sharedMesh = skm.sharedMesh;
    }




    // Update is called once per frame
    void Update()
    {
        
    }
}
//第一次的一直报错,是由于Resources目录拼成了Resource,而Resources.Load传入的是Resources的资源名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

东部花园

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

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

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

打赏作者

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

抵扣说明:

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

余额充值