using System.Collections.Generic; using Unity.Collections; using Unity.HLODSystem.Utils; using UnityEditor.Build; using UnityEditor.Build.Reporting; using UnityEngine; using UnityEngine.Experimental.Rendering; using UnityEngine.SceneManagement; namespace Unity.HLODSystem { public class HLODBuilder : IProcessSceneWithReport { public int callbackOrder { get { return 0; } } public void OnProcessScene(Scene scene, BuildReport report) { GameObject[] rootObjects = scene.GetRootGameObjects(); List terrains = new List(); List needDestroyDatas = new List(); for (int oi = 0; oi < rootObjects.Length; ++oi) { List hlods = new List(); List terrainHlods = new List(); FindComponentsInChild(rootObjects[oi], ref hlods); FindComponentsInChild(rootObjects[oi], ref terrainHlods); FindComponentsInChild(rootObjects[oi], ref terrains); for (int hi = 0; hi < hlods.Count; ++hi) { Object.DestroyImmediate(hlods[hi]); } for (int hi = 0; hi < terrainHlods.Count; ++hi) { if (terrainHlods[hi].DestroyTerrain) { needDestroyDatas.Add(terrainHlods[hi].TerrainData); } Object.DestroyImmediate(terrainHlods[hi]); } } for (int ti = 0; ti < terrains.Count; ++ti) { if (terrains[ti] == null) continue; bool needDestroy = needDestroyDatas.Contains(terrains[ti].terrainData); if (needDestroy) { Object.DestroyImmediate(terrains[ti]); } } } private void FindComponentsInChild(GameObject target, ref List components) { var component = target.GetComponent(); if (component != null) components.Add(component); foreach (Transform child in target.transform) { FindComponentsInChild(child.gameObject, ref components); } } } }