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/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/ScriptableObjectFactory.cs.meta b/Assets/Editor/ScriptableObjectFactory.cs.meta
deleted file mode 100644
index fd9f509..0000000
--- a/Assets/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/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/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/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/ScriptableObjectWindow.cs b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs
new file mode 100644
index 0000000..4f0a09b
--- /dev/null
+++ b/Assets/Plugins/ScriptableObjectFactory/Editor/ScriptableObjectWindow.cs
@@ -0,0 +1,184 @@
+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;
+ }
+ }
+
+ string[] _searchResults = { };
+ int _selectedIndex;
+
+ static Type[] _types;
+ static string[] _scriptableObjectNames;
+
+ [MenuItem("Assets/Create/ScriptableObject")]
+ public static void Open()
+ {
+ var types = TypeCache.GetTypesDerivedFrom();
+ _types = types.Where(ShouldIncludeType).ToArray();
+ _scriptableObjectNames = _types.Select(x => x.FullName).ToArray();
+ GetWindow(true, "Create a new ScriptableObject", true).ShowPopup();
+ }
+
+ static bool ShouldIncludeType(Type type)
+ {
+ if (type.IsSubclassOf(typeof(EditorWindow))
+ || type.IsSubclassOf(typeof(Editor)))
+ return false;
+
+ 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()
+ {
+ _searchResults = FindMatchingNames(string.Empty);
+ }
+
+ public void OnGUI()
+ {
+ DrawAssemblySelection();
+ DrawSearch();
+ DrawSelectionPopup();
+ DrawCreateButton();
+ }
+
+ private void DrawAssemblySelection()
+ {
+ GUILayout.Space(6);
+ GUILayout.BeginHorizontal();
+ _searchResults = FindMatchingNames(_searchFilter);
+ GUILayout.EndHorizontal();
+ }
+
+ 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 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;
+ }
+ }
+
+ 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(),
+ fileName + ".asset",
+ 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(name => IsMatch(name, filter)).ToArray();
+
+ var newIndex = Array.FindIndex(matchingNames, matchingName => matchingName == selectedName);
+ _selectedIndex = newIndex < 0
+ ? 0
+ : newIndex;
+
+ return matchingNames;
+ }
+
+ 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/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 0000000..1157016
Binary files /dev/null and b/ProjectSettings/ClusterInputManager.asset differ
diff --git a/ProjectSettings/GraphicsSettings.asset b/ProjectSettings/GraphicsSettings.asset
index b448967..2b42d59 100644
Binary files a/ProjectSettings/GraphicsSettings.asset and b/ProjectSettings/GraphicsSettings.asset differ
diff --git a/ProjectSettings/PresetManager.asset b/ProjectSettings/PresetManager.asset
new file mode 100644
index 0000000..913844e
Binary files /dev/null and b/ProjectSettings/PresetManager.asset differ
diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset
index ff79728..426df5c 100644
Binary files a/ProjectSettings/ProjectSettings.asset and b/ProjectSettings/ProjectSettings.asset differ
diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt
index 29defb9..20147cb 100644
--- a/ProjectSettings/ProjectVersion.txt
+++ b/ProjectSettings/ProjectVersion.txt
@@ -1,2 +1 @@
-m_EditorVersion: 5.0.0a13
-m_StandardAssetsVersion: 0
+m_EditorVersion: 2018.2.3f1
diff --git a/ProjectSettings/UnityConnectSettings.asset b/ProjectSettings/UnityConnectSettings.asset
new file mode 100644
index 0000000..180314a
Binary files /dev/null and b/ProjectSettings/UnityConnectSettings.asset differ
diff --git a/README.md b/README.md
index 4c71da2..29548a2 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,10 @@
# ScriptableObjectFactory
-A Unity editor extension for creating any ScriptableObject type
+A Unity editor extension for creating ScriptableObjects
-Download as a .UnityPackage: [ScriptableObjectFactory](https://www.dropbox.com/s/vdvf5si4go3jnb5/ScriptableObjectFactory.unitypackage)
+Right click > Create > ScriptableObject in the project view
-Originally introduced in this [Blog Post](http://www.tallior.com/unity-scriptableobject-factory/?utm_source=github&utm_medium=readme&utm_campaign=link)
+[Download](https://www.dropbox.com/s/f8fwosvjt8obi6h/ScriptableObjectFactory.unitypackage?dl=0) as a .UnityPackage
+
+
+
+Based on original implementation by [liortal53](https://github.com/liortal53/ScriptableObjectFactory)