private void OnDisable() { if (_octreeDebug != null) { DestroyImmediate(_octreeDebug.gameObject); _octreeDebug = null; } //保存配置文件 string configPath = Path.GetDirectoryName(Application.dataPath); configPath = Path.Combine(configPath, "ProjectSettings/octree.json"); if (_octreeConfig != null) { File.WriteAllText(configPath, JsonUtility.ToJson(_octreeConfig)); } EditorApplication.update -= OnUpdate; _octree = null; }
//场景的八叉树GUI private void SceneOctreeGUI() { GUILayout.Label("Scene Octree", EditorStyles.boldLabel); GUILayout.BeginVertical("HelpBox"); Octree octree = (Octree)EditorGUILayout.ObjectField("Octree", _octree, typeof(Octree), false); if (octree != _octree) { _octree = octree; _octreeConfig.OctreeAssetPath = AssetDatabase.GetAssetPath(octree); _octreeConfig.MaxBounds = _octree.Root.Bounds; _octreeConfig.MaxDepth = _octree.MaxDepth; _octreeDebug.Octree = _octree; } bool hasOctree = (_octree != null); if (hasOctree) { EditorGUILayout.LabelField("OctreeAssetPath", _octreeConfig.OctreeAssetPath); } _octreeConfig.Mask = EditorGUILayout.MaskField("Mask", _octreeConfig.Mask, InternalEditorUtility.layers); GUILayout.BeginVertical("HelpBox"); _octreeConfig.MaxBounds = EditorGUILayout.BoundsField("Bounds", _octreeConfig.MaxBounds); // _boundsCollider = (Collider)EditorGUILayout.ObjectField("BoundsCollider", _boundsCollider, typeof(Collider), true); // if (_boundsCollider != null && _octreeConfig.MaxBounds != _boundsCollider.bounds) // { // _octreeConfig.MaxBounds = _boundsCollider.bounds; // } GUILayout.EndVertical(); _octreeConfig.MaxDepth = EditorGUILayout.IntField("MaxDepth", _octreeConfig.MaxDepth); GUILayout.EndVertical(); GUILayout.Space(5); if (GUILayout.Button(hasOctree ? "Rebuild Octree" : "Build Octree") && _octreeConfig.MaxBounds.size != Vector3.zero) { List <TriangleVertices> triangles = GetTriangles(FindObjectsWithLayer <MeshFilter>(_octreeConfig.Mask)); // triangles.AddRange(GetTriangles(FindObjectsWithLayer<Terrain>(_octreeConfig.Mask))); if (!hasOctree) { _octree = ScriptableObject.CreateInstance <Octree>(); } _octree.Setup(_octreeConfig.MaxBounds, _octreeConfig.MaxDepth, triangles); ListPool <TriangleVertices> .Release(triangles); if (!hasOctree) { //创建物体 _octreeConfig.OctreeAssetPath = EditorUtility.SaveFilePanelInProject("octree", "octree", "asset", "xx"); if (!string.IsNullOrEmpty(_octreeConfig.OctreeAssetPath)) { AssetDatabase.CreateAsset(_octree, _octreeConfig.OctreeAssetPath); _octreeDebug.Octree = _octree; } else { _octree = null; } } } }