void GenerateLODs() { int maxLOD = 1; var go = gameObject; var hlodLayer = LayerMask.NameToLayer(HLODLayer); var lodGroup = go.GetComponent <LODGroup>(); if (lodGroup) { var lods = new LOD[maxLOD + 1]; var lod0 = lodGroup.GetLODs()[0]; lod0.screenRelativeTransitionHeight = 0.5f; lods[0] = lod0; var meshes = new List <Mesh>(); var totalMeshCount = maxLOD * lod0.renderers.Length; for (int l = 1; l <= maxLOD; l++) { var lodRenderers = new List <MeshRenderer>(); foreach (var mr in lod0.renderers) { var mf = mr.GetComponent <MeshFilter>(); var sharedMesh = mf.sharedMesh; var lodTransform = EditorUtility.CreateGameObjectWithHideFlags(string.Format("{0} LOD{1}", sharedMesh.name, l), k_DefaultHideFlags, typeof(MeshFilter), typeof(MeshRenderer)).transform; lodTransform.gameObject.layer = hlodLayer; lodTransform.SetPositionAndRotation(mf.transform.position, mf.transform.rotation); lodTransform.localScale = mf.transform.lossyScale; lodTransform.SetParent(mf.transform, true); var lodMF = lodTransform.GetComponent <MeshFilter>(); var lodRenderer = lodTransform.GetComponent <MeshRenderer>(); lodRenderers.Add(lodRenderer); EditorUtility.CopySerialized(mf, lodMF); EditorUtility.CopySerialized(mf.GetComponent <MeshRenderer>(), lodRenderer); var simplifiedMesh = new Mesh(); simplifiedMesh.name = sharedMesh.name + string.Format(" LOD{0}", l); lodMF.sharedMesh = simplifiedMesh; meshes.Add(simplifiedMesh); var meshLOD = MeshLOD.GetGenericInstance(meshSimplifierType); meshLOD.InputMesh = sharedMesh; meshLOD.OutputMesh = simplifiedMesh; meshLOD.Quality = Mathf.Pow(0.5f, l); } var lod = lods[l]; lod.renderers = lodRenderers.ToArray(); lod.screenRelativeTransitionHeight = l == maxLOD ? 0.01f : Mathf.Pow(0.5f, l + 1); lods[l] = lod; } lodGroup.ForceLOD(0); lodGroup.SetLODs(lods.ToArray()); lodGroup.RecalculateBounds(); lodGroup.ForceLOD(-1); #if UNITY_2018_2_OR_NEWER var prefab = PrefabUtility.GetCorrespondingObjectFromSource(go); #else var prefab = PrefabUtility.GetPrefabParent(go); #endif if (prefab) { var assetPath = AssetDatabase.GetAssetPath(prefab); var pathPrefix = Path.GetDirectoryName(assetPath) + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(assetPath); var lodsAssetPath = pathPrefix + "_lods.asset"; ObjectUtils.CreateAssetFromObjects(meshes.ToArray(), lodsAssetPath); } } }