void Update() { if (Input.GetMouseButtonUp(0)) { Ray cameraRay = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit rayCastHitInfo = default(RaycastHit); if (Physics.Raycast(cameraRay, out rayCastHitInfo)) { Mesh originMesh = rayCastHitInfo.collider.gameObject.GetComponent <MeshFilter>().sharedMesh; Vector3 slicerNormal = rayCastHitInfo.normal; Vector3 pointOnSlicer = rayCastHitInfo.point - slicerNormal * SlicerOffset; Plane slicerPlane = new Plane(slicerNormal, pointOnSlicer); Matrix4x4 trs = Matrix4x4.TRS(rayCastHitInfo.collider.gameObject.transform.position, rayCastHitInfo.collider.gameObject.transform.rotation, rayCastHitInfo.collider.gameObject.transform.localScale); Mesh m = Object.Instantiate <Mesh>(originMesh); m.ApplyTransposeMatrix(trs); MeshSlicer slicer = new MeshSlicer(m, slicerPlane); slicer.Slice(false, false); slicer.RenderSlicedGameObject(SlicedUpperMaterial); } } }
private void OnGUI() { if (GUILayout.Button("slice mesh", GUILayout.Width(100), GUILayout.Height(60))) { Plane slicerPlane = new Plane(slicerNormal, slicerDistance); Mesh targetMesh = null; Material originalMaterial = null; MeshFilter meshFilter = TargetGameobject.GetComponentInChildren <MeshFilter>(); if (meshFilter != null) { targetMesh = meshFilter.mesh; } else { SkinnedMeshRenderer skinMeshRenderer = TargetGameobject.GetComponentInChildren <SkinnedMeshRenderer>(); if (skinMeshRenderer != null) { targetMesh = skinMeshRenderer.sharedMesh; originalMaterial = skinMeshRenderer.material; } } if (!targetMesh) { Debug.LogError("target mesh is null"); return; } if (!originalMaterial) { MeshRenderer meshRenderer = TargetGameobject.GetComponentInChildren <MeshRenderer>(); if (meshRenderer) { originalMaterial = meshRenderer.material; } } m_meshSlicer = new MeshSlicer(targetMesh, slicerPlane); m_meshSlicer.Slice(IncludeIntersection, IncludeOppsiteSide); if (!SlicedUpperMaterial) { SlicedUpperMaterial = originalMaterial; } m_meshSlicer.RenderSlicedGameObject(SlicedUpperMaterial, SlicedUnderMaterial, SlicedUpperIntersectionMaterial, SlicedUnderIntersectionMaterial, TargetGameobject.name); if (RemainOriginGameObject) { TargetGameobject.SetActive(false); } else { GameObject.Destroy(TargetGameobject); } } }