From bdbfaf34c0fabb27e63b43f5de964aaffe3f5032 Mon Sep 17 00:00:00 2001 From: max Date: Sat, 24 Jun 2023 14:27:50 +0200 Subject: [PATCH] Basic split saving and loading of scene files --- Editor.meta | 8 ++ Editor/ScenePartitionSO.cs | 24 +++++ Editor/ScenePartitionSO.cs.meta | 11 +++ Editor/ScenePartitionSOEditor.cs | 48 ++++++++++ Editor/ScenePartitionSOEditor.cs.meta | 11 +++ Editor/ScenePartitionUtils.cs | 94 +++++++++++++++++++ Editor/ScenePartitionUtils.cs.meta | 11 +++ .../VertexColor.ScenePartition.Editor.asmdef | 18 ++++ ...texColor.ScenePartition.Editor.asmdef.meta | 7 ++ LICENSE.meta | 7 ++ README.md.meta | 7 ++ Runtime.meta | 8 ++ Runtime/VertexColor.ScenePartition.asmdef | 14 +++ .../VertexColor.ScenePartition.asmdef.meta | 7 ++ package.json | 18 ++++ package.json.meta | 7 ++ 16 files changed, 300 insertions(+) create mode 100644 Editor.meta create mode 100644 Editor/ScenePartitionSO.cs create mode 100644 Editor/ScenePartitionSO.cs.meta create mode 100644 Editor/ScenePartitionSOEditor.cs create mode 100644 Editor/ScenePartitionSOEditor.cs.meta create mode 100644 Editor/ScenePartitionUtils.cs create mode 100644 Editor/ScenePartitionUtils.cs.meta create mode 100644 Editor/VertexColor.ScenePartition.Editor.asmdef create mode 100644 Editor/VertexColor.ScenePartition.Editor.asmdef.meta create mode 100644 LICENSE.meta create mode 100644 README.md.meta create mode 100644 Runtime.meta create mode 100644 Runtime/VertexColor.ScenePartition.asmdef create mode 100644 Runtime/VertexColor.ScenePartition.asmdef.meta create mode 100644 package.json create mode 100644 package.json.meta diff --git a/Editor.meta b/Editor.meta new file mode 100644 index 0000000..d85d91d --- /dev/null +++ b/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 610c555885ab54a4bb3fb07faa93d1c8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/ScenePartitionSO.cs b/Editor/ScenePartitionSO.cs new file mode 100644 index 0000000..3e944ae --- /dev/null +++ b/Editor/ScenePartitionSO.cs @@ -0,0 +1,24 @@ +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace VertexColor.ScenePartition +{ + [CreateAssetMenu(fileName = "Scene", menuName = "Max/ScenePartitionSO")] + public class ScenePartitionSO : ScriptableObject + { + [field: SerializeField] + public SceneAsset sceneAsset { get; private set; } = null; + public string sceneName { get; private set; } = ""; + + private List loadedPartitions = new List(); + + private void OnValidate() + { + if (string.IsNullOrWhiteSpace(sceneName) && sceneAsset != null) + { + sceneName= sceneAsset.name; + } + } + } +} \ No newline at end of file diff --git a/Editor/ScenePartitionSO.cs.meta b/Editor/ScenePartitionSO.cs.meta new file mode 100644 index 0000000..cf80db1 --- /dev/null +++ b/Editor/ScenePartitionSO.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 247a42f35aa1a81489369b19a7b1a706 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/ScenePartitionSOEditor.cs b/Editor/ScenePartitionSOEditor.cs new file mode 100644 index 0000000..73b39ce --- /dev/null +++ b/Editor/ScenePartitionSOEditor.cs @@ -0,0 +1,48 @@ +using UnityEngine; +using UnityEditor; +using System.IO; + +namespace VertexColor.ScenePartition.Editor +{ + [CustomEditor(typeof(ScenePartitionSO))] + public class ScenePartitionSOEditor : UnityEditor.Editor + { + //SerializedProperty property; + + void OnEnable() + { + //property = serializedObject.FindProperty("myProperty"); + } + + public override void OnInspectorGUI() + { + DrawDefaultInspector(); + + ScenePartitionSO scenePartitionSO = (target as ScenePartitionSO); + + serializedObject.Update(); + //EditorGUILayout.PropertyField(property); + serializedObject.ApplyModifiedProperties(); + + if (GUILayout.Button("Load")) + { + ScenePartitionUtils.Load(scenePartitionSO); + } + + if (GUILayout.Button("Save")) + { + ScenePartitionUtils.Save(scenePartitionSO); + } + + if (GUILayout.Button("Unload")) + { + ScenePartitionUtils.Unload(scenePartitionSO); + } + + if(GUILayout.Button("Open Scene Data")) + { + EditorUtility.RevealInFinder(ScenePartitionUtils.GetDataPath(scenePartitionSO)); + } + } + } +} \ No newline at end of file diff --git a/Editor/ScenePartitionSOEditor.cs.meta b/Editor/ScenePartitionSOEditor.cs.meta new file mode 100644 index 0000000..df59b8f --- /dev/null +++ b/Editor/ScenePartitionSOEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4b0b68d7b48521245b1dec0163002c6b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/ScenePartitionUtils.cs b/Editor/ScenePartitionUtils.cs new file mode 100644 index 0000000..fac3acb --- /dev/null +++ b/Editor/ScenePartitionUtils.cs @@ -0,0 +1,94 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace VertexColor.ScenePartition.Editor +{ + public static class ScenePartitionUtils + { + public static string GetDataPath(ScenePartitionSO scenePartitionSO) + { + string dataPath = Path.Combine(Application.dataPath, $"../Data/Scenes/{scenePartitionSO.name}"); + + if (!Directory.Exists(dataPath)) + { + Directory.CreateDirectory(dataPath); + } + + return dataPath; + } + + public static string GetScenePath(ScenePartitionSO scenePartitionSO) + { + string scenePath = AssetDatabase.GetAssetOrScenePath(scenePartitionSO.sceneAsset); + + return scenePath; + } + + public static void Load(ScenePartitionSO scenePartitionSO) + { + string dataPath = GetDataPath(scenePartitionSO); + string scenePath = GetScenePath(scenePartitionSO); + + List data = new List(); + List files = Directory.GetFiles(dataPath).ToList(); + files.Sort(); + + for (int i = 0; i < files.Count; i++) + { + data.AddRange(File.ReadAllLines(files[i])); + } + + File.WriteAllLines(scenePath, data); + + AssetDatabase.Refresh(); + } + + public static void Save(ScenePartitionSO scenePartitionSO) + { + string dataPath = GetDataPath(scenePartitionSO); + string scenePath = GetScenePath(scenePartitionSO); + + string[] data = File.ReadAllLines(scenePath); + + int lastIndex = data.Length; + for (int i = data.Length - 1; i >= 0; i--) + { + if (data[i].StartsWith("---")) // --- is the start of a new yaml document. + { + int idStartIndex = data[i].IndexOf(" &") + 2; // & is the start of the object id. + int idLength = data[i].Length; + + File.WriteAllLines($"{dataPath}/{scenePartitionSO.sceneName}-{data[i][idStartIndex..idLength]}.yaml", data[i..lastIndex]); + + lastIndex = i; + } + } + + File.WriteAllLines($"{dataPath}/{scenePartitionSO.sceneName}.yaml", data[0..lastIndex]); + } + + public static void Unload(ScenePartitionSO scenePartitionSO) + { + string dataPath = GetDataPath(scenePartitionSO); + string scenePath = GetScenePath(scenePartitionSO); + + Scene scene = EditorSceneManager.OpenScene(scenePath, OpenSceneMode.Single); + + GameObject[] gameObjects = scene.GetRootGameObjects(); + + for (int i = gameObjects.Length - 1; i >= 0; i--) + { + Object.DestroyImmediate(gameObjects[i]); + } + + EditorSceneManager.SaveScene(scene); + + AssetDatabase.Refresh(); + } + } +} \ No newline at end of file diff --git a/Editor/ScenePartitionUtils.cs.meta b/Editor/ScenePartitionUtils.cs.meta new file mode 100644 index 0000000..59b8380 --- /dev/null +++ b/Editor/ScenePartitionUtils.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 883382d711d46814a916c091ff78921b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/VertexColor.ScenePartition.Editor.asmdef b/Editor/VertexColor.ScenePartition.Editor.asmdef new file mode 100644 index 0000000..d1eb0a6 --- /dev/null +++ b/Editor/VertexColor.ScenePartition.Editor.asmdef @@ -0,0 +1,18 @@ +{ + "name": "VertexColor.ScenePartition.Editor", + "rootNamespace": "VertexColor.ScenePartition.Editor", + "references": [ + "GUID:98426b68bf187c24cab8b1c081ec48eb" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Editor/VertexColor.ScenePartition.Editor.asmdef.meta b/Editor/VertexColor.ScenePartition.Editor.asmdef.meta new file mode 100644 index 0000000..9054b84 --- /dev/null +++ b/Editor/VertexColor.ScenePartition.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8e94aa69083318d4fb4aec25f8853dfa +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/LICENSE.meta b/LICENSE.meta new file mode 100644 index 0000000..a1cfb72 --- /dev/null +++ b/LICENSE.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 55a18e70c50ceb34fbecf432e70dfdc5 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/README.md.meta b/README.md.meta new file mode 100644 index 0000000..eb1427a --- /dev/null +++ b/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: eaed98c3d0c700a4aab6fb8cf702b040 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime.meta b/Runtime.meta new file mode 100644 index 0000000..8503ca6 --- /dev/null +++ b/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3573ba34d7fdcc544a43c56669d03616 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/VertexColor.ScenePartition.asmdef b/Runtime/VertexColor.ScenePartition.asmdef new file mode 100644 index 0000000..0347c30 --- /dev/null +++ b/Runtime/VertexColor.ScenePartition.asmdef @@ -0,0 +1,14 @@ +{ + "name": "VertexColor.ScenePartition", + "rootNamespace": "VertexColor.ScenePartition", + "references": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Runtime/VertexColor.ScenePartition.asmdef.meta b/Runtime/VertexColor.ScenePartition.asmdef.meta new file mode 100644 index 0000000..68630c7 --- /dev/null +++ b/Runtime/VertexColor.ScenePartition.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 98426b68bf187c24cab8b1c081ec48eb +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/package.json b/package.json new file mode 100644 index 0000000..e9cc7e9 --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ +{ + "name": "com.vertexcolor.scenepartition", + "displayName": "ScenePartition", + "version": "0.1.4", + "unity": "2019.3", + "description": "Unity scene partition framework.", + "category": "Tool", + "type": "tool", + "license": "MIT", + "author": { + "name": "Max Kruf", + "email": "info@maxartz15.com", + "url": "https://www.maxartz15.com" + }, + "keywords": [ + "Scene Partition" + ] +} \ No newline at end of file diff --git a/package.json.meta b/package.json.meta new file mode 100644 index 0000000..1d82db7 --- /dev/null +++ b/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 420d2ef5a566f3b429f86eebb929fe62 +PackageManifestImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: