using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CombinePlayer : MonoBehaviour
{
public GameObject[] heads;
public GameObject[] bodys;
public GameObject[] legs;
public int headId = 0;
public int bodyId = 0;
public int legId = 0;
// Start is called before the first frame update
void Start()
{
Combine(true);
}
public void Combine(bool subMesh)
{
//把3个部位放入一个集合里
List<SkinnedMeshRenderer> skinneds = new List<SkinnedMeshRenderer>();
skinneds.Add(heads[headId].GetComponentInChildren<SkinnedMeshRenderer>());
skinneds.Add(bodys[bodyId].GetComponentInChildren<SkinnedMeshRenderer>());
skinneds.Add(legs[legId].GetComponentInChildren<SkinnedMeshRenderer>());
//获取自身所有骨骼
Transform[] allBone = GetComponentsInChildren<Transform>();
//把所有骨头放到字典里,只有相同名字的被用到时再取出
Dictionary<string, Transform> boneDic = new Dictionary<string, Transform>();
for (int i = 0; i < allBone.Length; i++)
{
boneDic.Add(allBone[i].name, allBone[i]);
}
//创建一个需要使用的骨头的集合
List<Transform> bones = new List<Transform>();
//循环所有部位,找到要用的骨头,取出咱们本身名字相同的
for (int i = 0; i < skinneds.Count; i++)
{
Transform[] patrBones = skinneds[i].bones;
for (int j = 0; j < patrBones.Length; j++)
{
if (boneDic.ContainsKey(patrBones[j].name))
{
bones.Add(boneDic[patrBones[j].name]);
}
}
}
//把骨头赋值给当前蒙皮网格渲染器
GetComponent<SkinnedMeshRenderer>().bones = bones.ToArray();
//老uv坐标集合
List<Vector2[]> olduvs = new List<Vector2[]>();
if (subMesh)
{
//纹理的集合
List<Texture2D> textures = new List<Texture2D>();
//合并图集使用的纹理
Texture2D texture = new Texture2D(256, 256);
//取出脸
Texture face = skinneds[0].sharedMaterial.GetTexture("_MainTex");
for (int i = 0; i < skinneds.Count; i++)
{
textures.Add(skinneds[i].sharedMaterial.GetTexture("_BackTex") as Texture2D);
}
Rect[] rects = texture.PackTextures(textures.ToArray(), 0);
//修改uv坐标
for (int i = 0; i < skinneds.Count; i++)
{
Vector2[] olduv = skinneds[i].sharedMesh.uv;
olduvs.Add(olduv);
Vector2[] newuv = new Vector2[olduv.Length];
for (int j = 0; j < olduv.Length; j++)
{
float uvx = rects[i].x + rects[i].width * olduv[j].x;
float uvy = rects[i].y + rects[i].height * olduv[j].y;
newuv[j] = new Vector2(uvx, uvy);
}
skinneds[i].sharedMesh.uv = newuv;
}
Material material = new Material(Shader.Find("Custom/Face"));
material.SetTexture("_BackTex",texture);
material.SetTexture("_MainTex", face);
material.SetFloat("_PosX", texture.width/face.width);
material.SetFloat("_PosY",texture.height/face.height);
GetComponent<SkinnedMeshRenderer>().material = material;
}
else
{
//创建材质球集合
List<Material> materials = new List<Material>();
//存材质球
for (int i = 0; i < skinneds.Count; i++)
{
materials.Add(skinneds[i].sharedMaterial);
}
GetComponent<SkinnedMeshRenderer>().materials = materials.ToArray();
}
//创建合并实例集合
List<CombineInstance> combines = new List<CombineInstance>();
for (int i = 0; i < skinneds.Count; i++)
{
CombineInstance combine = new CombineInstance();
combine.mesh = skinneds[i].sharedMesh;
combine.transform = skinneds[i].transform.localToWorldMatrix;
combines.Add(combine);
}
Mesh mesh = new Mesh();
mesh.CombineMeshes(combines.ToArray(), subMesh, false);
GetComponent<SkinnedMeshRenderer>().sharedMesh = mesh;
if(subMesh)
{
//还原网格uv坐标
for (int i = 0; i < skinneds.Count; i++)
{
skinneds[i].sharedMesh.uv = olduvs[i];
}
}
}
}
玩家换装——待完善
最新推荐文章于 2024-10-10 18:32:28 发布