From 7e8d46623a48dae2880de76144ecdab505e64b5a Mon Sep 17 00:00:00 2001 From: max Date: Tue, 27 Jun 2023 00:24:46 +0200 Subject: [PATCH] ScriptableSingleton for data --- ...rtitionDataSO.cs => ScenePartitionData.cs} | 8 +-- ...aSO.cs.meta => ScenePartitionData.cs.meta} | 2 +- Editor/ScenePartitionDataSOEditor.cs | 53 ---------------- Editor/ScenePartitionEditorWindow.cs | 63 +++++++++++++++++++ ...eta => ScenePartitionEditorWindow.cs.meta} | 0 Editor/ScenePartitionSO.cs | 42 +++++++------ Editor/ScenePartitionSS.cs | 28 +++++++++ Editor/ScenePartitionSS.cs.meta | 11 ++++ 8 files changed, 130 insertions(+), 77 deletions(-) rename Editor/{ScenePartitionDataSO.cs => ScenePartitionData.cs} (69%) rename Editor/{ScenePartitionDataSO.cs.meta => ScenePartitionData.cs.meta} (83%) delete mode 100644 Editor/ScenePartitionDataSOEditor.cs create mode 100644 Editor/ScenePartitionEditorWindow.cs rename Editor/{ScenePartitionDataSOEditor.cs.meta => ScenePartitionEditorWindow.cs.meta} (100%) create mode 100644 Editor/ScenePartitionSS.cs create mode 100644 Editor/ScenePartitionSS.cs.meta diff --git a/Editor/ScenePartitionDataSO.cs b/Editor/ScenePartitionData.cs similarity index 69% rename from Editor/ScenePartitionDataSO.cs rename to Editor/ScenePartitionData.cs index 714264e..87b7b14 100644 --- a/Editor/ScenePartitionDataSO.cs +++ b/Editor/ScenePartitionData.cs @@ -1,9 +1,7 @@ -using UnityEngine; - -namespace VertexColor.ScenePartition.Editor +namespace VertexColor.ScenePartition.Editor { - [CreateAssetMenu(fileName = "Scene", menuName = "Max/ScenePartitionDataSO")] - public class ScenePartitionDataSO : ScriptableObject + [System.Serializable] + public class ScenePartitionData { public bool HasCreatedPartitions => ScenePartitions != null && ScenePartitions.Count > 0; public ScenePartitionSortedList ScenePartitions = new ScenePartitionSortedList(); diff --git a/Editor/ScenePartitionDataSO.cs.meta b/Editor/ScenePartitionData.cs.meta similarity index 83% rename from Editor/ScenePartitionDataSO.cs.meta rename to Editor/ScenePartitionData.cs.meta index 6766ee5..843792d 100644 --- a/Editor/ScenePartitionDataSO.cs.meta +++ b/Editor/ScenePartitionData.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 53d6bea45132f6d4aa3aa1631099564e +guid: dfca041580276524fa12c31dc15d5a4d MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Editor/ScenePartitionDataSOEditor.cs b/Editor/ScenePartitionDataSOEditor.cs deleted file mode 100644 index 7971b6e..0000000 --- a/Editor/ScenePartitionDataSOEditor.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Collections.Generic; -using UnityEditor; -using UnityEngine; - -namespace VertexColor.ScenePartition.Editor -{ - [CustomEditor(typeof(ScenePartitionDataSO))] - public class ScenePartitionDataSOEditor : UnityEditor.Editor - { - public override void OnInspectorGUI() - { - ScenePartitionDataSO scenePartitionDataSO = (target as ScenePartitionDataSO); - - DrawDefaultInspector(); - - serializedObject.Update(); - //EditorGUILayout.PropertyField(sceneAssetProperty); - serializedObject.ApplyModifiedProperties(); - - EditorGUILayout.Space(); - - if (GUILayout.Button("Force Serialize")) - { - AssetDatabase.ForceReserializeAssets(new string[] { AssetDatabase.GetAssetPath(scenePartitionDataSO) }, ForceReserializeAssetsOptions.ReserializeAssetsAndMetadata); - } - - using (new EditorGUI.DisabledGroupScope(true)) - { - if (scenePartitionDataSO.HasCreatedPartitions) - { - EditorGUILayout.LabelField($"scenePartitions"); - - foreach (KeyValuePair scenePartition in scenePartitionDataSO.ScenePartitions) - { - EditorGUILayout.IntField((int)scenePartition.Value.id); - } - } - - EditorGUILayout.Space(); - - if (scenePartitionDataSO.HasLoadedPartitions) - { - EditorGUILayout.LabelField($"loadedScenePartitions"); - - foreach (KeyValuePair scenePartition in scenePartitionDataSO.LoadedScenePartitions) - { - EditorGUILayout.IntField((int)scenePartition.Value.id); - } - } - } - } - } -} \ No newline at end of file diff --git a/Editor/ScenePartitionEditorWindow.cs b/Editor/ScenePartitionEditorWindow.cs new file mode 100644 index 0000000..bc25f74 --- /dev/null +++ b/Editor/ScenePartitionEditorWindow.cs @@ -0,0 +1,63 @@ +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace VertexColor.ScenePartition.Editor +{ + public class ScenePartitionEditorWindow : EditorWindow + { + private Vector2 scrollPos = Vector2.zero; + + [MenuItem("Max/ScenePartitionWindow")] + public static void ShowExample() + { + ScenePartitionEditorWindow window = GetWindow(); + window.titleContent = new GUIContent($"{nameof(ScenePartitionEditorWindow)}"); + } + + private void OnGUI() + { + DrawSceneDataCache(); + } + + private void DrawSceneDataCache() + { + using (EditorGUILayout.ScrollViewScope scope = new EditorGUILayout.ScrollViewScope(scrollPos)) + { + scrollPos = scope.scrollPosition; + + using (new EditorGUI.DisabledGroupScope(true)) + { + ScenePartitionSS scenePartitionSS = ScenePartitionSS.instance; + + foreach (KeyValuePair sceneData in scenePartitionSS.SceneDataCache) + { + EditorGUILayout.LabelField($"{sceneData.Key.name}"); + + if (sceneData.Value.HasCreatedPartitions) + { + EditorGUILayout.LabelField($"scenePartitions"); + + foreach (KeyValuePair scenePartition in sceneData.Value.ScenePartitions) + { + EditorGUILayout.IntField((int)scenePartition.Value.id); + } + } + + EditorGUILayout.Space(); + + if (sceneData.Value.HasLoadedPartitions) + { + EditorGUILayout.LabelField($"loadedScenePartitions"); + + foreach (KeyValuePair scenePartition in sceneData.Value.LoadedScenePartitions) + { + EditorGUILayout.IntField((int)scenePartition.Value.id); + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/Editor/ScenePartitionDataSOEditor.cs.meta b/Editor/ScenePartitionEditorWindow.cs.meta similarity index 100% rename from Editor/ScenePartitionDataSOEditor.cs.meta rename to Editor/ScenePartitionEditorWindow.cs.meta diff --git a/Editor/ScenePartitionSO.cs b/Editor/ScenePartitionSO.cs index 3a58cfa..13cfc32 100644 --- a/Editor/ScenePartitionSO.cs +++ b/Editor/ScenePartitionSO.cs @@ -15,11 +15,18 @@ public class ScenePartitionSO : ScriptableObject public SceneAsset SceneAsset { get; private set; } = null; public string SceneName => SceneAsset == null ? name : SceneAsset.name; - [SerializeField] - private ScenePartitionDataSO scenePartitionData = null; - public List alwaysLoadIds = new List { 0, 1, 2, 3, 4 }; + public ScenePartitionData ScenePartitionData + { + get + { + scenePartitionData ??= ScenePartitionSS.instance.GetScenePartitionData(this); + return scenePartitionData; + } + } + private ScenePartitionData scenePartitionData = null; + public void CreateScene() { if (SceneAsset != null) return; @@ -28,7 +35,9 @@ public void CreateScene() Scene scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single); EditorSceneManager.SaveScene(scene, scenePath); + Save(); + AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); SceneAsset = AssetDatabase.LoadAssetAtPath(scenePath); @@ -43,7 +52,7 @@ public void CreateScene() public void LoadAll() { CreateScenePartitions(); - SortedSet ids = new SortedSet(scenePartitionData.ScenePartitions.Keys); + SortedSet ids = new SortedSet(ScenePartitionData.ScenePartitions.Keys); LoadScenePartitions(ids); } @@ -52,29 +61,29 @@ private void CreateScenePartitions() string dataPath = ScenePartitionUtils.GetDataPath(this); string[] files = Directory.GetFiles(dataPath); - scenePartitionData.ScenePartitions = new ScenePartitionSortedList(); + ScenePartitionData.ScenePartitions = new ScenePartitionSortedList(); for (int i = 0; i < files.Length; i++) { ScenePartition scenePartition = new ScenePartition(files[i]); - scenePartitionData.ScenePartitions.Add(scenePartition.id, scenePartition); + ScenePartitionData.ScenePartitions.Add(scenePartition.id, scenePartition); } } private void LoadScenePartitions(SortedSet partitionIds) { - if (!scenePartitionData.HasCreatedPartitions) return; + if (!ScenePartitionData.HasCreatedPartitions) return; string scenePath = ScenePartitionUtils.GetScenePath(this); List data = new List(); - scenePartitionData.LoadedScenePartitions.Clear(); + ScenePartitionData.LoadedScenePartitions.Clear(); // Add default ids. for (int i = 0; i < alwaysLoadIds.Count; i++) { - if (scenePartitionData.ScenePartitions.ContainsKey(alwaysLoadIds[i])) + if (ScenePartitionData.ScenePartitions.ContainsKey(alwaysLoadIds[i])) { partitionIds.Add(alwaysLoadIds[i]); } @@ -83,9 +92,9 @@ private void LoadScenePartitions(SortedSet partitionIds) // Create scene data. foreach (uint id in partitionIds) { - ScenePartition p = scenePartitionData.ScenePartitions[id]; + ScenePartition p = ScenePartitionData.ScenePartitions[id]; data.AddRange(File.ReadAllLines(p.filePath)); - scenePartitionData.LoadedScenePartitions.Add(p.id, p); + ScenePartitionData.LoadedScenePartitions.Add(p.id, p); } // Create scene. @@ -99,9 +108,6 @@ private void LoadScenePartitions(SortedSet partitionIds) /// public void Save() { - if (!scenePartitionData.HasCreatedPartitions) return; - if (!scenePartitionData.HasLoadedPartitions) return; - DeleteLoadedPartitions(); // Delete the loaded partitions from disk so we can write the new ones. string pattern = @"&(\d+)"; @@ -155,16 +161,16 @@ public void Unload() EditorSceneManager.SaveScene(scene); - scenePartitionData.LoadedScenePartitions.Clear(); + ScenePartitionData.LoadedScenePartitions.Clear(); AssetDatabase.Refresh(); } private void DeleteLoadedPartitions() { - if (!scenePartitionData.HasCreatedPartitions) return; + if (!ScenePartitionData.HasLoadedPartitions) return; - foreach (KeyValuePair scenePartition in scenePartitionData.LoadedScenePartitions) + foreach (KeyValuePair scenePartition in ScenePartitionData.LoadedScenePartitions) { if (!File.Exists(scenePartition.Value.filePath)) continue; @@ -178,7 +184,7 @@ public void LoadPartitions(uint[] ids) for (int i = 0; i < ids.Length; i++) { - SortedSet connections = ScenePartitionUtils.FindDeeplyLinkedObjects(scenePartitionData.ScenePartitions, ids[i]); + SortedSet connections = ScenePartitionUtils.FindDeeplyLinkedObjects(ScenePartitionData.ScenePartitions, ids[i]); foreach (uint c in connections) { diff --git a/Editor/ScenePartitionSS.cs b/Editor/ScenePartitionSS.cs new file mode 100644 index 0000000..5e9e324 --- /dev/null +++ b/Editor/ScenePartitionSS.cs @@ -0,0 +1,28 @@ +using UnityEditor; +using UnityEngine; + +namespace VertexColor.ScenePartition.Editor +{ + [FilePath("ScenePartition/SceneDataCache.asset", FilePathAttribute.Location.ProjectFolder)] + public class ScenePartitionSS : ScriptableSingleton + { + public SceneDataCache SceneDataCache => sceneDataCache; + + [SerializeField] + private SceneDataCache sceneDataCache = new SceneDataCache(); + + public ScenePartitionData GetScenePartitionData(ScenePartitionSO scenePartitionSO) + { + if (!sceneDataCache.TryGetValue(scenePartitionSO, out ScenePartitionData scenePartitionData)) + { + scenePartitionData = new ScenePartitionData(); + sceneDataCache.Add(scenePartitionSO, scenePartitionData); + } + + return scenePartitionData; + } + } + + [System.Serializable] + public class SceneDataCache : SerializableDictionary { } +} \ No newline at end of file diff --git a/Editor/ScenePartitionSS.cs.meta b/Editor/ScenePartitionSS.cs.meta new file mode 100644 index 0000000..8414d90 --- /dev/null +++ b/Editor/ScenePartitionSS.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7319493d95696df47adf96e8962c9052 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: