使用材质球
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HzByMaterial : MonoBehaviour
{
public List<GameObject> gams;
// Start is called before the first frame update
void Start()
{
Mesh mesh = new Mesh();
List<CombineInstance> coms = new List<CombineInstance>();
List<Material> materials = new List<Material>();
List<Transform> bons = new List<Transform>();
//找到身上所有的骨骼 骨骼是本体 mesh网格是衣服
Transform[] mybons = GetComponentsInChildren<Transform>();
Dictionary<string, Transform> bonesdic = new Dictionary<string, Transform>();
foreach (var item in mybons)
{
bonesdic.Add(item.name, item);
}
for (int i = 0; i < gams.Count; i++)
{
materials.Add(gams[i].GetComponentInChildren<SkinnedMeshRenderer>().sharedMaterial);
CombineInstance instance = new CombineInstance();
instance.mesh = gams[i].GetComponentInChildren<SkinnedMeshRenderer>().sharedMesh;
instance.transform = gams[i].transform.localToWorldMatrix;
coms.Add(instance);
//看别人衣服在什么位置,穿在对应的部位上
foreach (var item in gams[i].GetComponentInChildren<SkinnedMeshRenderer>().bones)
{
if (bonesdic.ContainsKey(item.name))
{
bons.Add(bonesdic[item.name]);
}
}
}
mesh.CombineMeshes(coms.ToArray(), false, false);
GetComponent<SkinnedMeshRenderer>().bones = bons.ToArray();
GetComponent<SkinnedMeshRenderer>().sharedMesh = mesh;
GetComponent<SkinnedMeshRenderer>().materials = materials.ToArray();
}
}
使用贴图
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HzByTexture : MonoBehaviour
{
public List<GameObject> gams;
public Texture2D texture;
// Start is called before the first frame update
void Start()
{
Mesh mesh = new Mesh();
List<CombineInstance> coms = new List<CombineInstance>();
List<Texture2D> textures = new List<Texture2D>();
List<Transform> bons = new List<Transform>();
//找到身上所有的骨骼 骨骼是本体 mesh网格是衣服
Transform[] mybons = GetComponentsInChildren<Transform>();
Dictionary<string, Transform> bonesdic = new Dictionary<string, Transform>();
foreach (var item in mybons)
{
bonesdic.Add(item.name, item);
}
for (int i = 0; i < gams.Count; i++)
{
textures.Add(gams[i].GetComponentInChildren<SkinnedMeshRenderer>().sharedMaterial.mainTexture as Texture2D);
}
texture = new Texture2D(0, 0);
Rect[] rects = texture.PackTextures(textures.ToArray(), 0);
List<Vector2> uv = new List<Vector2>();
for (int i = 0; i < gams.Count; i++)
{
CombineInstance instance = new CombineInstance();
instance.mesh = gams[i].GetComponentInChildren<SkinnedMeshRenderer>().sharedMesh;
instance.transform = gams[i].transform.localToWorldMatrix;
coms.Add(instance);
//重新计算uv坐标
for (int j = 0; j < instance.mesh.uv.Length; j++)
{
Vector2 newuv = new Vector2(rects[i].x + rects[i].width * instance.mesh.uv[j].x, rects[i].y + rects[i].height * instance.mesh.uv[j].y);
uv.Add(newuv);
}
//看别人衣服在什么位置,穿在对应的部位上
foreach (var item in gams[i].GetComponentInChildren<SkinnedMeshRenderer>().bones)
{
if (bonesdic.ContainsKey(item.name))
{
bons.Add(bonesdic[item.name]);
}
}
}
mesh.CombineMeshes(coms.ToArray(), true, false);
mesh.uv = uv.ToArray();
GetComponent<SkinnedMeshRenderer>().bones = bons.ToArray();
GetComponent<SkinnedMeshRenderer>().sharedMesh = mesh;
Material material = new Material(Shader.Find("CarToonQ"));
material.SetTexture("_MainTex", texture);
Texture face = gams[0].GetComponentInChildren<SkinnedMeshRenderer>().sharedMaterial.GetTexture("_FaceTex");
material.SetTexture("_FaceTex", face);
material.SetFloat("_ScaleX", texture.width / face.width);
material.SetFloat("_ScaleY", texture.height / face.height);
GetComponent<SkinnedMeshRenderer>().material = material;
}
}