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 + +![ScriptableObjectFactory](https://i.imgur.com/qENZqro.gif) + +Based on original implementation by [liortal53](https://github.com/liortal53/ScriptableObjectFactory)