using UnityEngine; public class MegaCopyObject { private static GameObject CopyMesh(GameObject subject) { GameObject gameObject = Object.Instantiate(subject); MeshFilter[] componentsInChildren = subject.GetComponentsInChildren(); MeshFilter[] componentsInChildren2 = gameObject.GetComponentsInChildren(); MeshCollider[] componentsInChildren3 = gameObject.GetComponentsInChildren(); MeshCollider[] componentsInChildren4 = gameObject.GetComponentsInChildren(); int num = componentsInChildren.Length; for (int i = 0; i < num; i++) { MeshFilter meshFilter = componentsInChildren[i]; MeshFilter meshFilter2 = componentsInChildren2[i]; Mesh sharedMesh = meshFilter.sharedMesh; Mesh mesh = new Mesh(); mesh.vertices = sharedMesh.vertices; mesh.uv2 = sharedMesh.uv2; mesh.uv2 = sharedMesh.uv2; mesh.uv = sharedMesh.uv; mesh.normals = sharedMesh.normals; mesh.tangents = sharedMesh.tangents; mesh.colors = sharedMesh.colors; mesh.subMeshCount = sharedMesh.subMeshCount; for (int j = 0; j < sharedMesh.subMeshCount; j++) { mesh.SetTriangles(sharedMesh.GetTriangles(j), j); } mesh.boneWeights = sharedMesh.boneWeights; mesh.bindposes = sharedMesh.bindposes; mesh.name = sharedMesh.name + "_copy"; mesh.RecalculateBounds(); meshFilter2.sharedMesh = mesh; for (int k = 0; k < componentsInChildren3.Length; k++) { MeshCollider meshCollider = componentsInChildren3[k]; if (meshCollider.sharedMesh == sharedMesh) { componentsInChildren4[k].sharedMesh = mesh; } } } return gameObject; } private static void CopyBlendShapes(Mesh mesh, Mesh clonemesh) { } private static GameObject CopyMesh(GameObject subject, MegaModifyObject mod) { GameObject gameObject = new GameObject(); MeshFilter meshFilter = gameObject.AddComponent(); SkinnedMeshRenderer component = subject.GetComponent(); SkinnedMeshRenderer skinnedMeshRenderer = null; if ((bool)component) { skinnedMeshRenderer = gameObject.AddComponent(); skinnedMeshRenderer.sharedMaterials = component.sharedMaterials; } else { MeshRenderer component2 = subject.GetComponent(); MeshRenderer meshRenderer = gameObject.AddComponent(); meshRenderer.sharedMaterials = component2.sharedMaterials; } MeshFilter[] componentsInChildren = subject.GetComponentsInChildren(); MeshCollider[] componentsInChildren2 = gameObject.GetComponentsInChildren(); MeshCollider[] componentsInChildren3 = gameObject.GetComponentsInChildren(); int num = componentsInChildren.Length; for (int i = 0; i < num; i++) { MeshFilter meshFilter2 = componentsInChildren[i]; Mesh sharedMesh = meshFilter2.sharedMesh; Mesh mesh = new Mesh(); mesh.vertices = mod.verts; mesh.uv2 = sharedMesh.uv2; mesh.uv2 = sharedMesh.uv2; mesh.uv = mod.uvs; if (mod.NormalMethod == MegaNormalMethod.Mega && mod.norms != null && mod.norms.Length > 0) { mesh.normals = mod.norms; } else { mesh.normals = sharedMesh.normals; } mesh.tangents = sharedMesh.tangents; mesh.colors = sharedMesh.colors; mesh.subMeshCount = sharedMesh.subMeshCount; for (int j = 0; j < sharedMesh.subMeshCount; j++) { mesh.SetTriangles(sharedMesh.GetTriangles(j), j); } CopyBlendShapes(sharedMesh, mesh); mesh.boneWeights = sharedMesh.boneWeights; mesh.bindposes = sharedMesh.bindposes; mesh.name = sharedMesh.name + "_copy"; mesh.RecalculateBounds(); meshFilter.sharedMesh = mesh; for (int k = 0; k < componentsInChildren2.Length; k++) { MeshCollider meshCollider = componentsInChildren2[k]; if (meshCollider.sharedMesh == sharedMesh) { componentsInChildren3[k].sharedMesh = mesh; } } if ((bool)skinnedMeshRenderer && (bool)component) { skinnedMeshRenderer.sharedMesh = mesh; } } return gameObject; } private static void CopyModObj(MegaModifyObject from, MegaModifyObject to) { if ((bool)from && (bool)to) { to.Enabled = from.Enabled; to.recalcbounds = from.recalcbounds; to.recalcCollider = from.recalcCollider; to.recalcnorms = from.recalcnorms; to.UpdateMode = from.UpdateMode; to.dynamicMesh = from.dynamicMesh; to.DrawGizmos = from.DrawGizmos; to.NormalMethod = from.NormalMethod; } } public static GameObject DoCopyObjects(GameObject from) { MegaModifyObject component = from.GetComponent(); GameObject gameObject = ((!component) ? CopyMesh(from) : CopyMesh(from, component)); MegaModifyObject megaModifyObject = gameObject.AddComponent(); CopyModObj(component, megaModifyObject); MegaModifier[] components = from.GetComponents(); for (int i = 0; i < components.Length; i++) { Component component2 = CopyComponent(components[i], gameObject); if ((bool)component2) { MegaModifier megaModifier = (MegaModifier)component2; megaModifier.PostCopy(components[i]); } } MegaWrap component3 = from.GetComponent(); if ((bool)component3) { CopyComponent(component3, gameObject); } if ((bool)megaModifyObject) { megaModifyObject.MeshUpdated(); } gameObject.name = from.name + " - Copy"; return gameObject; } public static GameObject DoCopyObjectsChildren(GameObject from) { GameObject gameObject = DoCopyObjects(from); for (int i = 0; i < from.transform.childCount; i++) { GameObject gameObject2 = from.transform.GetChild(i).gameObject; GameObject gameObject3 = DoCopyObjectsChildren(gameObject2); gameObject3.transform.parent = gameObject.transform; } return gameObject; } private static Component CopyComponent(Component from, GameObject to) { return null; } public static GameObject DeepCopy(GameObject subject) { GameObject gameObject = null; if ((bool)subject) { gameObject = Object.Instantiate(subject); SkinnedMeshRenderer[] componentsInChildren = subject.GetComponentsInChildren(); SkinnedMeshRenderer[] componentsInChildren2 = gameObject.GetComponentsInChildren(); int num = componentsInChildren.Length; for (int i = 0; i < num; i++) { Mesh sharedMesh = componentsInChildren[i].sharedMesh; Mesh mesh = new Mesh(); mesh.vertices = sharedMesh.vertices; mesh.uv2 = sharedMesh.uv2; mesh.uv2 = sharedMesh.uv2; mesh.uv = sharedMesh.uv; mesh.normals = sharedMesh.normals; mesh.tangents = sharedMesh.tangents; mesh.colors = sharedMesh.colors; mesh.subMeshCount = sharedMesh.subMeshCount; for (int j = 0; j < sharedMesh.subMeshCount; j++) { mesh.SetTriangles(sharedMesh.GetTriangles(j), j); } CopyBlendShapes(sharedMesh, mesh); mesh.boneWeights = sharedMesh.boneWeights; mesh.bindposes = sharedMesh.bindposes; mesh.name = sharedMesh.name + "_copy"; mesh.RecalculateBounds(); componentsInChildren2[i].sharedMesh = mesh; } MeshFilter[] componentsInChildren3 = subject.GetComponentsInChildren(); MeshFilter[] componentsInChildren4 = gameObject.GetComponentsInChildren(); MeshCollider[] componentsInChildren5 = gameObject.GetComponentsInChildren(); MeshCollider[] componentsInChildren6 = gameObject.GetComponentsInChildren(); for (int k = 0; k < componentsInChildren3.Length; k++) { MeshFilter meshFilter = componentsInChildren3[k]; MeshFilter meshFilter2 = componentsInChildren4[k]; Mesh sharedMesh2 = meshFilter.sharedMesh; Mesh mesh2 = new Mesh(); mesh2.vertices = sharedMesh2.vertices; mesh2.uv2 = sharedMesh2.uv2; mesh2.uv2 = sharedMesh2.uv2; mesh2.uv = sharedMesh2.uv; mesh2.normals = sharedMesh2.normals; mesh2.tangents = sharedMesh2.tangents; mesh2.colors = sharedMesh2.colors; mesh2.subMeshCount = sharedMesh2.subMeshCount; for (int l = 0; l < sharedMesh2.subMeshCount; l++) { mesh2.SetTriangles(sharedMesh2.GetTriangles(l), l); } CopyBlendShapes(sharedMesh2, mesh2); mesh2.boneWeights = sharedMesh2.boneWeights; mesh2.bindposes = sharedMesh2.bindposes; mesh2.name = sharedMesh2.name + "_copy"; mesh2.RecalculateBounds(); meshFilter2.sharedMesh = mesh2; for (int m = 0; m < componentsInChildren5.Length; m++) { MeshCollider meshCollider = componentsInChildren5[m]; Mesh mesh3 = (meshCollider.sharedMesh = sharedMesh2); if ((bool)mesh3) { componentsInChildren6[m].sharedMesh = mesh2; } } } MegaModifyObject[] componentsInChildren7 = gameObject.GetComponentsInChildren(); for (int n = 0; n < componentsInChildren7.Length; n++) { componentsInChildren7[n].MeshUpdated(); } } return gameObject; } public static GameObject InstanceObject(GameObject obj) { GameObject gameObject = null; if ((bool)obj) { MeshFilter component = obj.GetComponent(); MeshRenderer component2 = obj.GetComponent(); if ((bool)component) { gameObject = new GameObject(); gameObject.name = obj.name + " MegaInstance"; MeshRenderer meshRenderer = gameObject.AddComponent(); MeshFilter meshFilter = gameObject.AddComponent(); meshFilter.sharedMesh = component.sharedMesh; meshRenderer.sharedMaterials = component2.sharedMaterials; } } return gameObject; } public static Mesh DupMesh(Mesh mesh) { Mesh mesh2 = new Mesh(); mesh2.vertices = mesh.vertices; mesh2.uv2 = mesh.uv2; mesh2.uv2 = mesh.uv2; mesh2.uv = mesh.uv; mesh2.normals = mesh.normals; mesh2.tangents = mesh.tangents; mesh2.colors = mesh.colors; mesh2.subMeshCount = mesh.subMeshCount; for (int i = 0; i < mesh.subMeshCount; i++) { mesh2.SetTriangles(mesh.GetTriangles(i), i); } CopyBlendShapes(mesh, mesh2); mesh2.boneWeights = mesh.boneWeights; mesh2.bindposes = mesh.bindposes; mesh2.name = mesh.name + "_copy"; mesh2.RecalculateBounds(); return mesh2; } public static Mesh DupMesh(Mesh mesh, string suffix) { Mesh mesh2 = new Mesh(); mesh2.vertices = mesh.vertices; mesh2.uv2 = mesh.uv2; mesh2.uv2 = mesh.uv2; mesh2.uv = mesh.uv; mesh2.normals = mesh.normals; mesh2.tangents = mesh.tangents; mesh2.colors = mesh.colors; mesh2.subMeshCount = mesh.subMeshCount; for (int i = 0; i < mesh.subMeshCount; i++) { mesh2.SetTriangles(mesh.GetTriangles(i), i); } CopyBlendShapes(mesh, mesh2); mesh2.boneWeights = mesh.boneWeights; mesh2.bindposes = mesh.bindposes; mesh2.name = mesh.name + suffix; mesh2.RecalculateBounds(); return mesh2; } public static GameObject DuplicateObject(GameObject from) { GameObject gameObject = null; if ((bool)from) { gameObject = Object.Instantiate(from); if ((bool)gameObject) { MeshFilter[] componentsInChildren = gameObject.GetComponentsInChildren(); for (int i = 0; i < componentsInChildren.Length; i++) { componentsInChildren[i].sharedMesh = DupMesh(componentsInChildren[i].sharedMesh); } SkinnedMeshRenderer[] componentsInChildren2 = gameObject.GetComponentsInChildren(); for (int j = 0; j < componentsInChildren2.Length; j++) { componentsInChildren2[j].sharedMesh = DupMesh(componentsInChildren2[j].sharedMesh); } MegaModifyObject[] componentsInChildren3 = gameObject.GetComponentsInChildren(); for (int k = 0; k < componentsInChildren3.Length; k++) { componentsInChildren3[k].MeshUpdated(); } MegaModifier[] componentsInChildren4 = from.GetComponentsInChildren(); MegaModifier[] componentsInChildren5 = gameObject.GetComponentsInChildren(); for (int l = 0; l < componentsInChildren4.Length; l++) { componentsInChildren5[l].PostCopy(componentsInChildren4[l]); } MegaWrap[] componentsInChildren6 = gameObject.GetComponentsInChildren(); for (int m = 0; m < componentsInChildren6.Length; m++) { componentsInChildren6[m].SetMesh(); } gameObject.name = from.name + " - Copy"; } } return gameObject; } public static GameObject DuplicateObjectForPrefab(GameObject from) { GameObject gameObject = null; if ((bool)from) { gameObject = Object.Instantiate(from); if ((bool)gameObject) { MeshFilter[] componentsInChildren = gameObject.GetComponentsInChildren(); for (int i = 0; i < componentsInChildren.Length; i++) { componentsInChildren[i].sharedMesh = DupMesh(componentsInChildren[i].sharedMesh); } SkinnedMeshRenderer[] componentsInChildren2 = gameObject.GetComponentsInChildren(); for (int j = 0; j < componentsInChildren2.Length; j++) { componentsInChildren2[j].sharedMesh = DupMesh(componentsInChildren2[j].sharedMesh); } MegaModifyObject[] componentsInChildren3 = gameObject.GetComponentsInChildren(); for (int k = 0; k < componentsInChildren3.Length; k++) { componentsInChildren3[k].MeshUpdated(); } MegaModifier[] componentsInChildren4 = from.GetComponentsInChildren(); MegaModifier[] componentsInChildren5 = gameObject.GetComponentsInChildren(); for (int l = 0; l < componentsInChildren4.Length; l++) { componentsInChildren5[l].PostCopy(componentsInChildren4[l]); } MegaWrap[] componentsInChildren6 = gameObject.GetComponentsInChildren(); for (int m = 0; m < componentsInChildren6.Length; m++) { componentsInChildren6[m].SetMesh(); } gameObject.name = from.name; } } return gameObject; } }