From b71ef3fbc0d9be83f8b302c94611836359c3e171 Mon Sep 17 00:00:00 2001 From: Rafael Mohlin Date: Tue, 21 May 2019 17:20:17 +0200 Subject: [PATCH 1/4] Move SetContentTypes into ExportSettings Fixes a small bug where the editor and exporter had different opinions on what a mod contained --- .../Disunity.Editor/Editors/ExportEditor.cs | 14 +------------- Disunity/Disunity.Editor/Export.cs | 18 +----------------- Disunity/Disunity.Editor/ExportSettings.cs | 19 +++++++++++++++++++ 3 files changed, 21 insertions(+), 30 deletions(-) diff --git a/Disunity/Disunity.Editor/Editors/ExportEditor.cs b/Disunity/Disunity.Editor/Editors/ExportEditor.cs index 414546b..90b9d38 100644 --- a/Disunity/Disunity.Editor/Editors/ExportEditor.cs +++ b/Disunity/Disunity.Editor/Editors/ExportEditor.cs @@ -67,19 +67,7 @@ private void DrawDetails(ExportSettings settings) { } private void DrawContentWarning(ExportSettings settings) { - - settings.ContentTypes = 0; - if (settings.PreloadAssemblies.Length > 0) - settings.ContentTypes |= ContentType.PreloadAssemblies; - if (settings.RuntimeAssemblies.Length > 0) - settings.ContentTypes |= ContentType.RuntimeAssemblies; - if (settings.Prefabs.Length > 0) - settings.ContentTypes |= ContentType.Prefabs; - if (settings.Scenes.Length > 0) - settings.ContentTypes |= ContentType.Scenes; - if (settings.Artifacts.Length > 0) - settings.ContentTypes |= ContentType.Artifacts; - + settings.UpdateContentTypes(); if (settings.ContentTypes == 0) { throw new ExportValidationError("You must include some content in your mod."); } diff --git a/Disunity/Disunity.Editor/Export.cs b/Disunity/Disunity.Editor/Export.cs index ea28432..5a5f17b 100644 --- a/Disunity/Disunity.Editor/Export.cs +++ b/Disunity/Disunity.Editor/Export.cs @@ -79,22 +79,6 @@ private List ExportAssemblies(UnityEngine.Object[] assemblies, string fo return destinations; } - private void SetContentTypes() { - _settings.ContentTypes = 0; - if (_settings.PreloadAssemblies.Length > 0) { - _settings.ContentTypes |= ContentType.PreloadAssemblies; - } - if (_settings.RuntimeAssemblies.Length > 0) { - _settings.ContentTypes |= ContentType.RuntimeAssemblies; - } - if (_settings.Prefabs.Length > 0) { - _settings.ContentTypes |= ContentType.Prefabs; - } - if (_settings.Scenes.Length > 0) { - _settings.ContentTypes |= ContentType.Scenes; - } - } - private List ExportRuntimeAssemblies() { return ExportAssemblies(_settings.RuntimeAssemblies, "runtime"); } @@ -162,7 +146,7 @@ public void Run() { var runtimeAssemblies = ExportRuntimeAssemblies(); ExportCopyAssets(); ExportModAssets(); - SetContentTypes(); + _settings.UpdateContentTypes(); SaveMetadata(preloadAssemblies, runtimeAssemblies); CopyToOutput(); } diff --git a/Disunity/Disunity.Editor/ExportSettings.cs b/Disunity/Disunity.Editor/ExportSettings.cs index 2bbb54b..9984523 100644 --- a/Disunity/Disunity.Editor/ExportSettings.cs +++ b/Disunity/Disunity.Editor/ExportSettings.cs @@ -49,6 +49,25 @@ public class ExportSettings : ScriptableObject { [field: SerializeField] public string PreloadAssembly { get; set; } + public void UpdateContentTypes() { + ContentTypes = 0; + if (PreloadAssemblies.Length > 0) { + ContentTypes |= ContentType.PreloadAssemblies; + } + if (RuntimeAssemblies.Length > 0) { + ContentTypes |= ContentType.RuntimeAssemblies; + } + if (Prefabs.Length > 0) { + ContentTypes |= ContentType.Prefabs; + } + if (Scenes.Length > 0) { + ContentTypes |= ContentType.Scenes; + } + if (Artifacts.Length > 0) { + ContentTypes |= ContentType.Artifacts; + } + } + } } \ No newline at end of file From c86ceb87befd6f251aa1aa8b60764f266c577a52 Mon Sep 17 00:00:00 2001 From: Rafael Mohlin Date: Tue, 21 May 2019 17:22:20 +0200 Subject: [PATCH 2/4] Add appropriate types to assets in ExportSettings Also reflect these changes in methods using them --- Disunity/Disunity.Editor/Editors/ExportEditor.cs | 6 ++---- Disunity/Disunity.Editor/Export.cs | 6 ++---- Disunity/Disunity.Editor/ExportSettings.cs | 12 ++++++------ Disunity/Disunity.Editor/Fields/ClassPickerField.cs | 6 +++--- 4 files changed, 13 insertions(+), 17 deletions(-) diff --git a/Disunity/Disunity.Editor/Editors/ExportEditor.cs b/Disunity/Disunity.Editor/Editors/ExportEditor.cs index 90b9d38..6b10288 100644 --- a/Disunity/Disunity.Editor/Editors/ExportEditor.cs +++ b/Disunity/Disunity.Editor/Editors/ExportEditor.cs @@ -1,11 +1,9 @@ using System; using System.Linq; -using Disunity.Core; using Disunity.Editor.Fields; using UnityEditor; +using UnityEditorInternal; using UnityEngine; -using Object = UnityEngine.Object; - namespace Disunity.Editor.Editors { @@ -73,7 +71,7 @@ private void DrawContentWarning(ExportSettings settings) { } } - private void DrawStartupSelector(ClassPickerField field, Object[] assemblies, string currentClass, string currentAssembly, Action handler, string labelText) { + private void DrawStartupSelector(ClassPickerField field, AssemblyDefinitionAsset[] assemblies, string currentClass, string currentAssembly, Action handler, string labelText) { if (assemblies.Length == 0) { return; } diff --git a/Disunity/Disunity.Editor/Export.cs b/Disunity/Disunity.Editor/Export.cs index 5a5f17b..4086d8a 100644 --- a/Disunity/Disunity.Editor/Export.cs +++ b/Disunity/Disunity.Editor/Export.cs @@ -2,12 +2,10 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using System.Security.Cryptography; using Disunity.Core; using UnityEditor; +using UnityEditorInternal; using UnityEngine; -using Object = System.Object; - namespace Disunity.Editor { @@ -52,7 +50,7 @@ private void CreateTempDirectory() { Directory.CreateDirectory(_tempModDirectory); } - private List ExportAssemblies(UnityEngine.Object[] assemblies, string folder) { + private List ExportAssemblies(AssemblyDefinitionAsset[] assemblies, string folder) { var destinations = new List(); if (assemblies.Length == 0) return destinations; var destinationPath = Path.Combine(_tempModDirectory, folder); diff --git a/Disunity/Disunity.Editor/ExportSettings.cs b/Disunity/Disunity.Editor/ExportSettings.cs index 9984523..49c79e2 100644 --- a/Disunity/Disunity.Editor/ExportSettings.cs +++ b/Disunity/Disunity.Editor/ExportSettings.cs @@ -1,11 +1,11 @@ using Disunity.Core; +using UnityEditor; +using UnityEditorInternal; using UnityEngine; - namespace Disunity.Editor { public class ExportSettings : ScriptableObject { - /// /// The Mod's name. /// @@ -29,13 +29,13 @@ public class ExportSettings : ScriptableObject { /// /// The directory to which the Mod will be exported. /// - [field: SerializeField] public Object[] PreloadAssemblies { get; set; } = { }; + [field: SerializeField] public AssemblyDefinitionAsset[] PreloadAssemblies { get; set; } = { }; - [field: SerializeField] public Object[] RuntimeAssemblies { get; set; } = { }; + [field: SerializeField] public AssemblyDefinitionAsset[] RuntimeAssemblies { get; set; } = { }; [field: SerializeField] public Object[] Artifacts { get; set; } = { }; - [field: SerializeField] public Object[] Prefabs { get; set; } = { }; - [field: SerializeField] public Object[] Scenes { get; set; } = { }; + [field: SerializeField] public GameObject[] Prefabs { get; set; } = { }; + [field: SerializeField] public SceneAsset[] Scenes { get; set; } = { }; [field: SerializeField] public string OutputDirectory { get; set; } diff --git a/Disunity/Disunity.Editor/Fields/ClassPickerField.cs b/Disunity/Disunity.Editor/Fields/ClassPickerField.cs index 63ce7bb..25ea1ab 100644 --- a/Disunity/Disunity.Editor/Fields/ClassPickerField.cs +++ b/Disunity/Disunity.Editor/Fields/ClassPickerField.cs @@ -10,9 +10,9 @@ namespace Disunity.Editor.Fields { public class ClassPickerField : BasePickerField { - protected Dictionary GetTypesFromAssemblies(Object[] options) { + protected Dictionary GetTypesFromAssemblies(AssemblyDefinitionAsset[] options) { var types = new Dictionary(); - var assemblies = options.Select(o => ( (AssemblyDefinitionAsset)o ).name); + var assemblies = options.Select(o => o.name); foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { if (!assemblies.Contains(assembly.GetName().Name)) { @@ -32,7 +32,7 @@ protected List GetEntries(string[] names) { return new List(entries); } - public void OnGUI(string currentClass, string currentAssembly, Object[] assemblies, Action handler) { + public void OnGUI(string currentClass, string currentAssembly, AssemblyDefinitionAsset[] assemblies, Action handler) { var types = new Dictionary(); List Generator() { From 2005ea41efe1c525ecad580cc584d9fabb38f3ad Mon Sep 17 00:00:00 2001 From: Rafael Mohlin Date: Tue, 21 May 2019 17:32:42 +0200 Subject: [PATCH 3/4] Add logic connecting AssetEditors to ExportSettings Also refactor BaseAssetEditor.GetAssetPaths usage to be more generic --- .../Disunity.Editor/Disunity.Editor.csproj | 1 + .../Disunity.Editor/Editors/ArtifactEditor.cs | 15 +++++-- .../Editors/BaseSettingsAssetEditor.cs | 42 +++++++++++++++++++ .../Disunity.Editor/Editors/PrefabEditor.cs | 21 +++++----- .../Editors/PreloadAssemblyEditor.cs | 22 +++++----- .../Editors/RuntimeAssemblyEditor.cs | 23 +++++----- .../Disunity.Editor/Editors/SceneEditor.cs | 19 ++++----- .../Disunity.Editor/ExporterEditorWindow.cs | 2 +- 8 files changed, 96 insertions(+), 49 deletions(-) create mode 100644 Disunity/Disunity.Editor/Editors/BaseSettingsAssetEditor.cs diff --git a/Disunity/Disunity.Editor/Disunity.Editor.csproj b/Disunity/Disunity.Editor/Disunity.Editor.csproj index b8f9e06..241b83e 100644 --- a/Disunity/Disunity.Editor/Disunity.Editor.csproj +++ b/Disunity/Disunity.Editor/Disunity.Editor.csproj @@ -67,6 +67,7 @@ + diff --git a/Disunity/Disunity.Editor/Editors/ArtifactEditor.cs b/Disunity/Disunity.Editor/Editors/ArtifactEditor.cs index e392463..cd0db31 100644 --- a/Disunity/Disunity.Editor/Editors/ArtifactEditor.cs +++ b/Disunity/Disunity.Editor/Editors/ArtifactEditor.cs @@ -1,11 +1,18 @@ -using UnityEditor; - +using System.Collections.Generic; +using System.Linq; +using UnityEditor; +using UnityEngine; namespace Disunity.Editor.Editors { - internal class ArtifactEditor : BaseAssetEditor { + internal class ArtifactEditor : BaseSettingsAssetEditor { + + protected override IEnumerable Setting { + get => _settings.Artifacts; + set => _settings.Artifacts = value.ToArray(); + } - public ArtifactEditor(EditorWindow window, ExportSettings settings) : base(window) { } + public ArtifactEditor(EditorWindow window, ExportSettings settings) : base(window, settings) { } public override string Label() { return "Artifacts"; diff --git a/Disunity/Disunity.Editor/Editors/BaseSettingsAssetEditor.cs b/Disunity/Disunity.Editor/Editors/BaseSettingsAssetEditor.cs new file mode 100644 index 0000000..2a751bc --- /dev/null +++ b/Disunity/Disunity.Editor/Editors/BaseSettingsAssetEditor.cs @@ -0,0 +1,42 @@ +using Disunity.Editor.Pickers; +using System.Collections.Generic; +using System.Linq; +using UnityEditor; +using UnityEngine; + +namespace Disunity.Editor.Editors { + internal abstract class BaseSettingsAssetEditor : BaseAssetEditor where T : Object { + + protected readonly ExportSettings _settings; + + protected abstract IEnumerable Setting { get; set; } + + public BaseSettingsAssetEditor(EditorWindow window, ExportSettings settings) : base(window) { + _settings = settings; + } + + protected override void HandleAddition(AssetEntry addition) { + base.HandleAddition(addition); + if (Setting.All(asmDef => AssetDatabase.GetAssetPath(asmDef) != addition.Value)) { + Setting = + Enumerable.Concat( + Setting, + Enumerable.Repeat(AssetDatabase.LoadAssetAtPath(addition.Value), 1)) + .ToArray(); + } + } + + protected override void HandleSubtraction(AssetEntry subtraction) { + base.HandleSubtraction(subtraction); + Setting = Setting + .Where(asmDef => AssetDatabase.GetAssetPath(asmDef) != subtraction.Value) + .ToArray(); + } + public override string[] GetAssetPaths() { + return AssetDatabase + .FindAssets($"t:{typeof(T).Name}") + .Select(AssetDatabase.GUIDToAssetPath) + .ToArray(); + } + } +} diff --git a/Disunity/Disunity.Editor/Editors/PrefabEditor.cs b/Disunity/Disunity.Editor/Editors/PrefabEditor.cs index d2b2f09..4a5f369 100644 --- a/Disunity/Disunity.Editor/Editors/PrefabEditor.cs +++ b/Disunity/Disunity.Editor/Editors/PrefabEditor.cs @@ -1,12 +1,18 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; using UnityEditor; - +using UnityEngine; namespace Disunity.Editor.Editors { - internal class PrefabEditor : BaseAssetEditor { + internal class PrefabEditor : BaseSettingsAssetEditor { + + protected override IEnumerable Setting { + get => _settings.Prefabs; + set => _settings.Prefabs = value.ToArray(); + } - public PrefabEditor(EditorWindow window) : base(window) { } + public PrefabEditor(EditorWindow window, ExportSettings settings) : base(window, settings) { } public override string Label() { return "Prefabs"; @@ -31,12 +37,5 @@ ScriptableObjects are non-Scene-objects which can contain data. This is useful but due to a limitation in how Unity serializes information, only basic types like strings, ints, floats, and basic arrays will work."; } - - public override string[] GetAssetPaths() { - return AssetDatabase - .FindAssets("t:GameObject t:ScriptableObject") - .Select(AssetDatabase.GUIDToAssetPath) - .ToArray(); - } } } \ No newline at end of file diff --git a/Disunity/Disunity.Editor/Editors/PreloadAssemblyEditor.cs b/Disunity/Disunity.Editor/Editors/PreloadAssemblyEditor.cs index 989a618..0eb57ee 100644 --- a/Disunity/Disunity.Editor/Editors/PreloadAssemblyEditor.cs +++ b/Disunity/Disunity.Editor/Editors/PreloadAssemblyEditor.cs @@ -1,12 +1,19 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; using UnityEditor; - +using UnityEditorInternal; +using UnityEngine; namespace Disunity.Editor.Editors { - internal class PreloadAssemblyEditor : BaseAssetEditor { + internal class PreloadAssemblyEditor : BaseSettingsAssetEditor { + + protected override IEnumerable Setting { + get => _settings.PreloadAssemblies; + set => _settings.PreloadAssemblies = value.ToArray(); + } - public PreloadAssemblyEditor(EditorWindow window, ExportSettings settings) : base(window) { } + public PreloadAssemblyEditor(EditorWindow window, ExportSettings settings) : base(window, settings) { } public override string Label() { return "Preload"; @@ -32,12 +39,5 @@ Preload assemblies are defined by a Unity Assembly Definition Assets -> Create -> Assembly Definition menu. "; } - - public override string[] GetAssetPaths() { - return AssetDatabase - .FindAssets("t:AssemblyDefinitionAsset") - .Select(AssetDatabase.GUIDToAssetPath) - .ToArray(); - } } } \ No newline at end of file diff --git a/Disunity/Disunity.Editor/Editors/RuntimeAssemblyEditor.cs b/Disunity/Disunity.Editor/Editors/RuntimeAssemblyEditor.cs index 7f58849..47f8224 100644 --- a/Disunity/Disunity.Editor/Editors/RuntimeAssemblyEditor.cs +++ b/Disunity/Disunity.Editor/Editors/RuntimeAssemblyEditor.cs @@ -1,12 +1,19 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; using UnityEditor; - +using UnityEditorInternal; +using UnityEngine; namespace Disunity.Editor.Editors { - internal class RuntimeAssemblyEditor : BaseAssetEditor { + internal class RuntimeAssemblyEditor : BaseSettingsAssetEditor { + + protected override IEnumerable Setting { + get => _settings.RuntimeAssemblies; + set => _settings.RuntimeAssemblies = value.ToArray(); + } - public RuntimeAssemblyEditor(EditorWindow window, ExportSettings settings) : base(window) { } + public RuntimeAssemblyEditor(EditorWindow window, ExportSettings settings) : base(window, settings) { } public override string Label() { return "Scripts"; @@ -32,13 +39,5 @@ Runtime assemblies are defined by a Unity Assembly Definition Asset. These can be created using the Assets -> Create -> Assembly Definition menu."; } - - public override string[] GetAssetPaths() { - return AssetDatabase - .FindAssets("t:AssemblyDefinitionAsset") - .Select(AssetDatabase.GUIDToAssetPath) - .ToArray(); - } - } } \ No newline at end of file diff --git a/Disunity/Disunity.Editor/Editors/SceneEditor.cs b/Disunity/Disunity.Editor/Editors/SceneEditor.cs index 12d6eeb..dc73ced 100644 --- a/Disunity/Disunity.Editor/Editors/SceneEditor.cs +++ b/Disunity/Disunity.Editor/Editors/SceneEditor.cs @@ -1,12 +1,17 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; using UnityEditor; - namespace Disunity.Editor.Editors { - internal class SceneEditor : BaseAssetEditor { + internal class SceneEditor : BaseSettingsAssetEditor { + + protected override IEnumerable Setting { + get => _settings.Scenes; + set => _settings.Scenes = value.ToArray(); + } - public SceneEditor(EditorWindow window, ExportSettings settings) : base(window) { } + public SceneEditor(EditorWindow window, ExportSettings settings) : base(window, settings) { } public override string Label() { return "Scenes"; @@ -19,11 +24,5 @@ public override string Title() { public override string Help() { return "Scenes can be exported to your mod here."; } - public override string[] GetAssetPaths() { - return AssetDatabase - .FindAssets("t:Scene") - .Select(AssetDatabase.GUIDToAssetPath) - .ToArray(); - } } } \ No newline at end of file diff --git a/Disunity/Disunity.Editor/ExporterEditorWindow.cs b/Disunity/Disunity.Editor/ExporterEditorWindow.cs index d67d3d9..24193de 100644 --- a/Disunity/Disunity.Editor/ExporterEditorWindow.cs +++ b/Disunity/Disunity.Editor/ExporterEditorWindow.cs @@ -37,7 +37,7 @@ private void OnEnable() { _runtimeAssemblyEditor = new RuntimeAssemblyEditor(this, _exportSettings.Instance); _preloadAssemblyEditor = new PreloadAssemblyEditor(this, _exportSettings.Instance); _artifactEditor = new ArtifactEditor(this, _exportSettings.Instance); - _prefabEditor = new PrefabEditor(this); + _prefabEditor = new PrefabEditor(this, _exportSettings.Instance); _sceneEditor = new SceneEditor(this, _exportSettings.Instance); _exportEditor = new ExportEditor(this, _exportSettings.Instance); _dependencyEditor = new DependencyEditor(this); From d186a37fed67ef1e53225035667daaa0430e6ba8 Mon Sep 17 00:00:00 2001 From: Rafael Mohlin Date: Tue, 21 May 2019 17:35:43 +0200 Subject: [PATCH 4/4] Add missing ArtifactEditor to GUI --- Disunity/Disunity.Editor/ExporterEditorWindow.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Disunity/Disunity.Editor/ExporterEditorWindow.cs b/Disunity/Disunity.Editor/ExporterEditorWindow.cs index 24193de..2d2ed27 100644 --- a/Disunity/Disunity.Editor/ExporterEditorWindow.cs +++ b/Disunity/Disunity.Editor/ExporterEditorWindow.cs @@ -47,6 +47,7 @@ private void OnEnable() { _editorSelector.AddEditor(_sceneEditor); _editorSelector.AddEditor(_preloadAssemblyEditor); _editorSelector.AddEditor(_dependencyEditor); + _editorSelector.AddEditor(_artifactEditor); _editorSelector.AddEditor(_exportEditor); }