List <GameObject> IterativeCut(GameObject obj, int count) { CutParams param = new CutParams(false, false, false, false, Vector3.zero, float.PositiveInfinity, 0, Vector3.zero); try { CutResult res = API.PerformCut(obj, CuttingPlane.RandomInWorldSpace(obj.transform.position), param); res.DestroyObject(); if (res == null) { return(new List <GameObject>()); } if (count > 1) { List <GameObject> ret = new List <GameObject>(); foreach (CutObj robj in res.Results) { ret.AddRange( IterativeCut( robj .CopyParent() .CopyMaterial() .CopyVelocity() .WithDriftVelocity(0.2f) .Instantiate(), count - 1 ) ); } return(ret); } else { return(res.ConvertAll( robj => robj .CopyParent() .CopyMaterial() .WithCollider() .WithRenderer() .CopyVelocity() .WithDriftVelocity(0.2f) .Instantiate() )); } } catch (MeshUtilsException e) { Debug.LogWarning(e); obj.AddComponent <Rigidbody>(); obj.AddComponent <MeshRenderer>(); obj.AddComponent <MeshCollider>(); return(new List <GameObject>() { obj }); } }