轮转图换装

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

初始化的时候给玩家添加skinnedMeshRender组件

骨骼和子节点的预制体

 把身体的部位分成三份 1头部 2 衣服 3腿部 然后用数组对象管理起来

        bodys[0] = Resources.Load<GameObject>("MyPlayer/tou" + touid);
        bodys[1] = Resources.Load<GameObject>("MyPlayer/yifu" + yifuid);
        bodys[2] = Resources.Load<GameObject>("MyPlayer/tui" + tuiid);

三个部位先加载出来

后面就是找到当前的骨骼及名称去对应的部位中找到需要使用的骨骼合并网格材质球

public GameObject[] bodys;
    public int touid = 1;
    public int yifuid = 1;
    public int tuiid = 1;

        bodys[0] = Resources.Load<GameObject>("MyPlayer/tou" + touid);
        bodys[1] = Resources.Load<GameObject>("MyPlayer/yifu" + yifuid);
        bodys[2] = Resources.Load<GameObject>("MyPlayer/tui" + tuiid);
        //1.找到当前所有骨骼及名称
        Transform[] allaones = GetComponentsInChildren<Transform>();
        Dictionary<string, Transform> dicbones = new Dictionary<string, Transform>();
        //2.把所有骨骼以名称作为key存入字典,方便后面查找
        for (int i = 0; i < allaones.Length; i++)
        {
            dicbones.Add(allaones[i].name, allaones[i]);
        }
        //3.去每个对应部位中找到需要使用的骨骼,并将其保存
        List<Transform> bones = new List<Transform>();
        //合并网格材质球
        List<CombineInstance> combines = new List<CombineInstance>();
        List<Material> materials = new List<Material>();
        for (int i = 0; i < bodys.Length; i++)
        {
            //找网格
            CombineInstance combin = new CombineInstance();
            combin.mesh = bodys[i].GetComponentInChildren<SkinnedMeshRenderer>().sharedMesh;
            combin.transform = bodys[i].transform.localToWorldMatrix;
            combines.Add(combin);
            //找材质球
            materials.Add(bodys[i].GetComponentInChildren<SkinnedMeshRenderer>().sharedMaterial);
            //找骨骼
            Transform[] bodybones = bodys[i].GetComponentInChildren<SkinnedMeshRenderer>().bones;
            for (int j = 0; j < bodybones.Length; j++)
            {
                //注意:我要使用的是自己的骨骼,而不是预制体上的骨骼
                bones.Add(dicbones[bodybones[j].name]);
            }
        }
        Mesh mesh = new Mesh();
        mesh.CombineMeshes(combines.ToArray(), false,false);
        GetComponent<SkinnedMeshRenderer>().sharedMesh = mesh;
        GetComponent<SkinnedMeshRenderer>().materials = materials.ToArray();
        GetComponent<SkinnedMeshRenderer>().bones = bones.ToArray();

 轮转图脚本

 public CombinPlayer combin;
    public Transform player;
    public Image prefab;
    public float spacing = 100;
    public float max = 1;
    public float min = 0.5f;
    public int num = 5;

    float c;
    float r;
    float ang;
    float dis = 0;
    float cutspeed = 100;
    List<GameObject> list = new List<GameObject>();
    List<Transform> sorts = new List<Transform>();

    // Start is called before the first frame update
    void Start()
    {
        c = (prefab.rectTransform.rect.width + spacing) * num;
        r = c / (2 * Mathf.PI);
        ang = (2 * Mathf.PI) / num;
        player.transform.localScale = new Vector3(0,0, (max - min) * 0.5f + min)  ;
        sorts.Add(player);

       
        Move();
    }
    public void Move()
    {
        float moveang = dis / r;
        for (int i = 0; i < num; i++)
        {
            float x = Mathf.Sin(i * ang + moveang) * r;
            float z = Mathf.Cos(i * ang + moveang) * r;
            float p=(z+r)/(r+r);

            float scale = (max - min) * p + min;
            if(list.Count<=i)
            {
                GameObject image = Instantiate(prefab.gameObject, transform);
               image.GetComponent<Image>().sprite= Resources.Load<Sprite>("Image/image_" + i);
                int n = i;
                image.GetComponent<Button>().onClick.AddListener(() =>
                {
                    switch(n / 2)
                    {
                        case 0:combin.touid = n % 2;break;
                        case 2:combin.yifuid = n % 2;break;
                        case 1:combin.tuiid= n % 2;break;
                    }
                    combin.ChangeOfOutfit();
                });
                list.Add(image);
                sorts.Add(image.transform);
            }
            list[i].transform.localPosition = new Vector3(x, p*-100, 0);
            list[i].transform.localScale = Vector3.one * scale;
        }
       
        sorts.Sort((a, b) =>
        {
            if(a.localScale.z<b.localScale.z)
            {
                return -1;
            }
           else  if (a.localScale.z == b.localScale.z)
            {
                return 0;
            }
            else
            {
                return 1;
            }
        });
        for (int i = 0; i < sorts.Count; i++)
        {
            sorts[i].SetSiblingIndex(i);
        }
    }

    public void OnDrag(PointerEventData eventData)
    {
        dis += eventData.delta.x;
        Move();
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值