Unity2D轮转图换装

一.换装

1.受蒙皮影响的位置一般分为(头,身体,腿等),我们的换装主要是针对这几个部位进行动态更换

下面是主骨骼

 

 主骨骼必须是带有SkinnedMeshRenderer这个组件

 2.为主骨骼创建一个脚本

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

public class ChangeMesh : MonoBehaviour
{
    public GameObject[] bodys;//定义物体数组

    public static ChangeMesh instance;
    private void Awake()
    {
        instance = this;
    }
    // Start is called before the first frame update
    void Start()
    {
        Change();
    }

    public void Change()//换装函数
    {
        //创建一个新的网格,把各个部件的网格合并到一个新的网格
        Mesh mesh = new Mesh();
        //网格合并实例集合
        List<CombineInstance> combines = new List<CombineInstance>();
        //材质的集合
        List<Material> materials = new List<Material>();
        //获取骨骼信息
        Transform[] allbones=transform.GetComponentsInChildren<Transform>();
        //骨骼信息定义一个字典
        Dictionary<string,Transform> dicBones = new Dictionary<string,Transform>();
        //骨骼信息添加到字典中
        foreach (Transform t in allbones)
        {
            dicBones.Add(t.name, t);
        }
        //再次新建一个存储骨骼信息
        List<Transform> mybones= new List<Transform>();
        //遍历取出身体部件上的骨骼信息
        for (int i=0;i< bodys.Length;i++)
        {
            //新建网格合并实例
            CombineInstance combine = new CombineInstance();
            //网格合并中的网格进行赋值
            combine.mesh = bodys[i].GetComponentInChildren<SkinnedMeshRenderer>().sharedMesh;
            //网格合并实例进行添加
            combines.Add(combine);
            //材质物体添加此物体上的共享材质
            materials.Add(bodys[i].GetComponentInChildren<SkinnedMeshRenderer>().sharedMaterial);
            //取出某个部件的骨骼信息
            Transform[] bones = bodys[i].GetComponentInChildren<SkinnedMeshRenderer>().bones;
            //遍历取出的骨骼信息
            for (int j = 0; j < bones.Length; j++)
            {
                //如果自己的骨骼字典中有和其相同的骨骼
                if (dicBones.ContainsKey(bones[i].name))
                {
                    //新建的骨骼集合进行添加
                    mybones.Add(dicBones[bones[j].name]);
                }
            }
        }
        //将存储三件服装的网格合并实例集合
        mesh.CombineMeshes(combines.ToArray(),false,false);
        //新的网格信息赋值给自己
        GetComponent<SkinnedMeshRenderer>().sharedMesh = mesh;
        //共享材质信息赋值给自己
        GetComponent<SkinnedMeshRenderer>().materials=materials.ToArray();
        //最后再将新骨骼集合化为Object类型给自身骨骼赋值
        GetComponent<SkinnedMeshRenderer>().bones=mybones.ToArray();
    }

这是一些身体部件的预制体

 写一个改变身体部位的方法

public void ChangeHuan(string name)
    {
        if(name.Contains("Tou"))
        {
            bodys[0] = Resources.Load<GameObject>("Prefabs/" + name);
            bodys[1] = bodys[1];
            bodys[2] = bodys[2];
            Change();
            return;
        }
        if(name.Contains("YiFu"))
        {
            bodys[0] = bodys[0];
            bodys[1] = Resources.Load<GameObject>("Prefabs/" + name);
            bodys[2] = bodys[2];
            Change();
            return;
        }
        if(name.Contains("Tui"))
        {
            bodys[0] = bodys[0];
            bodys[1] = bodys[1];
            bodys[2]= Resources.Load<GameObject>("Prefabs/" + name);
            Change();
            return;
        }
    }

在2d轮转图中调用这个方法

public void OnEndDrag(PointerEventData eventData)
    {
        float dis = eventData.delta.x;
        float time = Mathf.Abs(dis / dec);
        DOTween.To((a) => 
        {
            allang -= a / dec;
            Move();
        }, dis, 0, time).OnComplete(() => 
        {
            int index= objects.IndexOf(trans[trans.Count-1].GetComponent<Image>());
            print("抽到了" + transform.name + index);
            ChangeMesh.instance.ChangeHuan(transform.name + index);

            float moveang = Mathf.Asin(trans[num-1].transform.localPosition.x/r);
            float moveangtime = Mathf.Abs(moveang * r / dec);
            DOTween.To((b) => 
            {
                allang = b;
                Move();
            },allang,allang+moveang,moveangtime);
        });
    }

效果如下:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity 2D统计Unity引擎中用于可视化数据的工具。它可以帮助开发者以形化的方式呈现数据,并提供分析和理解数据的能力。 使用Unity 2D统计,开发者可以轻松地创建折线、柱状、饼等不同类型的统计表。开发者可以自定义表的外观,包括颜色、大小、标签等,以使统计表更符合项目需求和美观。 通过Unity 2D统计,开发者可以将数据可视化,更直观地了解数据的分布和变化趋势。比如,开发者可以用柱状显示销售数据,通过不同柱子的高度来比较不同时间段的销售额;或者用折线显示用户数量随时间的变化趋势,从而了解用户增长的速度和趋势。 除了数据可视化外,Unity 2D统计还提供了一些分析功能,如数据筛选、排序、筛选条件设置等。开发者可以根据需要使用这些功能来深入分析数据,从而更好地理解和运用数据。 Unity 2D统计的优势是其与Unity引擎的无缝集成。开发者可以直接在Unity编辑器中创建和编辑统计表,将其嵌入到游戏界面中,与其他游戏元素一起呈现给玩家。这使得统计表能够更好地嵌入到游戏中,提供数据的可视化和分析功能。 综上所述,Unity 2D统计是一款功能强大的数据可视化工具,能够帮助开发者以形化的方式呈现和分析数据。它的灵活性和与Unity引擎的集成使其在游戏开发中具有广泛的应用价值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值