(Unity)换装

zhezheil换装系统就是更换蒙皮、合兵蒙皮的过程。

蒙皮渲染器:

带蒙皮的网格渲染器 (Skinned Mesh Renderer) - Unity 手册

换装主要会用到其下的bones、mesh、material这三个数据,收集并合并到主蒙皮网格渲染器里。

核心内容在:收集数据合并数据里

for(int i = 0; i < partlist.Length; i++)
        {
            //骨骼
            for(int j = 0; j < SmrDic[partlist[i]].bones.Length; j++)
            {
                Transform t = SmrDic[partlist[i]].bones[j];
                bonesList.Add(t);
            }
            //材质
            mateList.Add(SmrDic[partlist[i]].sharedMaterial);
            //网格
            CombineInstance combine = new CombineInstance();
            combine.mesh = SmrDic[partlist[i]].sharedMesh;
            meshList.Add(combine);
        }
        //合并赋值
        PlayerSmr.bones = bonesList.ToArray();
        PlayerSmr.sharedMaterials = mateList.ToArray();
        Mesh mesh = new Mesh();
        mesh.CombineMeshes(meshList.ToArray(), false, false);
        PlayerSmr.sharedMesh = mesh;

 这里我用2D轮转图来作为切换部位的控件

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

public class ChangeManager : MonoBehaviour
{
    SkinnedMeshRenderer PlayerSmr;
    public GameObject[] prefabs;
    Dictionary<string, SmrData> smrDic = new Dictionary<string, SmrData>();
    Dictionary<string, SkinnedMeshRenderer> SmrDic = new Dictionary<string, SkinnedMeshRenderer>();
    List<Transform> bonesList = new List<Transform>();
    List<Material> mateList = new List<Material>();
    List<CombineInstance> meshList = new List<CombineInstance>();
    public int[] oldarr = new int[4] {0,0,0,0};
    string[] partnames = new string[12] 
    {
        "脚4","脚6","脚8","身4","身6","身8","手4","手6","手8","头4","头6","头8"
    };
    private void Awake()
    {
        PlayerSmr = GetComponent<SkinnedMeshRenderer>();
        //存储所有部件信息
        for (int i = 0; i < prefabs.Length-3; i++)
        {
            SkinnedMeshRenderer smr = prefabs[i].GetComponentInChildren<SkinnedMeshRenderer>();
            SmrDic.Add(partnames[i], smr);
        }
    }
    public void SendIndex()
    {
        string[] strs = new string[oldarr.Length];
        for(int i = 0; i < oldarr.Length; i++)
        {
            strs[i] = partnames[oldarr[i]+(i*3)];
        }
        ChangeClothes(strs);
    }
    public void ChangeClothes(string[] partlist)
    {
        //清理
        bonesList.Clear();
        mateList.Clear();
        meshList.Clear();
        
        for(int i = 0; i < partlist.Length; i++)
        {
            //骨骼
            for(int j = 0; j < SmrDic[partlist[i]].bones.Length; j++)
            {
                Transform t = SmrDic[partlist[i]].bones[j];
                bonesList.Add(t);
            }
            //材质
            mateList.Add(SmrDic[partlist[i]].sharedMaterial);
            //网格
            CombineInstance combine = new CombineInstance();
            combine.mesh = SmrDic[partlist[i]].sharedMesh;
            meshList.Add(combine);
        }
        //合并赋值
        PlayerSmr.bones = bonesList.ToArray();
        PlayerSmr.sharedMaterials = mateList.ToArray();
        Mesh mesh = new Mesh();
        mesh.CombineMeshes(meshList.ToArray(), false, false);
        PlayerSmr.sharedMesh = mesh;
    }
    void Update()
    {
        
    }
}

 

(模型来源于网络)

模型来源于网络

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值