private static void ConvertMeshToColliders(GameObject gameObject, string location = null, bool setConvex = true) { MeshFilter[] meshFilters = gameObject.GetComponentsInChildren <MeshFilter>(); if (UrdfRobotExtensions.importsettings.convexMethod == ImportSettings.convexDecomposer.unity) { foreach (MeshFilter meshFilter in meshFilters) { GameObject child = meshFilter.gameObject; MeshCollider meshCollider = child.AddComponent <MeshCollider>(); meshCollider.sharedMesh = meshFilter.sharedMesh; meshCollider.convex = setConvex; Object.DestroyImmediate(child.GetComponent <MeshRenderer>()); Object.DestroyImmediate(meshFilter); } } else { string templateFileName = ""; string filePath = ""; int meshIndex = 0; if (!RuntimeUrdf.IsRuntimeMode() && location != null) { string meshFilePath = UrdfAssetPathHandler.GetRelativeAssetPathFromUrdfPath(location, false); templateFileName = Path.GetFileNameWithoutExtension(meshFilePath); filePath = Path.GetDirectoryName(meshFilePath); } foreach (MeshFilter meshFilter in meshFilters) { GameObject child = meshFilter.gameObject; VHACD decomposer = child.AddComponent <VHACD>(); List <Mesh> colliderMeshes = decomposer.GenerateConvexMeshes(meshFilter.sharedMesh); foreach (Mesh collider in colliderMeshes) { if (!RuntimeUrdf.IsRuntimeMode()) { meshIndex++; string name = $"{filePath}/{templateFileName}_{meshIndex}.asset"; Debug.Log($"Creating new mesh file: {name}"); RuntimeUrdf.AssetDatabase_CreateAsset(collider, name); RuntimeUrdf.AssetDatabase_SaveAssets(); } MeshCollider current = child.AddComponent <MeshCollider>(); current.sharedMesh = collider; current.convex = setConvex; } Component.DestroyImmediate(child.GetComponent <VHACD>()); Object.DestroyImmediate(child.GetComponent <MeshRenderer>()); Object.DestroyImmediate(meshFilter); } } }
public void GenerateConvexMeshes_Cylinder_NullInput() { // Create primitive cylinder with VHACD GameObject geometryGameObject = new GameObject("Cylinder"); MeshFilter meshFilter = geometryGameObject.AddComponent <MeshFilter>(); Link.Geometry.Cylinder cylinder = new Link.Geometry.Cylinder(0.5, 2); //Default unity cylinder sizes meshFilter.sharedMesh = UrdfGeometry.CreateCylinderMesh(cylinder); GameObject go = meshFilter.gameObject; VHACD decomposer = go.AddComponent <VHACD>(); List <Mesh> colliderMeshes = decomposer.GenerateConvexMeshes(null); Assert.IsNotNull(meshFilter.sharedMesh); Assert.IsTrue(colliderMeshes.Count > 0); Component.DestroyImmediate(go.GetComponent <VHACD>()); Object.DestroyImmediate(go.GetComponent <MeshRenderer>()); Object.DestroyImmediate(meshFilter); }
private static void ConvertMeshToColliders(GameObject gameObject, bool setConvex = true) { MeshFilter[] meshFilters = gameObject.GetComponentsInChildren <MeshFilter>(); if (UrdfRobotExtensions.importsettings.convexMethod == ImportSettings.convexDecomposer.unity) { foreach (MeshFilter meshFilter in meshFilters) { GameObject child = meshFilter.gameObject; MeshCollider meshCollider = child.AddComponent <MeshCollider>(); meshCollider.sharedMesh = meshFilter.sharedMesh; meshCollider.convex = setConvex; Object.DestroyImmediate(child.GetComponent <MeshRenderer>()); Object.DestroyImmediate(meshFilter); } } else { foreach (MeshFilter meshFilter in meshFilters) { GameObject child = meshFilter.gameObject; VHACD decomposer = child.AddComponent <VHACD>(); List <Mesh> colliderMeshes = decomposer.GenerateConvexMeshes(meshFilter.sharedMesh); foreach (Mesh collider in colliderMeshes) { MeshCollider current = child.AddComponent <MeshCollider>(); current.sharedMesh = collider; current.convex = setConvex; } Component.DestroyImmediate(child.GetComponent <VHACD>()); Object.DestroyImmediate(child.GetComponent <MeshRenderer>()); Object.DestroyImmediate(meshFilter); } } }