using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;using VRM;using UnityEngine.Animations;using System.Linq;[RequireComponent(typeof(MeshFilter))][RequireComponent(typeof(MeshRenderer))]publicclassMerge:MonoBehaviour{publicButtonbuttonReference;voidStart(){Buttonbtn= buttonReference.GetComponent<Button>();
btn.onClick.AddListener(TaskOnClick);}privatevoidMergeMeshes(){
GameObject[]traitObjects= GameObject.FindGameObjectsWithTag("Traits");// Create a dictionary to store the mesh filters and renderers of objects that share a common parentDictionary<Transform,List<MeshFilter>>parentMeshes=newDictionary<Transform,List<MeshFilter>>();Dictionary<Transform,List<Material[]>>parentMaterials=newDictionary<Transform,List<Material[]>>();foreach(GameObject traitObject in traitObjects){MeshFiltermeshFilter= traitObject.GetComponent<MeshFilter>();MeshRendererrenderer= traitObject.GetComponent<MeshRenderer>();// If the current object has a mesh filter and rendererif(meshFilter!=null&&renderer!=null){TransformparentTransform= traitObject.transform.parent;// If the parent of the current object is not already in the dictionaryif(!parentMeshes.ContainsKey(parentTransform)){// Add a new entry to the dictionary for this parent
parentMeshes[parentTransform]=newList<MeshFilter>();
parentMaterials[parentTransform]=newList<Material[]>();}// Add the mesh filter and materials to the lists of mesh filters and materials for this parent
parentMeshes[parentTransform].Add(meshFilter);
parentMaterials[parentTransform].Add(renderer.sharedMaterials);}}// Iterate over all parents in the dictionaryforeach(Transform parentTransform in parentMeshes.Keys){List<MeshFilter>meshFilters= parentMeshes[parentTransform];HashSet<Material>uniqueMaterials=newHashSet<Material>();
CombineInstance[]combine=new CombineInstance[meshFilters.Count];// Iterate over all mesh filters for this parentfor(inti=0;i< meshFilters.Count;i++){
Material[]currentMaterials= meshFilters[i].GetComponent<MeshRenderer>().sharedMaterials;foreach(Material material in currentMaterials){
uniqueMaterials.Add(material);}
combine[i].mesh = meshFilters[i].sharedMesh;
combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
meshFilters[i].gameObject.SetActive(false);}// Create a new game object for this parentGameObjectnewObject=new GameObject(parentTransform.name +" (Combined)");
newObject.transform.parent = parentTransform.parent;
newObject.transform.localPosition = Vector3.zero;
newObject.transform.localRotation = Quaternion.identity;
newObject.transform.localScale = Vector3.one;
newObject.AddComponent<MeshRenderer>();
newObject.AddComponent<MeshFilter>();MeshFilternewMeshFilter= newObject.GetComponent<MeshFilter>();MeshcombinedMesh=new Mesh();
combinedMesh.CombineMeshes(combine);
newMeshFilter.mesh =combinedMesh;MeshRenderernewMeshRenderer= newObject.GetComponent<MeshRenderer>();for(inti=0;i< meshFilters.Count;i++){
Material[]currentMaterials= meshFilters[i].GetComponent<MeshRenderer>().sharedMaterials;foreach(Material material in currentMaterials){
uniqueMaterials.Add(material);}}
newMeshRenderer.sharedMaterials = uniqueMaterials.ToArray();// Destroy the original "Trait" objectsfor(inti=0;i< meshFilters.Count;i++){
Destroy(meshFilters[i].gameObject);}}}voidTaskOnClick(){
MergeMeshes();//MergeWeights();//CombineMeshes();}}