Github:https://github.com/pinzeweifen/demo/tree/master/Unity/Replacement%20Dress
效果:
测试:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test : MonoBehaviour { public ReplacementDress replacementDress; public SkinnedMeshRenderer eye; public SkinnedMeshRenderer face; public SkinnedMeshRenderer hair; public SkinnedMeshRenderer pant; public SkinnedMeshRenderer shoes; public SkinnedMeshRenderer body; private void Start() { //先一次性添加所有需要变换的装扮 replacementDress.AddSkin(eye); replacementDress.AddSkin(face); replacementDress.AddSkin(hair); replacementDress.AddSkin(pant); replacementDress.AddSkin(shoes); replacementDress.AddSkin(body); //显示装扮 replacementDress.GeneraterSkin(); } }
using System.Collections.Generic; using UnityEngine; [RequireComponent(typeof(SkinnedMeshRenderer))] public class ReplacementDress : MonoBehaviour { private static System.Exception SmrException = new System.Exception("蒙皮组件不能为空!"); private List<Material> m_Materials = new List<Material>(); private List<Transform> m_Bones = new List<Transform>(); private List<CombineInstance> m_CombineInstances = new List<CombineInstance>(); private Mesh m_Mesh; private Dictionary<string, Transform> m_AllBones = new Dictionary<string, Transform>(); private SkinnedMeshRenderer m_SkinnedMeshRenderer; private int m_Count; private Transform[] m_TmpBones; private void Awake() { m_SkinnedMeshRenderer = GetComponent<SkinnedMeshRenderer>(); var childs = GetComponentsInChildren<Transform>(); m_Count = childs.Length; for(int i=0;i< m_Count; i++) { m_AllBones.Add(childs[i].name, childs[i]); } } /// <summary> /// 添加蒙皮 /// </summary> /// <param name="skin"></param> public void AddSkin(SkinnedMeshRenderer skin) { if (skin == null) throw SmrException; CombineInstance ci = new CombineInstance(); ci.mesh = skin.sharedMesh; m_CombineInstances.Add(ci); m_Materials.AddRange(skin.materials); m_TmpBones = skin.bones; m_Count = m_TmpBones.Length; for(int i = 0; i < m_Count; i++) { m_Bones.Add(m_AllBones[m_TmpBones[i].name]); } } /// <summary> /// 生成蒙皮 /// </summary> public void GeneraterSkin() { m_Mesh = new Mesh(); m_Mesh.CombineMeshes(m_CombineInstances.ToArray(), false, false); m_SkinnedMeshRenderer.sharedMesh = m_Mesh; m_SkinnedMeshRenderer.materials = m_Materials.ToArray(); m_SkinnedMeshRenderer.bones = m_Bones.ToArray(); m_Materials.Clear(); m_Bones.Clear(); m_CombineInstances.Clear(); } }