From 98e5a3d683e1ba7e20f07a46eebd30d448d6bb63 Mon Sep 17 00:00:00 2001 From: Revolter Date: Sat, 30 Jun 2018 01:19:44 +0200 Subject: [PATCH 01/11] Updated ScriptableObjectFactory * Added search * Improved exception handling * Moved to Plugins folder * Updated to Unity 2018.1 --- Assets/Editor/ScriptableObjectFactory.cs | 33 ---- Assets/Editor/ScriptableObjectWindow.cs | 64 ------- Assets/Examples.meta | 8 + Assets/{ => Examples}/First.cs | 0 Assets/{ => Examples}/First.cs.meta | 0 Assets/{ => Examples}/Second.cs | 0 Assets/{ => Examples}/Second.cs.meta | 0 Assets/Plugins.meta | 8 + .../ScriptableObjectFactory}/Editor.meta | 0 .../Editor/ScriptableObjectFactory.cs | 36 ++++ .../Editor/ScriptableObjectFactory.cs.meta | 0 .../Editor/ScriptableObjectWindow.cs | 159 ++++++++++++++++++ .../Editor/ScriptableObjectWindow.cs.meta | 0 ProjectSettings/ProjectVersion.txt | 3 +- README.md | 4 +- 15 files changed, 214 insertions(+), 101 deletions(-) delete mode 100644 Assets/Editor/ScriptableObjectFactory.cs delete mode 100644 Assets/Editor/ScriptableObjectWindow.cs create mode 100644 Assets/Examples.meta rename Assets/{ => Examples}/First.cs (100%) rename Assets/{ => Examples}/First.cs.meta (100%) rename Assets/{ => Examples}/Second.cs (100%) rename Assets/{ => Examples}/Second.cs.meta (100%) create mode 100644 Assets/Plugins.meta rename Assets/{ => Plugins/ScriptableObjectFactory}/Editor.meta (100%) create mode 100644 Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs rename Assets/{ => Plugins/ScriptableObjectFactory}/Editor/ScriptableObjectFactory.cs.meta (100%) create mode 100644 Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs rename Assets/{ => Plugins/ScriptableObjectFactory}/Editor/ScriptableObjectWindow.cs.meta (100%) diff --git a/Assets/Editor/ScriptableObjectFactory.cs b/Assets/Editor/ScriptableObjectFactory.cs deleted file mode 100644 index 6692bf3..0000000 --- a/Assets/Editor/ScriptableObjectFactory.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Linq; -using System.Reflection; -using UnityEditor; -using UnityEngine; - -/// -/// A helper class for instantiating ScriptableObjects in the editor. -/// -public class ScriptableObjectFactory -{ - [MenuItem("Assets/Create/ScriptableObject")] - public static void CreateScriptableObject() - { - var assembly = GetAssembly (); - - // Get all classes derived from ScriptableObject - var allScriptableObjects = (from t in assembly.GetTypes() - where t.IsSubclassOf(typeof(ScriptableObject)) - select t).ToArray(); - - // Show the selection window. - ScriptableObjectWindow.Init(allScriptableObjects); - } - - /// - /// Returns the assembly that contains the script code for this project (currently hard coded) - /// - private static Assembly GetAssembly () - { - return Assembly.Load (new AssemblyName ("Assembly-CSharp")); - } -} \ No newline at end of file diff --git a/Assets/Editor/ScriptableObjectWindow.cs b/Assets/Editor/ScriptableObjectWindow.cs deleted file mode 100644 index 0e6bc1f..0000000 --- a/Assets/Editor/ScriptableObjectWindow.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System; -using System.Linq; -using UnityEditor; -using UnityEditor.ProjectWindowCallback; -using UnityEngine; - -internal class EndNameEdit : EndNameEditAction -{ - #region implemented abstract members of EndNameEditAction - public override void Action (int instanceId, string pathName, string resourceFile) - { - AssetDatabase.CreateAsset(EditorUtility.InstanceIDToObject(instanceId), AssetDatabase.GenerateUniqueAssetPath(pathName)); - } - - #endregion -} - -/// -/// Scriptable object window. -/// -public class ScriptableObjectWindow : EditorWindow -{ - private int selectedIndex; - private static string[] names; - - private static Type[] types; - - private static Type[] Types - { - get { return types; } - set - { - types = value; - names = types.Select(t => t.FullName).ToArray(); - } - } - - public static void Init(Type[] scriptableObjects) - { - Types = scriptableObjects; - - var window = EditorWindow.GetWindow(true, "Create a new ScriptableObject", true); - window.ShowPopup(); - } - - public void OnGUI() - { - GUILayout.Label("ScriptableObject Class"); - selectedIndex = EditorGUILayout.Popup(selectedIndex, names); - - if (GUILayout.Button("Create")) - { - var asset = ScriptableObject.CreateInstance(types[selectedIndex]); - ProjectWindowUtil.StartNameEditingIfProjectWindowExists( - asset.GetInstanceID(), - ScriptableObject.CreateInstance(), - string.Format("{0}.asset", names[selectedIndex]), - AssetPreview.GetMiniThumbnail(asset), - null); - - Close(); - } - } -} \ No newline at end of file diff --git a/Assets/Examples.meta b/Assets/Examples.meta new file mode 100644 index 0000000..59b577c --- /dev/null +++ b/Assets/Examples.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cef6a069fb732214698778a2690be8f9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/First.cs b/Assets/Examples/First.cs similarity index 100% rename from Assets/First.cs rename to Assets/Examples/First.cs diff --git a/Assets/First.cs.meta b/Assets/Examples/First.cs.meta similarity index 100% rename from Assets/First.cs.meta rename to Assets/Examples/First.cs.meta diff --git a/Assets/Second.cs b/Assets/Examples/Second.cs similarity index 100% rename from Assets/Second.cs rename to Assets/Examples/Second.cs diff --git a/Assets/Second.cs.meta b/Assets/Examples/Second.cs.meta similarity index 100% rename from Assets/Second.cs.meta rename to Assets/Examples/Second.cs.meta diff --git a/Assets/Plugins.meta b/Assets/Plugins.meta new file mode 100644 index 0000000..edeb535 --- /dev/null +++ b/Assets/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f1460793b94f8c54fbb729519d5035ce +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor.meta b/Assets/Plugins/ScriptableObjectFactory/Editor.meta similarity index 100% rename from Assets/Editor.meta rename to Assets/Plugins/ScriptableObjectFactory/Editor.meta diff --git a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs new file mode 100644 index 0000000..b82aaf9 --- /dev/null +++ b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs @@ -0,0 +1,36 @@ +using System; +using System.Linq; +using System.Reflection; +using UnityEditor; +using UnityEngine; + +namespace ScriptableObjectFactory +{ + public class ScriptableObjectFactory + { + [MenuItem("Assets/Create/ScriptableObject")] + public static void CreateScriptableObject() + { + Type[] allScriptableObjects; + + try + { + var assembly = GetAssembly(); + allScriptableObjects = (from t in assembly.GetTypes() + where t.IsSubclassOf(typeof(ScriptableObject)) + select t).ToArray(); + } + catch (Exception) + { + allScriptableObjects = new Type[] { }; + } + + ScriptableObjectWindow.Init(allScriptableObjects); + } + + private static Assembly GetAssembly() + { + return Assembly.Load(new AssemblyName("Assembly-CSharp")); + } + } +} \ No newline at end of file diff --git a/Assets/Editor/ScriptableObjectFactory.cs.meta b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs.meta similarity index 100% rename from Assets/Editor/ScriptableObjectFactory.cs.meta rename to Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs.meta diff --git a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs new file mode 100644 index 0000000..7e36569 --- /dev/null +++ b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs @@ -0,0 +1,159 @@ +using System; +using System.Linq; +using System.Text.RegularExpressions; +using UnityEditor; +using UnityEditor.ProjectWindowCallback; +using UnityEngine; + +namespace ScriptableObjectFactory +{ + internal class EndNameEdit : EndNameEditAction + { + #region implemented abstract members of EndNameEditAction + + public override void Action(int instanceId, string pathName, string resourceFile) + { + AssetDatabase.CreateAsset(EditorUtility.InstanceIDToObject(instanceId), + AssetDatabase.GenerateUniqueAssetPath(pathName)); + } + + #endregion + } + + public class ScriptableObjectWindow : EditorWindow + { + private const float LabelWidth = 180f; + + private bool _initialFocusSet; + + private string _searchFilter = string.Empty; + + private string SearchFilter + { + get { return _searchFilter; } + set + { + if (value != _searchFilter) + _searchResults = FindMatchingNames(value); + _searchFilter = value; + } + } + + private string[] _searchResults = { }; + private int _selectedIndex; + private static string[] _scriptableObjectNames; + + private static Type[] _types; + + private static Type[] Types + { + get { return _types; } + set + { + _types = value; + _scriptableObjectNames = _types.Select(t => t.FullName).ToArray(); + } + } + + public static void Init(Type[] scriptableObjects) + { + Types = scriptableObjects; + + var window = GetWindow(true, "Create a new ScriptableObject", true); + window.ShowPopup(); + } + + private void Awake() + { + _searchResults = FindMatchingNames(string.Empty); + } + + public void OnGUI() + { + DrawSearch(); + DrawSelectionPopup(); + DrawCreateButton(); + } + + private void DrawSearch() + { + GUILayout.Space(6); + GUILayout.BeginHorizontal(); + GUILayout.Label("Search:", GUILayout.Width(LabelWidth)); + + GUI.SetNextControlName("SearchField"); + SearchFilter = EditorGUILayout.TextField(SearchFilter); + GUILayout.EndHorizontal(); + + if (!_initialFocusSet) + { + _initialFocusSet = true; + EditorGUI.FocusTextInControl("SearchField"); + } + } + + private void DrawSelectionPopup() + { + GUILayout.Space(6); + GUILayout.BeginHorizontal(); + GUILayout.Label("Select ScriptableObject Class:", GUILayout.Width(LabelWidth)); + _selectedIndex = EditorGUILayout.Popup(_selectedIndex, _searchResults); + GUILayout.EndHorizontal(); + } + + private void DrawCreateButton() + { + GUILayout.Space(6); + if (GUILayout.Button("Create")) + { + var realIndex = Array.FindIndex(_scriptableObjectNames, n => n == _searchResults[_selectedIndex]); + var asset = CreateInstance(_types[realIndex]); + var fileName = _scriptableObjectNames[realIndex].Split('.').Last(); + + ProjectWindowUtil.StartNameEditingIfProjectWindowExists( + asset.GetInstanceID(), + CreateInstance(), + string.Format("{0}.asset", fileName), + AssetPreview.GetMiniThumbnail(asset), + null); + + Close(); + } + } + + private string[] FindMatchingNames(string filter) + { + var selectedName = _searchResults.Length == 0 + ? string.Empty + : _searchResults[_selectedIndex]; + + var matchingNames = string.IsNullOrEmpty(filter) + ? _scriptableObjectNames + : _scriptableObjectNames.Where(scriptableObjectname => IsMatch(scriptableObjectname, filter)).ToArray(); + + var newIndex = Array.FindIndex(matchingNames, matchingName => matchingName == selectedName); + _selectedIndex = newIndex < 0 + ? 0 + : newIndex; + + return matchingNames; + } + + private static bool IsMatch(string text, string searchTerm) + { + try + { + var splitSearchTerms = searchTerm.Split(null); + return splitSearchTerms.All(term => + { + var regex = new Regex(term, RegexOptions.IgnoreCase); + return regex.Match(text).Success; + }); + } + catch (Exception) + { + return false; + } + } + } +} \ No newline at end of file diff --git a/Assets/Editor/ScriptableObjectWindow.cs.meta b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs.meta similarity index 100% rename from Assets/Editor/ScriptableObjectWindow.cs.meta rename to Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs.meta diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt index 29defb9..22977b3 100644 --- a/ProjectSettings/ProjectVersion.txt +++ b/ProjectSettings/ProjectVersion.txt @@ -1,2 +1 @@ -m_EditorVersion: 5.0.0a13 -m_StandardAssetsVersion: 0 +m_EditorVersion: 2018.1.0f2 diff --git a/README.md b/README.md index 4c71da2..b7bf535 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # ScriptableObjectFactory A Unity editor extension for creating any ScriptableObject type -Download as a .UnityPackage: [ScriptableObjectFactory](https://www.dropbox.com/s/vdvf5si4go3jnb5/ScriptableObjectFactory.unitypackage) +Download as a .UnityPackage: [ScriptableObjectFactory](https://www.dropbox.com/s/f8fwosvjt8obi6h/ScriptableObjectFactory.unitypackage?dl=0) -Originally introduced in this [Blog Post](http://www.tallior.com/unity-scriptableobject-factory/?utm_source=github&utm_medium=readme&utm_campaign=link) +Based on original implementation by [liortal53](https://github.com/liortal53/ScriptableObjectFactory) From 2d1bcf9ef72f73fb823051904a6150d516ade0e8 Mon Sep 17 00:00:00 2001 From: Revolter Date: Sat, 30 Jun 2018 01:32:38 +0200 Subject: [PATCH 02/11] Added a screenshot --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index b7bf535..3a76dbd 100644 --- a/README.md +++ b/README.md @@ -3,4 +3,6 @@ A Unity editor extension for creating any ScriptableObject type Download as a .UnityPackage: [ScriptableObjectFactory](https://www.dropbox.com/s/f8fwosvjt8obi6h/ScriptableObjectFactory.unitypackage?dl=0) +![ScriptableObjectFactory](https://i.imgur.com/ozpUh0j.png) + Based on original implementation by [liortal53](https://github.com/liortal53/ScriptableObjectFactory) From 0476c0041516f41c66267bf96365be56be3aab88 Mon Sep 17 00:00:00 2001 From: Revolter Date: Sat, 30 Jun 2018 01:37:22 +0200 Subject: [PATCH 03/11] Updated README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3a76dbd..35c8e8d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # ScriptableObjectFactory -A Unity editor extension for creating any ScriptableObject type +A Unity editor extension for creating ScriptableObjects + +Right click > Create > ScriptableObject in the project view Download as a .UnityPackage: [ScriptableObjectFactory](https://www.dropbox.com/s/f8fwosvjt8obi6h/ScriptableObjectFactory.unitypackage?dl=0) From da44520613c29164578cee2e3a8d0353960c3d1c Mon Sep 17 00:00:00 2001 From: Revolter Date: Sat, 30 Jun 2018 15:13:30 +0200 Subject: [PATCH 04/11] Added animated demo --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 35c8e8d..3ef3bef 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,8 @@ A Unity editor extension for creating ScriptableObjects Right click > Create > ScriptableObject in the project view -Download as a .UnityPackage: [ScriptableObjectFactory](https://www.dropbox.com/s/f8fwosvjt8obi6h/ScriptableObjectFactory.unitypackage?dl=0) +[Download](https://www.dropbox.com/s/f8fwosvjt8obi6h/ScriptableObjectFactory.unitypackage?dl=0) as a .UnityPackage -![ScriptableObjectFactory](https://i.imgur.com/ozpUh0j.png) +![ScriptableObjectFactory](https://i.imgur.com/UoDAwbu.mp4) Based on original implementation by [liortal53](https://github.com/liortal53/ScriptableObjectFactory) From ab6e1c606cb4e601d284d9f24936bc24995cf379 Mon Sep 17 00:00:00 2001 From: Revolter Date: Sat, 30 Jun 2018 15:13:30 +0200 Subject: [PATCH 05/11] Added animated demo --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 35c8e8d..d202441 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,8 @@ A Unity editor extension for creating ScriptableObjects Right click > Create > ScriptableObject in the project view -Download as a .UnityPackage: [ScriptableObjectFactory](https://www.dropbox.com/s/f8fwosvjt8obi6h/ScriptableObjectFactory.unitypackage?dl=0) +[Download](https://www.dropbox.com/s/f8fwosvjt8obi6h/ScriptableObjectFactory.unitypackage?dl=0) as a .UnityPackage -![ScriptableObjectFactory](https://i.imgur.com/ozpUh0j.png) +![ScriptableObjectFactory](https://imgur.com/UoDAwbu) Based on original implementation by [liortal53](https://github.com/liortal53/ScriptableObjectFactory) From 4869fcf3259b891e63f565dc7320eb9e09a75b71 Mon Sep 17 00:00:00 2001 From: Revolter Date: Sat, 30 Jun 2018 15:27:01 +0200 Subject: [PATCH 06/11] Updated gif in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d202441..609fa19 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,6 @@ Right click > Create > ScriptableObject in the project view [Download](https://www.dropbox.com/s/f8fwosvjt8obi6h/ScriptableObjectFactory.unitypackage?dl=0) as a .UnityPackage -![ScriptableObjectFactory](https://imgur.com/UoDAwbu) +![ScriptableObjectFactory](https://i.imgur.com/Y8Qbzlg.gif) Based on original implementation by [liortal53](https://github.com/liortal53/ScriptableObjectFactory) From 5ce58dfc81e48600bbe8f6d5f05701e59f89179e Mon Sep 17 00:00:00 2001 From: Peter Eichinger Date: Sat, 7 Jul 2018 15:13:16 +0200 Subject: [PATCH 07/11] Get ScriptableObjects from all loaded assemblies --- .../Editor/ScriptableObjectFactory.cs | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs index b82aaf9..f11a1cb 100644 --- a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs +++ b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Reflection; using UnityEditor; @@ -6,31 +7,31 @@ namespace ScriptableObjectFactory { - public class ScriptableObjectFactory + public static class ScriptableObjectFactory { [MenuItem("Assets/Create/ScriptableObject")] - public static void CreateScriptableObject() - { - Type[] allScriptableObjects; + public static void CreateScriptableObject() { - try - { - var assembly = GetAssembly(); - allScriptableObjects = (from t in assembly.GetTypes() - where t.IsSubclassOf(typeof(ScriptableObject)) - select t).ToArray(); + List allScriptableObjects; + + try { + var assemblies = GetAssemblies(); + + allScriptableObjects= new List(from assembly in assemblies + from type in assembly.GetTypes() + where type.IsSubclassOf(typeof(ScriptableObject)) + select type); } - catch (Exception) - { - allScriptableObjects = new Type[] { }; + catch (Exception e) { + Debug.LogError("Error while opening scriptable object window: "+e.Message); + allScriptableObjects = new List(); } - - ScriptableObjectWindow.Init(allScriptableObjects); + + ScriptableObjectWindow.Init(allScriptableObjects.ToArray()); } - private static Assembly GetAssembly() - { - return Assembly.Load(new AssemblyName("Assembly-CSharp")); + private static IEnumerable GetAssemblies() { + return AppDomain.CurrentDomain.GetAssemblies(); } } } \ No newline at end of file From 2f71c3bc32c28ea5b0cf5ff4f4bf41cffd01d966 Mon Sep 17 00:00:00 2001 From: Peter Eichinger Date: Sat, 7 Jul 2018 15:58:50 +0200 Subject: [PATCH 08/11] Show scrollable list instead of dropdown --- .../Editor/ScriptableObjectWindow.cs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs index 7e36569..13aacd5 100644 --- a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs +++ b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs @@ -92,13 +92,16 @@ private void DrawSearch() } } + private Vector2 _scrollPos; + private void DrawSelectionPopup() { GUILayout.Space(6); - GUILayout.BeginHorizontal(); - GUILayout.Label("Select ScriptableObject Class:", GUILayout.Width(LabelWidth)); - _selectedIndex = EditorGUILayout.Popup(_selectedIndex, _searchResults); - GUILayout.EndHorizontal(); + + using (var scope = new EditorGUILayout.ScrollViewScope(_scrollPos,EditorStyles.helpBox)) { + _selectedIndex = GUILayout.SelectionGrid(_selectedIndex, _searchResults, 1); + _scrollPos = scope.scrollPosition; + } } private void DrawCreateButton() @@ -123,7 +126,7 @@ private void DrawCreateButton() private string[] FindMatchingNames(string filter) { - var selectedName = _searchResults.Length == 0 + var selectedName = _searchResults.Length == 0 ? string.Empty : _searchResults[_selectedIndex]; @@ -132,8 +135,8 @@ private string[] FindMatchingNames(string filter) : _scriptableObjectNames.Where(scriptableObjectname => IsMatch(scriptableObjectname, filter)).ToArray(); var newIndex = Array.FindIndex(matchingNames, matchingName => matchingName == selectedName); - _selectedIndex = newIndex < 0 - ? 0 + _selectedIndex = newIndex < 0 + ? 0 : newIndex; return matchingNames; From c8ed2e210306a0479072a840ff3525d2db998508 Mon Sep 17 00:00:00 2001 From: Vladimir Grati Date: Mon, 20 Aug 2018 21:39:36 +0200 Subject: [PATCH 09/11] Added the possibility to select between CSharp assembly only and All Assemblies Updated to Unity 2018.2.3f1 --- .gitignore | 1 + Assets/Plugins/ScriptableObjectFactory.meta | 8 ++ .../Editor/ScriptableObjectFactory.cs | 86 ++++++++++-------- .../Editor/ScriptableObjectWindow.cs | 20 +++- Packages/manifest.json | 39 ++++++++ ProjectSettings/ClusterInputManager.asset | Bin 0 -> 4104 bytes ProjectSettings/GraphicsSettings.asset | Bin 4128 -> 4406 bytes ProjectSettings/PresetManager.asset | Bin 0 -> 4104 bytes ProjectSettings/ProjectSettings.asset | Bin 24788 -> 55643 bytes ProjectSettings/ProjectVersion.txt | 2 +- ProjectSettings/UnityConnectSettings.asset | Bin 0 -> 4276 bytes 11 files changed, 118 insertions(+), 38 deletions(-) create mode 100644 Assets/Plugins/ScriptableObjectFactory.meta create mode 100644 Packages/manifest.json create mode 100644 ProjectSettings/ClusterInputManager.asset create mode 100644 ProjectSettings/PresetManager.asset create mode 100644 ProjectSettings/UnityConnectSettings.asset diff --git a/.gitignore b/.gitignore index cc11e4c..6bb8e9f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ /Library obj/ /Temp +/.vs *.csproj *.sln *.userprefs diff --git a/Assets/Plugins/ScriptableObjectFactory.meta b/Assets/Plugins/ScriptableObjectFactory.meta new file mode 100644 index 0000000..622e873 --- /dev/null +++ b/Assets/Plugins/ScriptableObjectFactory.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 70275b8e690132548a93b8e30671ee18 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs index f11a1cb..3408eaf 100644 --- a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs +++ b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs @@ -1,37 +1,51 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using UnityEditor; -using UnityEngine; - -namespace ScriptableObjectFactory -{ - public static class ScriptableObjectFactory - { - [MenuItem("Assets/Create/ScriptableObject")] - public static void CreateScriptableObject() { - - List allScriptableObjects; - - try { - var assemblies = GetAssemblies(); - - allScriptableObjects= new List(from assembly in assemblies - from type in assembly.GetTypes() - where type.IsSubclassOf(typeof(ScriptableObject)) - select type); - } - catch (Exception e) { - Debug.LogError("Error while opening scriptable object window: "+e.Message); - allScriptableObjects = new List(); - } - - ScriptableObjectWindow.Init(allScriptableObjects.ToArray()); - } - - private static IEnumerable GetAssemblies() { - return AppDomain.CurrentDomain.GetAssemblies(); - } - } +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using UnityEditor; +using UnityEngine; + +namespace ScriptableObjectFactory +{ + public static class ScriptableObjectFactory + { + [MenuItem("Assets/Create/ScriptableObject")] + public static void CreateScriptableObjectFactoryWindow() + { + CreateScriptableObjectFactoryWindow(false); + } + + public static void CreateScriptableObjectFactoryWindow(bool getAllAssemblies) + { + + List allScriptableObjectTypes; + + try + { + var assemblies = getAllAssemblies ? GetAllAssemblies() : GetCSharpAssembly(); + + allScriptableObjectTypes = new List(from assembly in assemblies + from type in assembly.GetTypes() + where type.IsSubclassOf(typeof(ScriptableObject)) + select type); + } + catch (Exception e) + { + Debug.LogError("Error while opening scriptable object window: " + e.Message); + allScriptableObjectTypes = new List(); + } + + ScriptableObjectWindow.Init(allScriptableObjectTypes.ToArray(), getAllAssemblies); + } + + private static IEnumerable GetCSharpAssembly() + { + return new[] {Assembly.Load(new AssemblyName("Assembly-CSharp"))}; + } + + private static IEnumerable GetAllAssemblies() + { + return AppDomain.CurrentDomain.GetAssemblies(); + } + } } \ No newline at end of file diff --git a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs index 13aacd5..5bbcc5a 100644 --- a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs +++ b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs @@ -42,6 +42,7 @@ private string SearchFilter private string[] _searchResults = { }; private int _selectedIndex; private static string[] _scriptableObjectNames; + private static int _selectedAssembly; private static Type[] _types; @@ -55,9 +56,10 @@ private static Type[] Types } } - public static void Init(Type[] scriptableObjects) + public static void Init(Type[] scriptableObjects, bool getAllAssemblies) { Types = scriptableObjects; + _selectedAssembly = Convert.ToInt32(getAllAssemblies); var window = GetWindow(true, "Create a new ScriptableObject", true); window.ShowPopup(); @@ -70,11 +72,27 @@ private void Awake() public void OnGUI() { + DrawAssemblySelection(); DrawSearch(); DrawSelectionPopup(); DrawCreateButton(); } + private void DrawAssemblySelection() + { + GUILayout.Space(6); + GUILayout.BeginHorizontal(); + GUILayout.Label("Assembly:", GUILayout.Width(LabelWidth)); + var selectedAssembly = GUILayout.Toolbar(_selectedAssembly, new[] {"C#", "All Assemblies"}); + if (selectedAssembly != _selectedAssembly) + { + ScriptableObjectFactory.CreateScriptableObjectFactoryWindow(Convert.ToBoolean(selectedAssembly)); + _searchResults = FindMatchingNames(_searchFilter); + } + + GUILayout.EndHorizontal(); + } + private void DrawSearch() { GUILayout.Space(6); diff --git a/Packages/manifest.json b/Packages/manifest.json new file mode 100644 index 0000000..1342d0a --- /dev/null +++ b/Packages/manifest.json @@ -0,0 +1,39 @@ +{ + "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.modules.ai": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.cloth": "1.0.0", + "com.unity.modules.director": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.screencapture": "1.0.0", + "com.unity.modules.terrain": "1.0.0", + "com.unity.modules.terrainphysics": "1.0.0", + "com.unity.modules.tilemap": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.umbra": "1.0.0", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.unitywebrequesttexture": "1.0.0", + "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vehicles": "1.0.0", + "com.unity.modules.video": "1.0.0", + "com.unity.modules.vr": "1.0.0", + "com.unity.modules.wind": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } +} diff --git a/ProjectSettings/ClusterInputManager.asset b/ProjectSettings/ClusterInputManager.asset new file mode 100644 index 0000000000000000000000000000000000000000..1157016952ed10839df6a49e75263be7296f784e GIT binary patch literal 4104 zcmeH^yGjE=6o$`iZfd-1C%%A1FcDF^g;*$}AR?9$WE3R{vblhj3${LkrH!4PT^_(T zg^f>OVQJ<1|2xaVlGIjbU^qM9ocSmDM#Q@lnV%4m1ymG~+In@nQmbrSR^>N}B4fb5 zxDiEz^3MCy&+y>B|8e&Cz4^8bTE}Dy$CgNlBT>8v$&EbcBz!dz<^kE~rja2y&$Hh{ zm5_U$sp5;1JV!nt&&em)3eGTxlY@K}^(N^r5QgM=*+cIO?qyCf<%LXs3EcSXFJ|)T z!~M>p93zqWTu-Ll<*#AQ{3%p-Z#KWoet$H7nmnG_{F#)yeE5v>XHm!H&#~Vh&F4do z%f}lhJRkqxhvZ!r!8z!So=cwdyyURdo4rog2K(*XUiYxkZd}!IEKY3Dx4~)9jIVW!C`kn#m8DRQ@hh_Pxsi}rAoE^nWi zy?7=CeXn1Lb?k;cDntiEmUW{egonS6SBcJNp6I|0t*m&|6FX6;*@r^&Q2PZjhES*f zDnc0fW4Inip%(jS9z5v(6zXIHnsqcEgzhtFuSHp%bE7NKrtTUPnybq(G*|Z;gL`zZ z)xN#D*X7*kE}%`_Y`(NJZb#E}ZM|ZvU?bW3Qwj9OizJoRy_nhYHZZuf);y&M$ z^X`4VS;y$ry(Q;H_an5adn*df)xFK&9^Kn>-mQCwj?t@oXU>i8r)X1m6AI1M-E44= z?p-ztk2df3UAQ9M7~k868VmV@N4Lhz@PWTZbFzR`n&GyLCrdv7x#Zp&dq%OK%2UIalP7nFt4l5htC@t=fj6rHlO{P z_Ri;F?b|z_M{@3oV|}7?7an+A7oV@R>|CJFXl|TC zn)SwcJm;R?&obh0{|}?k_n7sPV z>YgBnW%>52qSMAJF@`4!j@eNpe`mw^@G5;GFNZe8S-eEiV^1 zd^)GVAumoleBN^A5skX^f6MZU!8w1|@-q&y_B1(+dB}XgIcm=LHZ9}3EPvKu&AHwZIQQqg!>28O&f%fu&pZ5W z%U^K#CzikH@UJYNarn=czvS>gEtd}e+wv-T$*h<8zZRRr{I8LB$h-5uPJV^FJO33q zjC?aAGSPn_z}yaocHVaCCgjjG_IGrWy@bC zERlOUKhJ}EKruNi<88|mgT;whwi>HaZZ~vV`^5#v8s#a zOgXA6QK_WyVdHfK%+ydh?gwgo43&yZ8@iH>oK&-cs-=DuCLBvjtbBGef+TWjRq$gz%>9JvQJdm+MeK=TXm0(7)9i(NMDmVp*G}=zms5z-Z>{7*V zslX2@JRQq0X<-s!ZD}fsQ@vHaczDrI#G+UduVRc1ZermKxN$4E996NSZs)XLIGnCV zbA~5apO*2QN;xBV3jVk!eXQ{qZgH}V1P|lpaNw?uP z&QPX)4ZASGRBFoBR2uuO7AJ*Vj^>KZ@sK-ILtl|*15YW{ssz#x3&F_7{CG5KR*@gP zcZ%L)OQCG~wW|&?UH?BeTXr(<1f6PE(^%p*dxiOk6>ts{P?tPw+dj6~>S_$3H5^n` zJ(^mOX{|9H&PIuFiNJJ~s6_$NCKhv|Dx_%o;Y1rh*ca%@#X`fZH94CoBR?LdDomJC zb{p7*+bxQxRkNjHnYMBB@}b3&*^WY^P!(c*=7DRhlBgZmRI;ZXLSUw99%3_U5qq)X z$MG!L$5hr{`N%Q-B|9YRHy?whkIZ~DuC!M^h79A&gqDrhFDbNFTekAgIRL+8VcNG) g?<>^3T`N8tZ9N;)S7;kA_qTI2n}^%uWtMmR2M}o4X8-^I literal 4128 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 literal 24788 zcmb`P2bkQ%6~|?4dhZ>M-i^;T28@BdVxKp@^KEX=B_YnC+nu`=-jxR5gGF^1v%=M+C~8w1Ak^~1RQ!iCh;jkj zSYEZMf*V&1bc6tHg%}UQl`~F>&bTp%qk0h2iH~HsFQy{u`jm#Wj^M61O>DfZ^nP*4rRV%;^j{7C{%wNGtoY%=vuQF?M0l*D8W zPO%$oiPZ4+{(ka%svRprouGoK6x6-as$ru0IGxiQcuBn=DprDd%A^-B=KZo)av==I z{n5ZJW1WGu+iBd|tfRH7>)Ji=aJt1q*^BDXFtlpDVb84w`mARNHdM%NwHnN;@<0QG z22f+G$)FH~ap-z6W%kVf!Ej4Gg7#%NnD@!WS^tHLQ7DF}kE$81 z{~VijBU0nVG~3uv;mOYJg0EUR=*7djkOvzxGp0d2uZzjb)o7yXafKP2&kb^VgRX_C zLh{juMzyLNQWA9mH!$n%2AiR&or7C3ZSOEI7uw9ihM)Hb-O|q4FlhK?I>$ve7%m3Z z;zfwxs$!y++YH9%R2ahb@5>j0a^F}Z@=A1ui){vlP}SWK`0--jh9K;lP^BQG`vr5c z!e*v?ce<)JZYyFxBZ{$0fPBA=hYPOzO`~v6Ai2^;VtZOIR2D(G_PNSN&IDn}6iwcb zV%LW{4PCFc8H5Vjdeptm^UJ|J!I#)zP(0?A2I}=9+?;BwTlJtDkVNVlo7HT+QQYbI zK2|uWGtc(Jb{ebLr&Jf}CXqOG|lyuTvqsE!3?-SfJV(`LP`>x`vUtSeQj3=dL8 zewAQBcO{a#kTxo}%)7#PIj-()Hqua$F034f%?9RS4(_jDOx1#L5$>3+DvZ^Fu3>b) zc!1lP^?|4k*I)u8D1shTu~Dx>MGsX!-;W*YL2lf19Nb44TfKG_UBV#_m~{d!S-YBm zVH?oDW^MlpLe_UdE+=AxjTnzBD%96_gflt4VS2+}p%VCN5b8JRPL|Q^= zMsC%VJH~ln@N!Ygwfd)NSN$Py5SIkP_4bbOCfo%JC#aaJl3Y7{aV)z-9bR`q3I=A*&#y#Zp#>f`vHk&5}TE~v~ zW)3<{3h%by$H$LrR_vey;~5w?JK=r}7xoBVso{t25xh#n69Oz;dbl?ttTOSs7r9AO zUzqG8+9WW^1rr~LwlF6M;?jQIx9Xj#8{EX3);vw?kTkl6lKN*GGcv2(Xw37A<()}p zupha-y8*-lbWlQ7rgo`X9Sxu_nmmp_Ot3X&=LYe39l?l-?BSej%0+e!FkOr65zL8P zWIF_cI>mKw2%ocK4<0q3Pd%#URF$Iek<7xZQhDjyzKAV&9U6|7!BlsH5*Wlo&>P0w z*Px9~3+r0JkZxnBc}ptq!vlh^;(`imUPPgWS#-M^6^Do1u$(cOwwVlt3hwc3psfxa zW8LPKZ16x~)A|J%m_Q}?B(3YovJIz#+Tue`qdcaf3KllhntrU!6gSK14ZJL-klO=t zhQnsP1y9mQ&v=oC@T_1#CELhD_=fZ-3ISX)ee;SPpMXId4{AUt(g^y3kb!O929KiB zvs+=$u@McrAq4NUlTc6|MU7mxeJ2DF!^)4WrFG0Tm7>be*&R&@`fD!|!s5>v47 z7#CGcUmFKYY8g{;u*7Fja+jf)w!xA>fMgLH;Q;zAMJ?Ae$f_k2AX&>K z#J){W#Ju3Ds3&HSRZl~JI`z2a+M~hn{gK`oaj&n&#!KjDtofFAQR|v(*JB{>?zEp*cp2&bAso_rCr(6^v*VA z*;s*w!@MWZBW8oH??XF_HSg1zIj)Kk@(czgDmrT3TLfs1hN+>39&C8kvJMh#?sVVl znasjgLeBywE%atfUwZAH&7GL_jdLhGbRZ{aJvp+deay8S^dU3`HZsIAnd2ywPFKMWx4uZWe z$&lzO8&|a{>bqbZy;Q(;h_KfkFJn+5u_KONZiPtTGC2GShL}|+EircS2i>?-!O<1G z^snSbO}YGT1qOwYIAA);?^SRRmqb0TOD9YN?$t=Zl6YJS>(+pK4WTUskXMPrSnwA|4C4U9Ic<}rP0c+q!jUOWCqj_34-$?&|I)&rE2 zss_ETSie_%6E|q;%x5$GW?(48_&+CHm$$$HToMS^+cW)E+yx6KYHl6srbNw91DclF zB)&Apc)3mU>6Jsntgg3lhfP7(+qo07UUxn7z7tP#J12|_Q(iM(2*YFuy(0rjTHXmv zk~y)A-o>0Ch)a7J-Jy4;ZgA6RiD1kc9tu#*yBTGxw%-FxS26EpPGm9f69^+_I}AWh zdNGcBk)roA)TZbIy%c?rIgu58NFbP^e9fIz+tmWSS;T_+Fyn2qKGI9pN0}2@)-Hiy zvfxEzs_0`3wJG{IFnA(LIU%M$!JNp7J}D4b&*OC)QPA~(dmm)cILD_LYgVbFh%CHV zss@XCY#koeXy{On|9)Dq%C=7Ef%h}1zw?=lVN%1ly_WwhgOVI}v{QEq5Y?g!a9%z5 zsfW|4BtOS!C#N^iCBg&cvWKHFZk2*s4|}JL-RHR_UNl(J^Y9Xq2IId#xW1T9FXKWG zkq#34MQ)jE(w2#;dbEm!4h8;8!_&V<3tRoK?-gZ)hl5#UGAsM z)+X_1y(IpeIgus)LLgcab-@+jJts7e={5Z&v$0A0RWE73W=>>jzYz$mcA*Lz41##5 zqDni*+=Ze$r$%6+8&scD zWGKx<6=s7`+xjO4CwZWz18eXQCeP5@VN~>IPUf1lm2FS!QGKOuPd)7EP;>ehZs)Y> z^S0*nuMA3Z)zO^(O@Jf?qc9I-0A3i3;PV4MdEU`vQX) zB}vSKwuD~B#AnRIgv#jED%go!42J7ai;Yga|q*YvJM3X zF-nrG!Ol}cRNpKuuan$z#v9R(sU+sB5OKJAeg3(e&^YYx5+vO7{n+^vd(2r zWLf74M2D;CCC?w65Y7O*td0 zfkBLtl#xrA6FDPm1Of+5VQwMJCV`RlVKoCYAB&5%>7c5IO)q68wh*`s7{mw#^&O4= z<=lzWqylLlHeJgJ=0cB|E(41zIAMGwh1wd-T*oQ!gPYlixDs~aeo8q(?p1gs0nDk| z`zTingb_ot-Au@)FAsB!x0T`mFo;o-WDPPW^7S1O2tgK1C=Mv>h8b^@wH_G6C`qz5 zFekFC5rMGC>R-Krlx<`tHf4EW5Thh1dkAwPE88RxHf5J-Wuwf*rfdut#3)J1HZv!( zvT=bBlqJ)Xuo5XS6PvP!0)rSON!bK*A}cEj1Xnf$vwLCgDvV&Xh6g5@jZNAXU=X7u zN!!Yt$kMh6gjE{rcW!5PHhB*N1~E#KyoWOQTW>dEV7{n+^ z>K@6Q$m*s9!lEu8MGZ4I`C4XW6Xybh7$r&EG;<=0D+xp~@5gIaJ5=GapxYe812Ztm zkwz2B%q|%+;hBOTD?lSmgKfjgG=paLt>UK5CaKRhB{RSvMoG%qEOR2~tRfIx;Ur9o z#0uL~KOVzv<$WD6h*6SM?PN}5RaJqIR8fG|7;Mwz1A`bPNmIa_$eQW`A!$n5kn0(5 zlNADk7$r$o#GJ^oVu284nJd^}yiL{|Fo;o-WX&@tvaAJx$jXA>W%AfsWF|IcHvoee zB}v(%m=jsqqXojIjNjZNBl(!$gs|9p6XR{N-V6+4lq6YiVNPUOZxskp7RAO1*Siy%B!q&G?-p?#-!ae{DVw5CdA7oBsVIL9*E(~A)!50oj zVNh@&oQ-hqFU8r1nVn7EM}R?$k|gh=%!w>-mq5^)X8b{_DYSVSWLpL&`WT~=XFYm7 zPEUwqs_ZptZAQp{ysJ@q)8l6@=tPKrqN@#dsyj~eNp1p#flHbb7f!aI)kpGx~cScUq6@kG_1)dR$K%{Je0S2O^*NM-wwC48OpvY+?9CU=X7OCEqbP z{Uzo^4#O`CL|1W1wf7ZfXw&yqU=X7u>H8XUBI~-fA+INqvTxcV(o#|?(I z-(e0MC`MdpzB*QA@GT3MelYC8?_Y5!_q&|l)uh7Djy-)37{mx|3W5E7?!;;08J+gG zE!3Q-|xlnD)dgg~oKjUVQP29}p;ODRt_Y(?CM>X*aI${8GZc|q2uS0&x z8Ow=&1q@=8a>9vz&78>h({BVKZA_rau6yun446KceA!0N9{Vk`N+Qr?V7dw~B&Xr$ z_lx=`e=vg?eq*LX@ps(JlBeGTgBT?#Pk&%eQ6dl!ogQ=0q;JeFUOIoh~#ZY+q(!6SiM3Vf!;DvakaLqC?nFw6pCd zJ&+mMv>nt-+ri9x~K~_P1 z0%R9dyuJY;%R9~VuJ$zM#46`>23h5tAwZ@gh~WX-hYtkfmuItYe9vTNwyNMPV7j(E zXEP^>!1kW*IRYW5+cGgq?cuo$x2Za>m#Xub6Is;-0>M?WH|%NMc_Fj0NxP_*wB^i+ zEbU@}uu5Zn!xhZVCa=Gjyp_y}EN_)SP#sONCRCQInL%5nP6qbM?h&4A>$+LO z&*l9xm=3@bWE^p`D+Mz=X;O5!e#cV%wey>BgD*YC))*SJ2>VdmcSN1ec(d-m(b!Yp_A*si9eI4WD^)zVCz^& zrJ%Ol2wQHdOB(+~_>SA}Yu@ z@L{-;Qnc})|2Yyo4ipNb`JsWy{P^azrmP>-^E8dOB)<=)b6$3P92XV=|F6BpZO`3U aE}do5yxMNqeyr2hZu$Ql!I(YAIQS2&v}>mT diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt index 22977b3..20147cb 100644 --- a/ProjectSettings/ProjectVersion.txt +++ b/ProjectSettings/ProjectVersion.txt @@ -1 +1 @@ -m_EditorVersion: 2018.1.0f2 +m_EditorVersion: 2018.2.3f1 diff --git a/ProjectSettings/UnityConnectSettings.asset b/ProjectSettings/UnityConnectSettings.asset new file mode 100644 index 0000000000000000000000000000000000000000..180314a7ca113b05058a6b856076f71214b04a58 GIT binary patch literal 4276 zcmeH~%Tm-p6oyY`xQXIjQBgthuFP;zKorf0Q%aR0imWWlikSehW|FBSLy4>S1U`Tp zS3ZFF0Isd_38=Ds0T=Go@%-IMNJ|#(ovu1`_ctehPXC>x8ltXkM7uu{(H`!(BN`nZ znJkPJ#+F9tceB~lG-l)Y(`+ z@ADLX&?szUh&&k@-Q(P+%rVb#pdlapfEW|y0d>jmvd#ccp${zz!E@ROj}YMPj5QrR zPhXk!@ioZp02h&`hsl_B>7VE_KI|8VK zYqZWo1lHBZeU{EqaBi{AXE7!^Cg>)Q^^b$=lBb`;e((@n^=*K0mTxD(MX0`=Ot{>a z_&FS8PM@~wpF+M4uI|fea1pBhnS^WfjmHT1bC&xof6jq(``e%M5+^+N=K{Dc^Wo1A zodz&{nhvhkKLpMNfv4ZoLc*m#zjzLP_>`qTjQkA!5%3KC(S+xSYY%(a zMCgw(&(gn~aJBv`;E{fRPJU;gGoIwPi}#wJ^AMcBmyv#l@?K9emi2ck@AXx1q2H3?tJ558wy4%ejaug*B@`7D8pQ1|y% z!ZjM;1O)PCIHbP%J-H386D>M+ur}j5j%5Z5RuI_EvQM>Vk1apA?^dj6SYEZ9V9~2a zQ_f$qmpA9LEF!XJJi}jkWYt{{LMgqJz?>1-t5yok81=iyxL*0CY1ISUb$nUc ze8V$W3_qKXnt7VH;KZmG!_`2n;W1)TKzNqNKV09iwK=R(Lffr{cMG zC7H_s9Ei}o>$>Ddz)9I~2xzsI11$$y4zwI-InZ+8|8xL{&y^sk`%}eY zoevO07S2z8!K}KCN}+)x*I1=sy0xNFw~O+}qKUJU<>P?;Z`b;3wdZctHjM!P Date: Mon, 20 Aug 2018 21:50:05 +0200 Subject: [PATCH 10/11] Updated README.md with new gif --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 609fa19..29548a2 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,6 @@ 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/Y8Qbzlg.gif) +![ScriptableObjectFactory](https://i.imgur.com/qENZqro.gif) Based on original implementation by [liortal53](https://github.com/liortal53/ScriptableObjectFactory) From 01ae4427f9a36022bdc1e00ff09895b6688a2e5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=8C=80=EC=9B=90?= Date: Sun, 9 Aug 2020 15:31:23 +0900 Subject: [PATCH 11/11] wip --- .../Editor/ScriptableObjectFactory.cs | 51 --------------- .../Editor/ScriptableObjectFactory.cs.meta | 9 --- .../Editor/ScriptableObjectWindow.cs | 64 ++++++++++--------- 3 files changed, 34 insertions(+), 90 deletions(-) delete mode 100644 Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs delete mode 100644 Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs.meta diff --git a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs deleted file mode 100644 index 3408eaf..0000000 --- a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using UnityEditor; -using UnityEngine; - -namespace ScriptableObjectFactory -{ - public static class ScriptableObjectFactory - { - [MenuItem("Assets/Create/ScriptableObject")] - public static void CreateScriptableObjectFactoryWindow() - { - CreateScriptableObjectFactoryWindow(false); - } - - public static void CreateScriptableObjectFactoryWindow(bool getAllAssemblies) - { - - List allScriptableObjectTypes; - - try - { - var assemblies = getAllAssemblies ? GetAllAssemblies() : GetCSharpAssembly(); - - allScriptableObjectTypes = new List(from assembly in assemblies - from type in assembly.GetTypes() - where type.IsSubclassOf(typeof(ScriptableObject)) - select type); - } - catch (Exception e) - { - Debug.LogError("Error while opening scriptable object window: " + e.Message); - allScriptableObjectTypes = new List(); - } - - ScriptableObjectWindow.Init(allScriptableObjectTypes.ToArray(), getAllAssemblies); - } - - private static IEnumerable GetCSharpAssembly() - { - return new[] {Assembly.Load(new AssemblyName("Assembly-CSharp"))}; - } - - private static IEnumerable GetAllAssemblies() - { - return AppDomain.CurrentDomain.GetAssemblies(); - } - } -} \ No newline at end of file diff --git a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs.meta b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs.meta deleted file mode 100644 index fd9f509..0000000 --- a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectFactory.cs.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: f7d6a5aeed246424a98718a370500aa8 -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: diff --git a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs index 5bbcc5a..4f0a09b 100644 --- a/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs +++ b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs @@ -39,30 +39,40 @@ private string SearchFilter } } - private string[] _searchResults = { }; - private int _selectedIndex; - private static string[] _scriptableObjectNames; - private static int _selectedAssembly; + string[] _searchResults = { }; + int _selectedIndex; - private static Type[] _types; + static Type[] _types; + static string[] _scriptableObjectNames; - private static Type[] Types + [MenuItem("Assets/Create/ScriptableObject")] + public static void Open() { - get { return _types; } - set - { - _types = value; - _scriptableObjectNames = _types.Select(t => t.FullName).ToArray(); - } + var types = TypeCache.GetTypesDerivedFrom(); + _types = types.Where(ShouldIncludeType).ToArray(); + _scriptableObjectNames = _types.Select(x => x.FullName).ToArray(); + GetWindow(true, "Create a new ScriptableObject", true).ShowPopup(); } - public static void Init(Type[] scriptableObjects, bool getAllAssemblies) + static bool ShouldIncludeType(Type type) { - Types = scriptableObjects; - _selectedAssembly = Convert.ToInt32(getAllAssemblies); + if (type.IsSubclassOf(typeof(EditorWindow)) + || type.IsSubclassOf(typeof(Editor))) + return false; - var window = GetWindow(true, "Create a new ScriptableObject", true); - window.ShowPopup(); + var fullName = type.FullName; + return !fullName.StartsWith("Unity") + && !fullName.StartsWith("UnityEngine") + && !fullName.StartsWith("UnityEditor") + && !fullName.StartsWith("Sirenix") + && !fullName.StartsWith("DG") + && !fullName.StartsWith("E7") + && !fullName.StartsWith("Heureka") + && !fullName.StartsWith("Google") + && !fullName.StartsWith("Zenject") + && !fullName.StartsWith("TouchScript") + && !fullName.StartsWith("ScriptableObjectFactory") + && !fullName.StartsWith("Packages"); } private void Awake() @@ -82,14 +92,7 @@ private void DrawAssemblySelection() { GUILayout.Space(6); GUILayout.BeginHorizontal(); - GUILayout.Label("Assembly:", GUILayout.Width(LabelWidth)); - var selectedAssembly = GUILayout.Toolbar(_selectedAssembly, new[] {"C#", "All Assemblies"}); - if (selectedAssembly != _selectedAssembly) - { - ScriptableObjectFactory.CreateScriptableObjectFactoryWindow(Convert.ToBoolean(selectedAssembly)); - _searchResults = FindMatchingNames(_searchFilter); - } - + _searchResults = FindMatchingNames(_searchFilter); GUILayout.EndHorizontal(); } @@ -116,7 +119,8 @@ private void DrawSelectionPopup() { GUILayout.Space(6); - using (var scope = new EditorGUILayout.ScrollViewScope(_scrollPos,EditorStyles.helpBox)) { + using (var scope = new EditorGUILayout.ScrollViewScope(_scrollPos, EditorStyles.helpBox)) + { _selectedIndex = GUILayout.SelectionGrid(_selectedIndex, _searchResults, 1); _scrollPos = scope.scrollPosition; } @@ -134,7 +138,7 @@ private void DrawCreateButton() ProjectWindowUtil.StartNameEditingIfProjectWindowExists( asset.GetInstanceID(), CreateInstance(), - string.Format("{0}.asset", fileName), + fileName + ".asset", AssetPreview.GetMiniThumbnail(asset), null); @@ -148,9 +152,9 @@ private string[] FindMatchingNames(string filter) ? string.Empty : _searchResults[_selectedIndex]; - var matchingNames = string.IsNullOrEmpty(filter) + var matchingNames = string.IsNullOrEmpty(filter) ? _scriptableObjectNames - : _scriptableObjectNames.Where(scriptableObjectname => IsMatch(scriptableObjectname, filter)).ToArray(); + : _scriptableObjectNames.Where(name => IsMatch(name, filter)).ToArray(); var newIndex = Array.FindIndex(matchingNames, matchingName => matchingName == selectedName); _selectedIndex = newIndex < 0 @@ -160,7 +164,7 @@ private string[] FindMatchingNames(string filter) return matchingNames; } - private static bool IsMatch(string text, string searchTerm) + static bool IsMatch(string text, string searchTerm) { try {