From 06dbbbd48365a2ca51b70403b887216308b66f10 Mon Sep 17 00:00:00 2001 From: Vladimir Grati Date: Mon, 2 Aug 2021 14:55:39 +0200 Subject: [PATCH 1/3] Persist selected Tab --- .gitignore | 76 ++++- .../Editor/ScriptableObjectFactory.asmdef | 16 + .../ScriptableObjectFactory.asmdef.meta | 7 + .../Editor/ScriptableObjectFactory.cs | 22 +- .../Editor/ScriptableObjectWindow.cs | 69 ++-- .../ScriptableObjectFactory/Editor/TabType.cs | 8 + .../Editor/TabType.cs.meta | 3 + Packages/manifest.json | 10 +- Packages/packages-lock.json | 301 ++++++++++++++++++ ProjectSettings/PackageManagerSettings.asset | 43 +++ ProjectSettings/ProjectSettings.asset | Bin 55643 -> 67451 bytes ProjectSettings/ProjectVersion.txt | 3 +- ProjectSettings/VFXManager.asset | 14 + ProjectSettings/VersionControlSettings.asset | 8 + ScriptableObjectFactory.csproj.DotSettings | 3 + 15 files changed, 535 insertions(+), 48 deletions(-) create mode 100644 Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.asmdef create mode 100644 Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.asmdef.meta create mode 100644 Assets/Plugins/ScriptableObjectFactory/Editor/TabType.cs create mode 100644 Assets/Plugins/ScriptableObjectFactory/Editor/TabType.cs.meta create mode 100644 Packages/packages-lock.json create mode 100644 ProjectSettings/PackageManagerSettings.asset create mode 100644 ProjectSettings/VFXManager.asset create mode 100644 ProjectSettings/VersionControlSettings.asset create mode 100644 ScriptableObjectFactory.csproj.DotSettings diff --git a/.gitignore b/.gitignore index 6bb8e9f..23100d6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,75 @@ -/Library -obj/ -/Temp -/.vs +# This .gitignore file should be placed at the root of your Unity project directory +# +# Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore +# +/[Ll]ibrary/ +/[Tt]emp/ +/[Oo]bj/ +/[Bb]uild/ +/[Bb]uilds/ +/[Ll]ogs/ +/[Uu]ser[Ss]ettings/ + +# MemoryCaptures can get excessive in size. +# They also could contain extremely sensitive data +/[Mm]emoryCaptures/ + +# Asset meta data should only be ignored when the corresponding asset is also ignored +!/[Aa]ssets/**/*.meta + +# Uncomment this line if you wish to ignore the asset store tools plugin +# /[Aa]ssets/AssetStoreTools* + +# Autogenerated Jetbrains Rider plugin +/[Aa]ssets/Plugins/Editor/JetBrains* + +# Visual Studio cache directory +.vs/ + +# Gradle cache directory +.gradle/ + +# Autogenerated VS/MD/Consulo solution and project files +ExportedObj/ +.consulo/ *.csproj +*.unityproj *.sln +*.suo +*.tmp +*.user *.userprefs +*.pidb +*.booproj +*.svd +*.pdb +*.mdb +*.opendb +*.VC.db + +# Unity3D generated meta files +*.pidb.meta +*.pdb.meta +*.mdb.meta + +# Unity3D generated file on crash reports +sysinfo.txt + +# Builds +*.apk +*.aab +*.unitypackage + +# Crashlytics generated file +crashlytics-build.properties + +# Packed Addressables +/[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin* + +# Temporary auto-generated Android Assets +/[Aa]ssets/[Ss]treamingAssets/aa.meta +/[Aa]ssets/[Ss]treamingAssets/aa/* + +# Rider +**/.idea/* +**/.idea.meta \ No newline at end of file diff --git a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.asmdef b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.asmdef new file mode 100644 index 0000000..4243c47 --- /dev/null +++ b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.asmdef @@ -0,0 +1,16 @@ +{ + "name": "ScriptableObjectFactory", + "rootNamespace": "", + "references": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.asmdef.meta b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.asmdef.meta new file mode 100644 index 0000000..bd2db28 --- /dev/null +++ b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ba8b3661cc52c4f41bf7913c7f7be9ef +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs index 3408eaf..8d53b11 100644 --- a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs +++ b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs @@ -12,38 +12,42 @@ public static class ScriptableObjectFactory [MenuItem("Assets/Create/ScriptableObject")] public static void CreateScriptableObjectFactoryWindow() { - CreateScriptableObjectFactoryWindow(false); + CreateScriptableObjectFactoryWindow(ScriptableObjectWindow.SelectedTab); } - public static void CreateScriptableObjectFactoryWindow(bool getAllAssemblies) + internal static void CreateScriptableObjectFactoryWindow(TabType tabType) { - List allScriptableObjectTypes; + Type[] allScriptableObjectTypes; + Assembly[] assemblies; try { - var assemblies = getAllAssemblies ? GetAllAssemblies() : GetCSharpAssembly(); + + assemblies = tabType == TabType.CSharp ? GetCSharpAssembly() : GetAllAssemblies(); allScriptableObjectTypes = new List(from assembly in assemblies from type in assembly.GetTypes() where type.IsSubclassOf(typeof(ScriptableObject)) - select type); + select type) + .ToArray(); } catch (Exception e) { Debug.LogError("Error while opening scriptable object window: " + e.Message); - allScriptableObjectTypes = new List(); + allScriptableObjectTypes = new Type[0]; + assemblies = new Assembly[0]; } - ScriptableObjectWindow.Init(allScriptableObjectTypes.ToArray(), getAllAssemblies); + ScriptableObjectWindow.Init(assemblies, allScriptableObjectTypes, tabType); } - private static IEnumerable GetCSharpAssembly() + private static Assembly[] GetCSharpAssembly() { return new[] {Assembly.Load(new AssemblyName("Assembly-CSharp"))}; } - private static IEnumerable GetAllAssemblies() + private static Assembly[] GetAllAssemblies() { return AppDomain.CurrentDomain.GetAssemblies(); } diff --git a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs index 5bbcc5a..c14c2fd 100644 --- a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs +++ b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Reflection; using System.Text.RegularExpressions; using UnityEditor; using UnityEditor.ProjectWindowCallback; @@ -22,15 +23,15 @@ public override void Action(int instanceId, string pathName, string resourceFile public class ScriptableObjectWindow : EditorWindow { + private const string KSelectedTabKey = "ScriptablObjectFactory.SelectedTab"; private const float LabelWidth = 180f; private bool _initialFocusSet; - private string _searchFilter = string.Empty; private string SearchFilter { - get { return _searchFilter; } + get => _searchFilter; set { if (value != _searchFilter) @@ -39,16 +40,26 @@ private string SearchFilter } } + private int _selectedScriptableObjectIndex; + private int _selectedAssemblyIndex; private string[] _searchResults = { }; - private int _selectedIndex; + private Vector2 _scriptableObjectScrollPos; + private Vector2 _assemblyScrollPos; + + private static Assembly[] _assemblies; private static string[] _scriptableObjectNames; - private static int _selectedAssembly; + + internal static TabType SelectedTab + { + get => (TabType)EditorPrefs.GetInt(KSelectedTabKey, 0); + set => EditorPrefs.SetInt(KSelectedTabKey, (int)value); + } private static Type[] _types; private static Type[] Types { - get { return _types; } + get => _types; set { _types = value; @@ -56,37 +67,41 @@ private static Type[] Types } } - public static void Init(Type[] scriptableObjects, bool getAllAssemblies) + internal static void Init(Assembly[] assemblies, Type[] scriptableObjectTypes, TabType tabType) { - Types = scriptableObjects; - _selectedAssembly = Convert.ToInt32(getAllAssemblies); + _assemblies = assemblies; + Types = scriptableObjectTypes; + SelectedTab = tabType; var window = GetWindow(true, "Create a new ScriptableObject", true); window.ShowPopup(); } - private void Awake() - { - _searchResults = FindMatchingNames(string.Empty); - } - public void OnGUI() { - DrawAssemblySelection(); + if (Types == null) + { + ScriptableObjectFactory.CreateScriptableObjectFactoryWindow(SelectedTab); + } + DrawTabSelection(); + GUILayout.BeginHorizontal(); + GUILayout.BeginVertical(); DrawSearch(); DrawSelectionPopup(); + GUILayout.EndVertical(); + GUILayout.EndHorizontal(); DrawCreateButton(); } - private void DrawAssemblySelection() + private void DrawTabSelection() { GUILayout.Space(6); GUILayout.BeginHorizontal(); GUILayout.Label("Assembly:", GUILayout.Width(LabelWidth)); - var selectedAssembly = GUILayout.Toolbar(_selectedAssembly, new[] {"C#", "All Assemblies"}); - if (selectedAssembly != _selectedAssembly) + var selectedTab = (TabType)GUILayout.Toolbar((int)SelectedTab, new[] {"Default Unity C#", "All Assemblies"}); + if (selectedTab != SelectedTab) { - ScriptableObjectFactory.CreateScriptableObjectFactoryWindow(Convert.ToBoolean(selectedAssembly)); + ScriptableObjectFactory.CreateScriptableObjectFactoryWindow(selectedTab); _searchResults = FindMatchingNames(_searchFilter); } @@ -109,17 +124,13 @@ private void DrawSearch() EditorGUI.FocusTextInControl("SearchField"); } } - - private Vector2 _scrollPos; - private void DrawSelectionPopup() { GUILayout.Space(6); - using (var scope = new EditorGUILayout.ScrollViewScope(_scrollPos,EditorStyles.helpBox)) { - _selectedIndex = GUILayout.SelectionGrid(_selectedIndex, _searchResults, 1); - _scrollPos = scope.scrollPosition; - } + using var scope = new EditorGUILayout.ScrollViewScope(_scriptableObjectScrollPos, EditorStyles.helpBox); + _selectedScriptableObjectIndex = GUILayout.SelectionGrid(_selectedScriptableObjectIndex, _searchResults, 1); + _scriptableObjectScrollPos = scope.scrollPosition; } private void DrawCreateButton() @@ -127,14 +138,14 @@ private void DrawCreateButton() GUILayout.Space(6); if (GUILayout.Button("Create")) { - var realIndex = Array.FindIndex(_scriptableObjectNames, n => n == _searchResults[_selectedIndex]); + var realIndex = Array.FindIndex(_scriptableObjectNames, n => n == _searchResults[_selectedScriptableObjectIndex]); var asset = CreateInstance(_types[realIndex]); var fileName = _scriptableObjectNames[realIndex].Split('.').Last(); ProjectWindowUtil.StartNameEditingIfProjectWindowExists( asset.GetInstanceID(), CreateInstance(), - string.Format("{0}.asset", fileName), + $"{fileName}.asset", AssetPreview.GetMiniThumbnail(asset), null); @@ -146,14 +157,14 @@ private string[] FindMatchingNames(string filter) { var selectedName = _searchResults.Length == 0 ? string.Empty - : _searchResults[_selectedIndex]; + : _searchResults[_selectedScriptableObjectIndex]; var matchingNames = string.IsNullOrEmpty(filter) ? _scriptableObjectNames : _scriptableObjectNames.Where(scriptableObjectname => IsMatch(scriptableObjectname, filter)).ToArray(); var newIndex = Array.FindIndex(matchingNames, matchingName => matchingName == selectedName); - _selectedIndex = newIndex < 0 + _selectedScriptableObjectIndex = newIndex < 0 ? 0 : newIndex; diff --git a/Assets/Plugins/ScriptableObjectFactory/Editor/TabType.cs b/Assets/Plugins/ScriptableObjectFactory/Editor/TabType.cs new file mode 100644 index 0000000..04e8596 --- /dev/null +++ b/Assets/Plugins/ScriptableObjectFactory/Editor/TabType.cs @@ -0,0 +1,8 @@ +namespace ScriptableObjectFactory +{ + internal enum TabType + { + CSharp, + All + } +} \ No newline at end of file diff --git a/Assets/Plugins/ScriptableObjectFactory/Editor/TabType.cs.meta b/Assets/Plugins/ScriptableObjectFactory/Editor/TabType.cs.meta new file mode 100644 index 0000000..2e7bba3 --- /dev/null +++ b/Assets/Plugins/ScriptableObjectFactory/Editor/TabType.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 03c7eeb1396c42fb814c34a90783321d +timeCreated: 1627906555 \ No newline at end of file diff --git a/Packages/manifest.json b/Packages/manifest.json index 1342d0a..b365b23 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -1,11 +1,11 @@ { "dependencies": { - "com.unity.ads": "2.0.8", - "com.unity.analytics": "2.0.16", - "com.unity.package-manager-ui": "1.9.11", - "com.unity.purchasing": "2.0.3", - "com.unity.textmeshpro": "1.2.4", + "com.unity.ide.rider": "2.0.7", + "com.unity.ide.visualstudio": "2.0.11", + "com.unity.ide.vscode": "1.2.3", + "com.unity.test-framework": "1.1.27", "com.unity.modules.ai": "1.0.0", + "com.unity.modules.androidjni": "1.0.0", "com.unity.modules.animation": "1.0.0", "com.unity.modules.assetbundle": "1.0.0", "com.unity.modules.audio": "1.0.0", diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json new file mode 100644 index 0000000..67f0e34 --- /dev/null +++ b/Packages/packages-lock.json @@ -0,0 +1,301 @@ +{ + "dependencies": { + "com.unity.ext.nunit": { + "version": "1.0.6", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.ide.rider": { + "version": "2.0.7", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.test-framework": "1.1.1" + }, + "url": "https://packages.unity.com" + }, + "com.unity.ide.visualstudio": { + "version": "2.0.11", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.test-framework": "1.1.9" + }, + "url": "https://packages.unity.com" + }, + "com.unity.ide.vscode": { + "version": "1.2.3", + "depth": 0, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.test-framework": { + "version": "1.1.27", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ext.nunit": "1.0.6", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.modules.ai": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.androidjni": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.animation": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.assetbundle": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.audio": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.cloth": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0" + } + }, + "com.unity.modules.director": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.animation": "1.0.0" + } + }, + "com.unity.modules.imageconversion": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.imgui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.jsonserialize": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.particlesystem": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.physics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.physics2d": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.screencapture": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.subsystems": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.terrain": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.terrainphysics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.terrain": "1.0.0" + } + }, + "com.unity.modules.tilemap": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics2d": "1.0.0" + } + }, + "com.unity.modules.ui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.uielements": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.uielementsnative": "1.0.0" + } + }, + "com.unity.modules.uielementsnative": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.umbra": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.unityanalytics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.unitywebrequest": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.unitywebrequestassetbundle": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" + } + }, + "com.unity.modules.unitywebrequestaudio": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.audio": "1.0.0" + } + }, + "com.unity.modules.unitywebrequesttexture": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.unitywebrequestwww": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.vehicles": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0" + } + }, + "com.unity.modules.video": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" + } + }, + "com.unity.modules.vr": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } + }, + "com.unity.modules.wind": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.xr": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.subsystems": "1.0.0" + } + } + } +} diff --git a/ProjectSettings/PackageManagerSettings.asset b/ProjectSettings/PackageManagerSettings.asset new file mode 100644 index 0000000..be4a797 --- /dev/null +++ b/ProjectSettings/PackageManagerSettings.asset @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_EnablePreviewPackages: 0 + m_EnablePackageDependencies: 0 + m_AdvancedSettingsExpanded: 1 + m_ScopedRegistriesSettingsExpanded: 1 + oneTimeWarningShown: 0 + m_Registries: + - m_Id: main + m_Name: + m_Url: https://packages.unity.com + m_Scopes: [] + m_IsDefault: 1 + m_Capabilities: 7 + m_UserSelectedRegistryName: + m_UserAddingNewScopedRegistry: 0 + m_RegistryInfoDraft: + m_ErrorMessage: + m_Original: + m_Id: + m_Name: + m_Url: + m_Scopes: [] + m_IsDefault: 0 + m_Capabilities: 0 + m_Modified: 0 + m_Name: + m_Url: + m_Scopes: + - + m_SelectedScopeIndex: 0 diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 426df5c2bf267547b64fcadafaac2689cefe0e6c..9aa24de57ae3bc6b09b4eedca48d2f5a961aea20 100644 GIT binary patch literal 67451 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

