├── .GenericUnityInternals
├── GenericUnityEditorInternals
│ ├── EditorGUIHelper.cs
│ ├── EditorGUILayoutHelper.cs
│ ├── GenericMonoImporterInspector.cs
│ ├── GenericTypeHelper.cs
│ ├── GenericUnityEditorInternals.csproj
│ ├── GenericUnityEventDrawer.cs
│ ├── ObjectFieldHelper.cs
│ ├── ObjectSelectorExtensions.cs
│ ├── ObjectSelectorHelper.cs
│ └── Properties
│ │ └── AssemblyInfo.cs
├── GenericUnityInternals.sln
├── OdinInternals
│ ├── GenericUnityEventDrawer`1.cs
│ ├── OdinInternals.csproj
│ └── Properties
│ │ └── AssemblyInfo.cs
└── README.txt
├── .gitattributes
├── .github
└── workflows
│ └── ci.yml
├── .gitignore
├── .images
├── add-component.gif
├── asset-creation.gif
├── creatable-scriptable-object.gif
├── generic-header.png
├── object-field.png
└── project-settings.png
├── .releaserc.json
├── CHANGELOG.md
├── CHANGELOG.md.meta
├── Editor.meta
├── Editor
├── AssemblyCreator.meta
├── AssemblyCreator
│ ├── AssemblyCreator.cs
│ ├── AssemblyCreator.cs.meta
│ ├── AssemblyCreatorHelper.cs
│ ├── AssemblyCreatorHelper.cs.meta
│ ├── BehaviourSelectorCreator.cs
│ ├── BehaviourSelectorCreator.cs.meta
│ ├── ConcreteClassCreator.cs
│ ├── ConcreteClassCreator.cs.meta
│ ├── MenuItemsCreator.cs
│ └── MenuItemsCreator.cs.meta
├── AssemblyInfo.cs
├── AssemblyInfo.cs.meta
├── Drawers.meta
├── Drawers
│ ├── BehaviourSelectorEditor.cs
│ ├── BehaviourSelectorEditor.cs.meta
│ ├── CreatableObjectDrawer.cs
│ ├── CreatableObjectDrawer.cs.meta
│ ├── GenericHeaderUtility.cs
│ ├── GenericHeaderUtility.cs.meta
│ ├── GenericObjectDrawer.cs
│ ├── GenericObjectDrawer.cs.meta
│ ├── GenericUnityObjectDrawer.cs
│ ├── GenericUnityObjectDrawer.cs.meta
│ ├── GenericUnityObjectHelper.cs
│ ├── GenericUnityObjectHelper.cs.meta
│ ├── ScriptableObjectEditor.cs
│ ├── ScriptableObjectEditor.cs.meta
│ ├── SingletonScriptableObjectEditor.cs
│ ├── SingletonScriptableObjectEditor.cs.meta
│ ├── TypeReferenceWithBaseTypesDrawer.cs
│ ├── TypeReferenceWithBaseTypesDrawer.cs.meta
│ ├── UnityObjectEditor.cs
│ └── UnityObjectEditor.cs.meta
├── GenerationDatabase.meta
├── GenerationDatabase
│ ├── BehavioursGenerationDatabase.Serialization.cs
│ ├── BehavioursGenerationDatabase.Serialization.cs.meta
│ ├── BehavioursGenerationDatabase.cs
│ ├── BehavioursGenerationDatabase.cs.meta
│ ├── ConcreteClass.cs
│ ├── ConcreteClass.cs.meta
│ ├── GenerationDatabase.Serialization.cs
│ ├── GenerationDatabase.Serialization.cs.meta
│ ├── GenerationDatabase.cs
│ ├── GenerationDatabase.cs.meta
│ ├── Pool.cs
│ ├── Pool.cs.meta
│ ├── SOGenerationDatabase.cs
│ ├── SOGenerationDatabase.cs.meta
│ ├── TypeInfo.meta
│ └── TypeInfo
│ │ ├── ArgumentInfo.cs
│ │ ├── ArgumentInfo.cs.meta
│ │ ├── BehaviourInfo.cs
│ │ ├── BehaviourInfo.cs.meta
│ │ ├── GenericTypeInfo.cs
│ │ ├── GenericTypeInfo.cs.meta
│ │ ├── TypeInfo.cs
│ │ └── TypeInfo.cs.meta
├── GenericTypesAnalyzer.meta
├── GenericTypesAnalyzer
│ ├── ArgumentsChecker.cs
│ ├── ArgumentsChecker.cs.meta
│ ├── AssemblyAssetOperations.cs
│ ├── AssemblyAssetOperations.cs.meta
│ ├── BehavioursChecker.cs
│ ├── BehavioursChecker.cs.meta
│ ├── ConcreteClassChecker.cs
│ ├── ConcreteClassChecker.cs.meta
│ ├── DictInitializer.cs
│ ├── DictInitializer.cs.meta
│ ├── FailedAssembliesChecker.cs
│ ├── FailedAssembliesChecker.cs.meta
│ ├── GenericTypesAnalyzer.cs
│ ├── GenericTypesAnalyzer.cs.meta
│ ├── GenericTypesChecker.cs
│ ├── GenericTypesChecker.cs.meta
│ ├── MenuItemsChecker.cs
│ ├── MenuItemsChecker.cs.meta
│ ├── ScriptableObjectsChecker.cs
│ └── ScriptableObjectsChecker.cs.meta
├── GenericUnityObjects.Editor.asmdef
├── GenericUnityObjects.Editor.asmdef.meta
├── MissingScriptTypeDisabler.cs
├── MissingScriptTypeDisabler.cs.meta
├── MonoBehaviours.meta
├── MonoBehaviours
│ ├── GenericBehaviourCreator.cs
│ └── GenericBehaviourCreator.cs.meta
├── OnScriptsReloadActionsRunner.cs
├── OnScriptsReloadActionsRunner.cs.meta
├── PackageUpgrader.cs
├── PackageUpgrader.cs.meta
├── ScriptableObjects.meta
├── ScriptableObjects
│ ├── GenericSOCreator.cs
│ ├── GenericSOCreator.cs.meta
│ ├── SelectionWindow.meta
│ ├── SelectionWindow
│ │ ├── ITypeSelectionWindow.cs
│ │ ├── ITypeSelectionWindow.cs.meta
│ │ ├── MultipleTypeSelectionWindow.cs
│ │ ├── MultipleTypeSelectionWindow.cs.meta
│ │ ├── OneTypeSelectionWindow.cs
│ │ └── OneTypeSelectionWindow.cs.meta
│ ├── TypeSelectionWindow.cs
│ └── TypeSelectionWindow.cs.meta
├── Settings.meta
├── Settings
│ ├── ProjectSettings.cs
│ ├── ProjectSettings.cs.meta
│ ├── ProjectSettingsDrawer.cs
│ └── ProjectSettingsDrawer.cs.meta
├── Util.meta
└── Util
│ ├── Collection`1.cs
│ ├── Collection`1.cs.meta
│ ├── CompilationChecker.cs
│ ├── CompilationChecker.cs.meta
│ ├── CompilationHelper.cs
│ ├── CompilationHelper.cs.meta
│ ├── ConcreteClassCreator.cs
│ ├── ConcreteClassCreator.cs.meta
│ ├── EditorCoroutineHelper.cs
│ ├── EditorCoroutineHelper.cs.meta
│ ├── EditorOnlySingletonSO.cs
│ ├── EditorOnlySingletonSO.cs.meta
│ ├── ExampleInstaller.cs
│ ├── ExampleInstaller.cs.meta
│ ├── IconFinder.cs
│ ├── IconFinder.cs.meta
│ ├── IconSetter.cs
│ ├── IconSetter.cs.meta
│ ├── MenuItemMethod.cs
│ ├── MenuItemMethod.cs.meta
│ ├── NonGenericAttribute.cs
│ ├── NonGenericAttribute.cs.meta
│ ├── PersistentStorage.cs
│ └── PersistentStorage.cs.meta
├── GenericUnityEditorInternals.dll
├── GenericUnityEditorInternals.dll.meta
├── GenericUnityEditorInternals.pdb
├── GenericUnityEditorInternals.pdb.meta
├── LICENSE
├── LICENSE.meta
├── OdinInternals.dll
├── OdinInternals.dll.meta
├── OdinInternals.pdb
├── OdinInternals.pdb.meta
├── README.md
├── README.md.meta
├── Runtime.meta
├── Runtime
├── ApplyToChildrenAttribute.cs
├── ApplyToChildrenAttribute.cs.meta
├── AssemblyInfo.cs
├── AssemblyInfo.cs.meta
├── CreatableAttribute.cs
├── CreatableAttribute.cs.meta
├── CreateGenericAssetMenuAttribute.cs
├── CreateGenericAssetMenuAttribute.cs.meta
├── GameObjectExtensions.cs
├── GameObjectExtensions.cs.meta
├── GenericScriptableObject.cs
├── GenericScriptableObject.cs.meta
├── GenericUnityObjects.asmdef
├── GenericUnityObjects.asmdef.meta
├── Util.meta
└── Util
│ ├── BehaviourSelector.cs
│ ├── BehaviourSelector.cs.meta
│ ├── Config.cs
│ ├── Config.cs.meta
│ ├── DebugUtility.cs
│ ├── DebugUtility.cs.meta
│ ├── GeneratedUnityObjectCache.cs
│ ├── GeneratedUnityObjectCache.cs.meta
│ ├── GenericTypesDatabase.meta
│ ├── GenericTypesDatabase
│ ├── BehavioursDatabase.cs
│ ├── BehavioursDatabase.cs.meta
│ ├── GenericTypesDatabase.cs
│ ├── GenericTypesDatabase.cs.meta
│ ├── ScriptableObjectsDatabase.cs
│ ├── ScriptableObjectsDatabase.cs.meta
│ ├── SerializableType.cs
│ ├── SerializableType.cs.meta
│ ├── SerializableTypeCollection.cs
│ ├── SerializableTypeCollection.cs.meta
│ ├── SerializableTypeDictionary.cs
│ ├── SerializableTypeDictionary.cs.meta
│ ├── TypeArrayComparer.cs
│ └── TypeArrayComparer.cs.meta
│ ├── InstanceGetter.cs
│ ├── InstanceGetter.cs.meta
│ ├── SingletonScriptableObject.cs
│ ├── SingletonScriptableObject.cs.meta
│ ├── TypeReferenceCollectionExtensions.cs
│ ├── TypeReferenceCollectionExtensions.cs.meta
│ ├── TypeReferenceWithBaseTypes.cs
│ ├── TypeReferenceWithBaseTypes.cs.meta
│ ├── TypeUtility.cs
│ └── TypeUtility.cs.meta
├── Samples~
├── MonoBehaviour Example.meta
├── MonoBehaviour Example
│ ├── MonoBehaviour Demo.unity
│ ├── MonoBehaviour Demo.unity.meta
│ ├── Scripts.meta
│ └── Scripts
│ │ ├── Archer.cs
│ │ ├── Archer.cs.meta
│ │ ├── Editor.meta
│ │ ├── Editor
│ │ ├── Installer.cs
│ │ └── Installer.cs.meta
│ │ ├── Knight.cs
│ │ ├── Knight.cs.meta
│ │ ├── Unit`1.cs
│ │ ├── Unit`1.cs.meta
│ │ ├── Warrior.cs
│ │ └── Warrior.cs.meta
├── ScriptableObject Example.meta
└── ScriptableObject Example
│ ├── Classes.meta
│ ├── Classes
│ ├── Archer.cs
│ ├── Archer.cs.meta
│ ├── Berserker.cs
│ ├── Berserker.cs.meta
│ ├── Knight.cs
│ ├── Knight.cs.meta
│ ├── WarriorClass.cs
│ └── WarriorClass.cs.meta
│ ├── GenericScriptableObjects.meta
│ ├── GenericScriptableObjects
│ ├── WarriorStats`1.cs
│ ├── WarriorStats`1.cs.meta
│ ├── WarriorsRelationship`2.cs
│ └── WarriorsRelationship`2.cs.meta
│ ├── README.asset
│ ├── README.asset.meta
│ ├── Relationships.meta
│ ├── Relationships
│ ├── Arnet - Geltull.asset
│ ├── Arnet - Geltull.asset.meta
│ ├── Edun - Fulchard.asset
│ ├── Edun - Fulchard.asset.meta
│ ├── Geltull - Fulchard.asset
│ └── Geltull - Fulchard.asset.meta
│ ├── Util.meta
│ ├── Util
│ ├── Editor.meta
│ ├── Editor
│ │ ├── Installer.cs
│ │ └── Installer.cs.meta
│ ├── Readme.cs
│ └── Readme.cs.meta
│ ├── Warrior Stats.meta
│ ├── Warrior Stats
│ ├── Default Berserker Stats.asset
│ ├── Default Berserker Stats.asset.meta
│ ├── Default Knight Stats.asset
│ ├── Default Knight Stats.asset.meta
│ ├── Heavy Archer.asset
│ ├── Heavy Archer.asset.meta
│ ├── Light Archer.asset
│ └── Light Archer.asset.meta
│ ├── Warriors.meta
│ └── Warriors
│ ├── Arnet.asset
│ ├── Arnet.asset.meta
│ ├── Edun.asset
│ ├── Edun.asset.meta
│ ├── Fulchard.asset
│ ├── Fulchard.asset.meta
│ ├── Geltull.asset
│ └── Geltull.asset.meta
├── Tests.meta
├── Tests
├── Editor.meta
├── Editor
│ ├── BehaviourInfoTests.cs
│ ├── BehaviourInfoTests.cs.meta
│ ├── GenerationDatabaseTests.meta
│ ├── GenerationDatabaseTests
│ │ ├── AddConcreteClass.cs
│ │ ├── AddConcreteClass.cs.meta
│ │ ├── AddGenericType.cs
│ │ ├── AddGenericType.cs.meta
│ │ ├── GenerationDatabaseTests.cs
│ │ ├── GenerationDatabaseTests.cs.meta
│ │ ├── GetConcreteClasses.cs
│ │ ├── GetConcreteClasses.cs.meta
│ │ ├── GetConcreteClassesByArgument.cs
│ │ ├── GetConcreteClassesByArgument.cs.meta
│ │ ├── GetReferencedGenericTypes.cs
│ │ ├── GetReferencedGenericTypes.cs.meta
│ │ ├── OnAfterDeserialize.cs
│ │ ├── OnAfterDeserialize.cs.meta
│ │ ├── RemoveArgument.cs
│ │ ├── RemoveArgument.cs.meta
│ │ ├── RemoveGenericType.cs
│ │ ├── RemoveGenericType.cs.meta
│ │ ├── TypeStub.cs
│ │ ├── TypeStub.cs.meta
│ │ ├── UpdateArgumentGUID.cs
│ │ ├── UpdateArgumentGUID.cs.meta
│ │ ├── UpdateArgumentNameAndAssembly.cs
│ │ ├── UpdateArgumentNameAndAssembly.cs.meta
│ │ ├── UpdateGenericType.cs
│ │ ├── UpdateGenericType.cs.meta
│ │ ├── UpdateGenericTypeArgs.cs
│ │ ├── UpdateGenericTypeArgs.cs.meta
│ │ ├── UpdateGenericTypeGUID.cs
│ │ └── UpdateGenericTypeGUID.cs.meta
│ ├── GenericUnityObjects.EditorTests.asmdef
│ ├── GenericUnityObjects.EditorTests.asmdef.meta
│ ├── TypeInfoTests.cs
│ └── TypeInfoTests.cs.meta
├── Integration.meta
└── Integration
│ ├── GenericBehaviour_ConcreteClass.cs
│ ├── GenericBehaviour_ConcreteClass.cs.meta
│ ├── GenericBehaviour_GenericArguments.cs
│ ├── GenericBehaviour_GenericArguments.cs.meta
│ ├── GenericBehaviour_Selector.cs
│ ├── GenericBehaviour_Selector.cs.meta
│ ├── GenericScriptableObject_ConcreteClass.cs
│ ├── GenericScriptableObject_ConcreteClass.cs.meta
│ ├── GenericScriptableObject_GenericArguments.cs
│ ├── GenericScriptableObject_GenericArguments.cs.meta
│ ├── GenericUnityObjects.IntegrationTests.asmdef
│ ├── GenericUnityObjects.IntegrationTests.asmdef.meta
│ ├── MenuItems.cs
│ ├── MenuItems.cs.meta
│ ├── TestHelper.cs
│ └── TestHelper.cs.meta
├── package.json
└── package.json.meta
/.GenericUnityInternals/GenericUnityEditorInternals/EditorGUILayoutHelper.cs:
--------------------------------------------------------------------------------
1 | namespace GenericUnityObjects.UnityEditorInternals
2 | {
3 | using System;
4 | using UnityEditor;
5 | using UnityEngine;
6 | using Object = UnityEngine.Object;
7 |
8 | public static class EditorGUILayoutHelper
9 | {
10 | ///
11 | /// Version of that accepts only a generic type and draws it correctly.
12 | ///
13 | public static Object GenericObjectField(string label, Object oldTarget, Type objType, bool allowSceneObjects)
14 | {
15 | EditorGUILayout.s_LastRect = EditorGUILayout.GetControlRect(
16 | true,
17 | EditorGUI.kSingleLineHeight,
18 | (GUILayoutOption[]) null);
19 |
20 | return EditorGUIHelper.GenericObjectField(
21 | EditorGUILayout.s_LastRect,
22 | EditorGUIUtility.TempContent(label),
23 | oldTarget,
24 | objType,
25 | allowSceneObjects);
26 | }
27 | }
28 | }
--------------------------------------------------------------------------------
/.GenericUnityInternals/GenericUnityEditorInternals/GenericTypeHelper.cs:
--------------------------------------------------------------------------------
1 | namespace GenericUnityObjects.UnityEditorInternals
2 | {
3 | using System;
4 | using UnityEditor;
5 | using UnityEngine;
6 | using Util;
7 |
8 | ///
9 | /// A class that accumulates methods that allow working with a generic type.
10 | ///
11 | internal static class GenericTypeHelper
12 | {
13 | public static Type GetGenericType(SerializedProperty property)
14 | {
15 | ScriptAttributeUtility.GetFieldInfoFromProperty(property, out Type genericType);
16 | return genericType;
17 | }
18 |
19 | public static string GetNiceTypeName(ObjectFieldHelper fieldHelper)
20 | {
21 | Type type = fieldHelper.CurrentTarget is null
22 | ? fieldHelper.ObjType
23 | : fieldHelper.CurrentTarget.GetType().BaseType;
24 |
25 | return TypeUtility.GetNiceNameOfGenericType(type);
26 | }
27 |
28 | public static Type GetConcreteType(Type genericType)
29 | {
30 | if (typeof(MonoBehaviour).IsAssignableFrom(genericType))
31 | {
32 | return GenericTypesDatabase.TryGetConcreteType(genericType, out Type concreteType)
33 | ? concreteType
34 | : genericType;
35 | }
36 |
37 | if (typeof(ScriptableObject).IsAssignableFrom(genericType))
38 | {
39 | return GenericTypesDatabase.TryGetConcreteType(genericType, out Type concreteType)
40 | ? concreteType
41 | : genericType;
42 | }
43 |
44 | throw new ArgumentException(
45 | $"Expected a type derived from MonoBehaviour or ScriptableObject. Got {genericType} instead.");
46 | }
47 | }
48 | }
--------------------------------------------------------------------------------
/.GenericUnityInternals/GenericUnityEditorInternals/ObjectSelectorHelper.cs:
--------------------------------------------------------------------------------
1 | namespace GenericUnityObjects.UnityEditorInternals
2 | {
3 | using System;
4 | using UnityEditor;
5 | using Object = UnityEngine.Object;
6 |
7 | public static class ObjectSelectorHelper
8 | {
9 | public static void ShowGenericSelector(Object obj, Object objectBeingEdited, Type requiredType, bool allowSceneObjects, string niceTypeName, Action