HitDetection.SplitMesh C# (CSharp) Method

SplitMesh() private method

private SplitMesh ( ) : IEnumerator
return IEnumerator
    IEnumerator SplitMesh()
    {
        MeshFilter MF = transform.parent.GetComponent<MeshFilter>();
        MeshRenderer MR = transform.parent.GetComponent<MeshRenderer>();
        Mesh M = MF.mesh;
        Vector3[] verts = M.vertices;
        Vector3[] normals = M.normals;
        Vector2[] uvs = M.uv;
        Transform parent = transform.parent;

        var heading = player.transform.position - parent.position;
        var distance = heading.magnitude;
        var direction = heading / distance; // This is now the normalized direction.

        for (int submesh = 0; submesh < M.subMeshCount; submesh++)
        {
            int[] indices = M.GetTriangles(submesh);
            for (int i = 0; i < indices.Length; i += 30)
            {
                Vector3[] newVerts = new Vector3[3];
                Vector3[] newNormals = new Vector3[3];
                Vector2[] newUvs = new Vector2[3];
                for (int n = 0; n < 3; n++)
                {
                    int index = indices[i + n];
                    newVerts[n] = verts[index];
                    newUvs[n] = uvs[index];
                    newNormals[n] = normals[index];
                }
                Mesh mesh = new Mesh();
                mesh.vertices = newVerts;
                mesh.normals = newNormals;
                mesh.uv = newUvs;

                mesh.triangles = new int[] { 0, 1, 2, 2, 1, 0 };

                GameObject GO = new GameObject("Triangle " + (i / 3));
                GO.transform.position = parent.position;
                GO.transform.rotation = parent.rotation;
                GO.AddComponent<MeshRenderer>().material = MR.materials[submesh];
                GO.AddComponent<MeshFilter>().mesh = mesh;
                GO.AddComponent<BoxCollider>();
                GO.AddComponent<Rigidbody>().drag = 0.5f;
                GO.GetComponent<Rigidbody>().AddExplosionForce(4000f, parent.transform.position + (direction * 4f), 50f, 3.0F);

                Destroy(GO, 1 + Random.Range(0.0f, 1.0f));
            }
        }

        MR.enabled = false;

        //		Time.timeScale = 0.2f;
        yield return new WaitForSeconds(0.8f);
        //		Time.timeScale = 1.0f;
        Destroy(gameObject.transform.parent.gameObject);
    }