wv)bmHb*=ekb<8*G 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 literal 55643 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 diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt index 20147cb..5ac0724 100644 --- a/ProjectSettings/ProjectVersion.txt +++ b/ProjectSettings/ProjectVersion.txt @@ -1 +1,2 @@ -m_EditorVersion: 2018.2.3f1 +m_EditorVersion: 2020.3.15f2 +m_EditorVersionWithRevision: 2020.3.15f2 (6cf78cb77498) diff --git a/ProjectSettings/VFXManager.asset b/ProjectSettings/VFXManager.asset new file mode 100644 index 0000000..46f38e1 --- /dev/null +++ b/ProjectSettings/VFXManager.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!937362698 &1 +VFXManager: + m_ObjectHideFlags: 0 + m_IndirectShader: {fileID: 0} + m_CopyBufferShader: {fileID: 0} + m_SortShader: {fileID: 0} + m_StripUpdateShader: {fileID: 0} + m_RenderPipeSettingsPath: + m_FixedTimeStep: 0.016666668 + m_MaxDeltaTime: 0.05 + m_CompiledVersion: 0 + m_RuntimeVersion: 0 diff --git a/ProjectSettings/VersionControlSettings.asset b/ProjectSettings/VersionControlSettings.asset new file mode 100644 index 0000000..dca2881 --- /dev/null +++ b/ProjectSettings/VersionControlSettings.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!890905787 &1 +VersionControlSettings: + m_ObjectHideFlags: 0 + m_Mode: Visible Meta Files + m_CollabEditorSettings: + inProgressEnabled: 1 diff --git a/ScriptableObjectFactory.csproj.DotSettings b/ScriptableObjectFactory.csproj.DotSettings new file mode 100644 index 0000000..067d21d --- /dev/null +++ b/ScriptableObjectFactory.csproj.DotSettings @@ -0,0 +1,3 @@ + + True + True \ No newline at end of file From a1f175af390372d92799ba14c11b9b536424bf58 Mon Sep 17 00:00:00 2001 From: Vladimir Grati Date: Tue, 3 Aug 2021 21:19:10 +0200 Subject: [PATCH 2/3] Add a Custom Tab to specify assemblies --- Assets/Editor.meta | 8 + Assets/Examples/CSharp.meta | 8 + Assets/Examples/{ => CSharp}/First.cs | 5 +- Assets/Examples/{ => CSharp}/First.cs.meta | 0 Assets/Examples/{ => CSharp}/Second.cs | 5 +- Assets/Examples/{ => CSharp}/Second.cs.meta | 0 Assets/Examples/Custom.meta | 8 + Assets/Examples/Custom/CustomAssembly.asmdef | 3 + .../Custom/CustomAssembly.asmdef.meta | 7 + Assets/Examples/Custom/Fourth.cs | 6 + Assets/Examples/Custom/Fourth.cs.meta | 11 ++ Assets/Examples/Custom/Third.cs | 6 + Assets/Examples/Custom/Third.cs.meta | 11 ++ .../Editor/ReflectionHelper.cs | 25 +++ .../Editor/ReflectionHelper.cs.meta | 3 + .../Editor/ScriptableObjectFactory.cs | 47 +---- .../Editor/ScriptableObjectFactorySettings.cs | 60 +++++++ .../ScriptableObjectFactorySettings.cs.meta | 3 + .../Editor/ScriptableObjectWindow.cs | 100 +++++++---- .../ScriptableObjectFactory/Editor/TabType.cs | 3 +- ProjectSettings/ProjectSettings.asset | Bin 67451 -> 67459 bytes ProjectSettings/SceneTemplateSettings.json | 167 ++++++++++++++++++ 22 files changed, 402 insertions(+), 84 deletions(-) create mode 100644 Assets/Editor.meta create mode 100644 Assets/Examples/CSharp.meta rename Assets/Examples/{ => CSharp}/First.cs (53%) rename Assets/Examples/{ => CSharp}/First.cs.meta (100%) rename Assets/Examples/{ => CSharp}/Second.cs (60%) rename Assets/Examples/{ => CSharp}/Second.cs.meta (100%) create mode 100644 Assets/Examples/Custom.meta create mode 100644 Assets/Examples/Custom/CustomAssembly.asmdef create mode 100644 Assets/Examples/Custom/CustomAssembly.asmdef.meta create mode 100644 Assets/Examples/Custom/Fourth.cs create mode 100644 Assets/Examples/Custom/Fourth.cs.meta create mode 100644 Assets/Examples/Custom/Third.cs create mode 100644 Assets/Examples/Custom/Third.cs.meta create mode 100644 Assets/Plugins/ScriptableObjectFactory/Editor/ReflectionHelper.cs create mode 100644 Assets/Plugins/ScriptableObjectFactory/Editor/ReflectionHelper.cs.meta create mode 100644 Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactorySettings.cs create mode 100644 Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactorySettings.cs.meta create mode 100644 ProjectSettings/SceneTemplateSettings.json diff --git a/Assets/Editor.meta b/Assets/Editor.meta new file mode 100644 index 0000000..5e24e78 --- /dev/null +++ b/Assets/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d266527df3de95744b29a32134b25cf9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Examples/CSharp.meta b/Assets/Examples/CSharp.meta new file mode 100644 index 0000000..c35eb9a --- /dev/null +++ b/Assets/Examples/CSharp.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dbdf53a965b5a6441a19db8ac32f57b4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Examples/First.cs b/Assets/Examples/CSharp/First.cs similarity index 53% rename from Assets/Examples/First.cs rename to Assets/Examples/CSharp/First.cs index 11be1cc..9f898cd 100644 --- a/Assets/Examples/First.cs +++ b/Assets/Examples/CSharp/First.cs @@ -1,6 +1,7 @@ using UnityEngine; using System.Collections; -public class First : ScriptableObject { - +public class First : ScriptableObject +{ + } diff --git a/Assets/Examples/First.cs.meta b/Assets/Examples/CSharp/First.cs.meta similarity index 100% rename from Assets/Examples/First.cs.meta rename to Assets/Examples/CSharp/First.cs.meta diff --git a/Assets/Examples/Second.cs b/Assets/Examples/CSharp/Second.cs similarity index 60% rename from Assets/Examples/Second.cs rename to Assets/Examples/CSharp/Second.cs index e3a5e27..5e5e42f 100644 --- a/Assets/Examples/Second.cs +++ b/Assets/Examples/CSharp/Second.cs @@ -2,8 +2,7 @@ using System.Collections; using System; -[Serializable] -public class Second : ScriptableObject { - +public class Second : ScriptableObject +{ public int x, y, z; } diff --git a/Assets/Examples/Second.cs.meta b/Assets/Examples/CSharp/Second.cs.meta similarity index 100% rename from Assets/Examples/Second.cs.meta rename to Assets/Examples/CSharp/Second.cs.meta diff --git a/Assets/Examples/Custom.meta b/Assets/Examples/Custom.meta new file mode 100644 index 0000000..b35f416 --- /dev/null +++ b/Assets/Examples/Custom.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 252de5372c0e1094ba297254f8de1ec2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Examples/Custom/CustomAssembly.asmdef b/Assets/Examples/Custom/CustomAssembly.asmdef new file mode 100644 index 0000000..439ea36 --- /dev/null +++ b/Assets/Examples/Custom/CustomAssembly.asmdef @@ -0,0 +1,3 @@ +{ + "name": "CustomAssembly" +} diff --git a/Assets/Examples/Custom/CustomAssembly.asmdef.meta b/Assets/Examples/Custom/CustomAssembly.asmdef.meta new file mode 100644 index 0000000..c7adc1c --- /dev/null +++ b/Assets/Examples/Custom/CustomAssembly.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c236f2d47aeb7bf4093cedfaede11096 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Examples/Custom/Fourth.cs b/Assets/Examples/Custom/Fourth.cs new file mode 100644 index 0000000..f9782be --- /dev/null +++ b/Assets/Examples/Custom/Fourth.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Fourth : ScriptableObject +{ + +} diff --git a/Assets/Examples/Custom/Fourth.cs.meta b/Assets/Examples/Custom/Fourth.cs.meta new file mode 100644 index 0000000..82a2979 --- /dev/null +++ b/Assets/Examples/Custom/Fourth.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4e1102d949444424a84aef2841cb90b3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Examples/Custom/Third.cs b/Assets/Examples/Custom/Third.cs new file mode 100644 index 0000000..7467c4f --- /dev/null +++ b/Assets/Examples/Custom/Third.cs @@ -0,0 +1,6 @@ +using UnityEngine; + +public class Third : ScriptableObject +{ + +} diff --git a/Assets/Examples/Custom/Third.cs.meta b/Assets/Examples/Custom/Third.cs.meta new file mode 100644 index 0000000..5175b14 --- /dev/null +++ b/Assets/Examples/Custom/Third.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b9d3f84cfab3f9244a27f4aa3d11ec22 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ScriptableObjectFactory/Editor/ReflectionHelper.cs b/Assets/Plugins/ScriptableObjectFactory/Editor/ReflectionHelper.cs new file mode 100644 index 0000000..b119bff --- /dev/null +++ b/Assets/Plugins/ScriptableObjectFactory/Editor/ReflectionHelper.cs @@ -0,0 +1,25 @@ +using System; +using System.Linq; +using System.Reflection; +using UnityEngine; + +namespace ScriptableObjectFactory +{ + public class ReflectionHelper + { + internal const string AssemblyCsharp = "Assembly-CSharp"; + + internal static Assembly[] GetAllAssemblies() + { + return AppDomain.CurrentDomain.GetAssemblies(); + } + + internal static Type[] GetScriptableObjectTypes(Assembly[] assemblies) + { + return assemblies + .SelectMany(assembly => assembly.GetTypes()) + .Where(type => type.IsSubclassOf(typeof(ScriptableObject))) + .ToArray(); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/ScriptableObjectFactory/Editor/ReflectionHelper.cs.meta b/Assets/Plugins/ScriptableObjectFactory/Editor/ReflectionHelper.cs.meta new file mode 100644 index 0000000..ed2f8a9 --- /dev/null +++ b/Assets/Plugins/ScriptableObjectFactory/Editor/ReflectionHelper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: aa21e1c9c1ad4fe48c5f35e9ad0e493f +timeCreated: 1627933433 \ No newline at end of file diff --git a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs index 8d53b11..99a20b1 100644 --- a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs +++ b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using UnityEditor; -using UnityEngine; +using UnityEditor; namespace ScriptableObjectFactory { @@ -12,44 +7,8 @@ public static class ScriptableObjectFactory [MenuItem("Assets/Create/ScriptableObject")] public static void CreateScriptableObjectFactoryWindow() { - CreateScriptableObjectFactoryWindow(ScriptableObjectWindow.SelectedTab); - } - - internal static void CreateScriptableObjectFactoryWindow(TabType tabType) - { - - Type[] allScriptableObjectTypes; - Assembly[] assemblies; - - try - { - - assemblies = tabType == TabType.CSharp ? GetCSharpAssembly() : GetAllAssemblies(); - - allScriptableObjectTypes = new List(from assembly in assemblies - from type in assembly.GetTypes() - where type.IsSubclassOf(typeof(ScriptableObject)) - select type) - .ToArray(); - } - catch (Exception e) - { - Debug.LogError("Error while opening scriptable object window: " + e.Message); - allScriptableObjectTypes = new Type[0]; - assemblies = new Assembly[0]; - } - - ScriptableObjectWindow.Init(assemblies, allScriptableObjectTypes, tabType); - } - - private static Assembly[] GetCSharpAssembly() - { - return new[] {Assembly.Load(new AssemblyName("Assembly-CSharp"))}; - } - - private static Assembly[] GetAllAssemblies() - { - return AppDomain.CurrentDomain.GetAssemblies(); + var assemblies = ReflectionHelper.GetAllAssemblies(); + ScriptableObjectWindow.Init(assemblies); } } } \ No newline at end of file diff --git a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactorySettings.cs b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactorySettings.cs new file mode 100644 index 0000000..8bc5869 --- /dev/null +++ b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactorySettings.cs @@ -0,0 +1,60 @@ +using System.Collections.Generic; +using System.Linq; +using UnityEditor; +using UnityEditorInternal; +using UnityEngine; + +namespace ScriptableObjectFactory +{ + internal class ScriptableObjectFactorySettings : ScriptableObject + { + private const string FolderPath = "Assets/Editor"; + + public TabType SelectedTab; + public List CustomAssemblies; + + private static ScriptableObjectFactorySettings _instance; + public static ScriptableObjectFactorySettings Instance + { + get + { + if (_instance == null) + { + _instance = TryToLoadAsset(); + } + if (_instance == null) + { + _instance = CreateAsset(); + } + + return _instance; + } + } + + private static ScriptableObjectFactorySettings TryToLoadAsset() + { + var assetPath = AssetDatabase.FindAssets($"t:{nameof(ScriptableObjectFactorySettings)}") + .Select(AssetDatabase.GUIDToAssetPath) + .FirstOrDefault(); + if (assetPath != null) + { + return AssetDatabase.LoadAssetAtPath(assetPath); + } + return null; + } + + private static ScriptableObjectFactorySettings CreateAsset() + { + var asset = CreateInstance(); + asset.SelectedTab = TabType.CSharp; + asset.CustomAssemblies = new List(); + if(!AssetDatabase.IsValidFolder(FolderPath)) + { + AssetDatabase.CreateFolder("Assets", "Editor"); + } + AssetDatabase.CreateAsset(asset, $"{FolderPath}/{nameof(ScriptableObjectFactorySettings)}.asset"); + AssetDatabase.SaveAssets(); + return asset; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactorySettings.cs.meta b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactorySettings.cs.meta new file mode 100644 index 0000000..2163a20 --- /dev/null +++ b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactorySettings.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7f30053fca7a41378f2e68ab3f21364a +timeCreated: 1627936335 \ No newline at end of file diff --git a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs index c14c2fd..6bf1a58 100644 --- a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs +++ b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs @@ -40,20 +40,12 @@ private string SearchFilter } } - private int _selectedScriptableObjectIndex; - private int _selectedAssemblyIndex; + private int _selectedTypeIndex; private string[] _searchResults = { }; - private Vector2 _scriptableObjectScrollPos; - private Vector2 _assemblyScrollPos; - - private static Assembly[] _assemblies; - private static string[] _scriptableObjectNames; + private Vector2 _scrollPos; - internal static TabType SelectedTab - { - get => (TabType)EditorPrefs.GetInt(KSelectedTabKey, 0); - set => EditorPrefs.SetInt(KSelectedTabKey, (int)value); - } + private static Assembly[] _allAssemblies; + private static string[] _scriptableObjectNames; private static Type[] _types; @@ -66,48 +58,85 @@ private static Type[] Types _scriptableObjectNames = _types.Select(t => t.FullName).ToArray(); } } + + private static ScriptableObjectFactorySettings Settings => ScriptableObjectFactorySettings.Instance; - internal static void Init(Assembly[] assemblies, Type[] scriptableObjectTypes, TabType tabType) + internal static void Init(Assembly[] allAssemblies) { - _assemblies = assemblies; - Types = scriptableObjectTypes; - SelectedTab = tabType; - + _allAssemblies = allAssemblies; var window = GetWindow(true, "Create a new ScriptableObject", true); window.ShowPopup(); + window.SwitchTab(Settings.SelectedTab); + } + + private void SwitchTab(TabType tabType) + { + Settings.SelectedTab = tabType; + + var assemblies = _allAssemblies; + + switch (tabType) + { + case TabType.CSharp: + assemblies = _allAssemblies + .Where(assembly => assembly.GetName().Name == ReflectionHelper.AssemblyCsharp) + .ToArray(); + break; + case TabType.Custom: + assemblies = _allAssemblies + .Where(assembly => Settings.CustomAssemblies.Where(x => x != null) + .Any(x => x.name == assembly?.GetName().Name)) + .ToArray(); + break; + } + + Types = ReflectionHelper.GetScriptableObjectTypes(assemblies); + UpdateSearchResults(); } public void OnGUI() { if (Types == null) { - ScriptableObjectFactory.CreateScriptableObjectFactoryWindow(SelectedTab); + ScriptableObjectFactory.CreateScriptableObjectFactoryWindow(); } DrawTabSelection(); - GUILayout.BeginHorizontal(); - GUILayout.BeginVertical(); + if(Settings.SelectedTab == TabType.Custom) + DrawAssemblySelection(); DrawSearch(); DrawSelectionPopup(); - GUILayout.EndVertical(); - GUILayout.EndHorizontal(); DrawCreateButton(); } + private void DrawAssemblySelection() + { + var selectedAssemblies = Settings.CustomAssemblies.ToArray(); + var serializedObject = new SerializedObject(Settings); + var list = serializedObject.FindProperty(nameof(ScriptableObjectFactorySettings.CustomAssemblies)); + EditorGUILayout.PropertyField(list, new GUIContent("Select Assemblies"), true); + if(!selectedAssemblies.SequenceEqual(Settings.CustomAssemblies)) + SwitchTab(Settings.SelectedTab); + } + private void DrawTabSelection() { GUILayout.Space(6); GUILayout.BeginHorizontal(); GUILayout.Label("Assembly:", GUILayout.Width(LabelWidth)); - var selectedTab = (TabType)GUILayout.Toolbar((int)SelectedTab, new[] {"Default Unity C#", "All Assemblies"}); - if (selectedTab != SelectedTab) + var selectedTab = (TabType)GUILayout.Toolbar((int)Settings.SelectedTab, new[] {"Default Unity C#", "All Assemblies", "Custom"}); + if (selectedTab != Settings.SelectedTab) { - ScriptableObjectFactory.CreateScriptableObjectFactoryWindow(selectedTab); - _searchResults = FindMatchingNames(_searchFilter); + SwitchTab(selectedTab); } GUILayout.EndHorizontal(); } + private void UpdateSearchResults() + { + _searchResults = FindMatchingNames(_searchFilter); + } + private void DrawSearch() { GUILayout.Space(6); @@ -128,9 +157,9 @@ private void DrawSelectionPopup() { GUILayout.Space(6); - using var scope = new EditorGUILayout.ScrollViewScope(_scriptableObjectScrollPos, EditorStyles.helpBox); - _selectedScriptableObjectIndex = GUILayout.SelectionGrid(_selectedScriptableObjectIndex, _searchResults, 1); - _scriptableObjectScrollPos = scope.scrollPosition; + using var scope = new EditorGUILayout.ScrollViewScope(_scrollPos, EditorStyles.helpBox); + _selectedTypeIndex = GUILayout.SelectionGrid(_selectedTypeIndex, _searchResults, 1); + _scrollPos = scope.scrollPosition; } private void DrawCreateButton() @@ -138,8 +167,9 @@ private void DrawCreateButton() GUILayout.Space(6); if (GUILayout.Button("Create")) { - var realIndex = Array.FindIndex(_scriptableObjectNames, n => n == _searchResults[_selectedScriptableObjectIndex]); - var asset = CreateInstance(_types[realIndex]); + var realIndex = Array.FindIndex(_scriptableObjectNames, n => n == _searchResults[_selectedTypeIndex]); + var assetType = _types[realIndex]; + var asset = CreateInstance(assetType); var fileName = _scriptableObjectNames[realIndex].Split('.').Last(); ProjectWindowUtil.StartNameEditingIfProjectWindowExists( @@ -157,14 +187,16 @@ private string[] FindMatchingNames(string filter) { var selectedName = _searchResults.Length == 0 ? string.Empty - : _searchResults[_selectedScriptableObjectIndex]; + : _searchResults[_selectedTypeIndex]; var matchingNames = string.IsNullOrEmpty(filter) ? _scriptableObjectNames - : _scriptableObjectNames.Where(scriptableObjectname => IsMatch(scriptableObjectname, filter)).ToArray(); + : _scriptableObjectNames + .Where(scriptableObjectName => IsMatch(scriptableObjectName, filter)) + .ToArray(); var newIndex = Array.FindIndex(matchingNames, matchingName => matchingName == selectedName); - _selectedScriptableObjectIndex = newIndex < 0 + _selectedTypeIndex = newIndex < 0 ? 0 : newIndex; diff --git a/Assets/Plugins/ScriptableObjectFactory/Editor/TabType.cs b/Assets/Plugins/ScriptableObjectFactory/Editor/TabType.cs index 04e8596..c549ff6 100644 --- a/Assets/Plugins/ScriptableObjectFactory/Editor/TabType.cs +++ b/Assets/Plugins/ScriptableObjectFactory/Editor/TabType.cs @@ -3,6 +3,7 @@ namespace ScriptableObjectFactory internal enum TabType { CSharp, - All + All, + Custom } } \ No newline at end of file diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 9aa24de57ae3bc6b09b4eedca48d2f5a961aea20..fd195fd046dfe98d54c9d6ab2dbf8f3bf97c2da8 100644 GIT binary patch delta 49 zcmey}$I{%-GC`iPd85LCpN!3uAO3U~;$vW7a7j%|EX^r#&d)7K%&VO4$Hu6)IpLQy FF97P+5~KhC delta 38 ucmZqfXZhX7GC`iPdZWUDpN!R$AO3Xb;b3532udx>&nZbQ+HCX7ofiNwWDhL> diff --git a/ProjectSettings/SceneTemplateSettings.json b/ProjectSettings/SceneTemplateSettings.json new file mode 100644 index 0000000..6f3e60f --- /dev/null +++ b/ProjectSettings/SceneTemplateSettings.json @@ -0,0 +1,167 @@ +{ + "templatePinStates": [], + "dependencyTypeInfos": [ + { + "userAdded": false, + "type": "UnityEngine.AnimationClip", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEditor.Animations.AnimatorController", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.AnimatorOverrideController", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEditor.Audio.AudioMixerController", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.ComputeShader", + "ignore": true, + "defaultInstantiationMode": 1, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Cubemap", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.GameObject", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEditor.LightingDataAsset", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": false + }, + { + "userAdded": false, + "type": "UnityEngine.LightingSettings", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Material", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEditor.MonoScript", + "ignore": true, + "defaultInstantiationMode": 1, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.PhysicMaterial", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.PhysicsMaterial2D", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.PostProcessing.PostProcessProfile", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.PostProcessing.PostProcessResources", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.VolumeProfile", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEditor.SceneAsset", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": false + }, + { + "userAdded": false, + "type": "UnityEngine.Shader", + "ignore": true, + "defaultInstantiationMode": 1, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.ShaderVariantCollection", + "ignore": true, + "defaultInstantiationMode": 1, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Texture", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Texture2D", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Timeline.TimelineAsset", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + } + ], + "defaultDependencyTypeInfo": { + "userAdded": false, + "type": "", + "ignore": false, + "defaultInstantiationMode": 1, + "supportsModification": true + }, + "newSceneOverride": 0 +} \ No newline at end of file From aa5f80f136622e6c8327f21b1a311793bb196d5e Mon Sep 17 00:00:00 2001 From: Vladimir Grati Date: Tue, 3 Aug 2021 21:30:02 +0200 Subject: [PATCH 3/3] Add package.json --- Assets/Plugins/ScriptableObjectFactory/README.html | 10 ++++++++++ Assets/Plugins/ScriptableObjectFactory/package.json | 9 +++++++++ 2 files changed, 19 insertions(+) create mode 100644 Assets/Plugins/ScriptableObjectFactory/README.html create mode 100644 Assets/Plugins/ScriptableObjectFactory/package.json diff --git a/Assets/Plugins/ScriptableObjectFactory/README.html b/Assets/Plugins/ScriptableObjectFactory/README.html new file mode 100644 index 0000000..094e19e --- /dev/null +++ b/Assets/Plugins/ScriptableObjectFactory/README.html @@ -0,0 +1,10 @@ +# ScriptableObjectFactory +A Unity editor extension for creating ScriptableObjects + +Right click > Create > ScriptableObject in the project view + +[Download](https://www.dropbox.com/s/f8fwosvjt8obi6h/ScriptableObjectFactory.unitypackage?dl=0) as a .UnityPackage + +![ScriptableObjectFactory](https://i.imgur.com/qENZqro.gif) + +Based on original implementation by [liortal53](https://github.com/liortal53/ScriptableObjectFactory) \ No newline at end of file diff --git a/Assets/Plugins/ScriptableObjectFactory/package.json b/Assets/Plugins/ScriptableObjectFactory/package.json new file mode 100644 index 0000000..840dff8 --- /dev/null +++ b/Assets/Plugins/ScriptableObjectFactory/package.json @@ -0,0 +1,9 @@ +{ + "name": "com.revolter.scriptableobjectfactory", + "displayName": "Scriptable Object Factory", + "version": "1.0.0", + "unity": "2018.4", + "description": "A Unity editor extension for creating ScriptableObjects.", + "category": "editor extensions", + "dependencies": {} +}