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()
{
}
}
(模型来源于网络)
模型来源于网络