Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        //场景的八叉树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;
                    }
                }
            }
        }