Compare commits

..

36 Commits

Author SHA1 Message Date
github-actions[bot] 3386bbbb93 feat: Update package.json to 1.5.0 2024-10-26 15:03:50 +00:00
Makihiro 522393cd91 Update Example.cs 2024-10-26 23:44:24 +09:00
Makihiro e61a077f9c Merge branch 'main' of https://github.com/mackysoft/Unity-SerializeReferenceExtensions 2024-10-26 23:41:15 +09:00
Makihiro 2dfbdc0405 Update release.yaml 2024-10-26 23:40:18 +09:00
Makihiro 60adb3e3d3 Merge pull request #74 from mackysoft/feature/use-tostring-as-label
Implement SubclassSelectorAttribute.UseToStringAsLabel
2024-10-26 23:35:48 +09:00
Makihiro 0b79cd7e40 Implement SubclassSelectorAttribute.UseToStringAsLabel 2024-10-26 23:31:00 +09:00
Makihiro d9bc19329f Merge pull request #73 from mackysoft/fix/remove-directive-2019-3
Remove UNITY_2019_3_OR_NEWER directive
2024-10-26 21:33:19 +09:00
Makihiro 6d39db142a Merge branch 'main' into fix/remove-directive-2019-3 2024-10-26 21:28:35 +09:00
Makihiro 97d028ef2a Remove UNITY_2019_3_OR_NEWER directive 2024-10-26 21:27:40 +09:00
Makihiro 9df6eae13c Merge pull request #67 from bulleador/patch-1
fix: foldout arrow rendered out of the inspector in 2022.3 and newer
2024-10-26 21:10:03 +09:00
Makihiro 8f4e361790 Merge pull request #72 from mackysoft/feature/hide-in-type-menu
Feature/hide in type menu
2024-10-26 20:13:10 +09:00
Makihiro 83b67afcc2 Update package.yaml 2024-10-26 20:06:33 +09:00
Makihiro 4cac61d3ed Add HideInTypeMenu example 2024-10-26 20:02:48 +09:00
Makihiro 6269f7f67a Add TypeMenuUtility.GetTypes method 2024-10-26 20:02:37 +09:00
Makihiro 63d2d94953 Add HideInTypeMenuAttribute 2024-10-26 20:01:51 +09:00
Bullet 71fa059b0c fix: foldout arrow rendered out of the inspector in 2022.3 and newer 2024-09-07 15:29:21 +02:00
Makihiro b7d76fb0c5 Update README.md 2024-08-05 18:49:05 +09:00
github-actions[bot] 69943b46c8 feat: Update package.json to 1.4.0 2024-08-03 16:56:21 +00:00
Makihiro 66fc5ae911 Merge pull request #61 from mackysoft/feature/support-nested-private
SubclassSelector now support nested private type
2024-08-04 01:37:48 +09:00
Makihiro 1757747985 SubclassSelector now support nested private type 2024-08-04 01:37:09 +09:00
github-actions[bot] 69f6e31cf1 feat: Update package.json to 1.3.1 2024-04-01 07:34:45 +00:00
Makihiro 3ffef8d1b2 Update packages 2024-04-01 16:33:44 +09:00
Makihiro a9763b033d Fix foldout layout on Unity 2022.2 or newer 2024-04-01 16:32:53 +09:00
Makihiro 2b40c3d26e Merge pull request #56 from theo-rapidfire/fix/use-type-cache
Performance improvement: Use TypeCache instead of manual type iteration
2024-04-01 16:02:36 +09:00
theo-rapidfire f7c1017567 Use TypeCache instead of manual type iteration
fix/use-type-cache
2024-03-28 13:39:48 +01:00
Makihiro 301cb4b12c Update README.md 2024-02-18 04:00:28 +09:00
Makihiro fe02e0fd1e Update text editor packages 2024-02-18 03:35:49 +09:00
github-actions[bot] 05efde5001 feat: Update package.json to 1.3.0 2024-02-17 18:07:18 +00:00
Makihiro f275c468ec Merge pull request #55 from mackysoft/feature/reset-reference
Implement new instance context menu
2024-02-18 03:06:43 +09:00
Makihiro c141acf129 Rename to ManagedReferenceContextualPropertyMenu 2024-02-18 03:03:53 +09:00
Makihiro fdc0a286c8 Implement new instance menu 2024-02-18 03:02:41 +09:00
Makihiro e5627b1caf Merge pull request #54 from mackysoft/fix/dropdown-overlap
Fix dropdown overlap in Unity 2023.2
2024-02-18 02:51:05 +09:00
Makihiro 5f54c254f3 Fix foldout layout 2024-02-18 02:43:01 +09:00
Makihiro b8c11e7836 Create SerializedPropertyExtensions and move method 2024-02-18 02:39:33 +09:00
Makihiro f656cd0f12 Add GetChildProperties 2024-02-18 02:38:00 +09:00
Makihiro f69bfc6773 optimize null check 2024-02-18 02:35:23 +09:00
22 changed files with 263 additions and 117 deletions
+2 -2
View File
@@ -14,7 +14,7 @@ jobs:
steps: steps:
# Checkout # Checkout
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v2 uses: actions/checkout@v4
with: with:
lfs: true lfs: true
@@ -39,7 +39,7 @@ jobs:
# Upload # Upload
- name: Upload .unitypackage - name: Upload .unitypackage
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v4
with: with:
name: Unity Package name: Unity Package
path: Build path: Build
+4 -4
View File
@@ -18,7 +18,7 @@ jobs:
outputs: outputs:
sha: ${{ steps.commit.outputs.sha }} sha: ${{ steps.commit.outputs.sha }}
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v4
- name: Output package.json (Before) - name: Output package.json (Before)
run: cat ${{ env.TARGET_FILE}} run: cat ${{ env.TARGET_FILE}}
@@ -69,7 +69,7 @@ jobs:
timeout-minutes: 15 timeout-minutes: 15
steps: steps:
- run: echo ${{ needs.update-packagejson.outputs.sha }} - run: echo ${{ needs.update-packagejson.outputs.sha }}
- uses: actions/checkout@v2 - uses: actions/checkout@v4
with: with:
ref: ${{ needs.update-packagejson.outputs.sha }} ref: ${{ needs.update-packagejson.outputs.sha }}
@@ -97,7 +97,7 @@ jobs:
working-directory: . working-directory: .
# Store artifacts. # Store artifacts.
- uses: actions/upload-artifact@v2 - uses: actions/upload-artifact@v4
with: with:
name: SerializeReference-Extensions.unitypackage name: SerializeReference-Extensions.unitypackage
path: ./Build/SerializeReference-Extensions.unitypackage path: ./Build/SerializeReference-Extensions.unitypackage
@@ -119,7 +119,7 @@ jobs:
prerelease: false prerelease: false
# Download(All) Artifacts to current directory # Download(All) Artifacts to current directory
- uses: actions/download-artifact@v2 - uses: actions/download-artifact@v4
# Upload to Releases(unitypackage) # Upload to Releases(unitypackage)
- uses: actions/upload-release-asset@v1 - uses: actions/upload-release-asset@v1
+13 -4
View File
@@ -1,4 +1,3 @@
#if UNITY_2019_3_OR_NEWER
using System.Collections.Generic; using System.Collections.Generic;
using System; using System;
using UnityEditor; using UnityEditor;
@@ -42,6 +41,17 @@ public class Grape : Food
} }
} }
[Serializable]
[HideInTypeMenu]
public class Banana : Food
{
public Banana ()
{
name = "Banana";
kcal = 100f;
}
}
public class Example : MonoBehaviour public class Example : MonoBehaviour
{ {
@@ -60,7 +70,8 @@ public class Example : MonoBehaviour
[SerializeReference, SubclassSelector] [SerializeReference, SubclassSelector]
public Food foodTwo = new Peach(); public Food foodTwo = new Peach();
[SerializeReference, SubclassSelector] // UseToStringAsLabel support on UNITY_2021_3_OR_NEWER
[SerializeReference, SubclassSelector(UseToStringAsLabel = true)]
public Food foodThree = new Grape(); public Food foodThree = new Grape();
[SerializeReference] [SerializeReference]
@@ -116,5 +127,3 @@ public class AppleDrawer : PropertyDrawer
} }
} }
#endif #endif
#endif
@@ -1,5 +1,4 @@
#if UNITY_2019_3_OR_NEWER using System;
using System;
using System.Linq; using System.Linq;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
@@ -138,4 +137,3 @@ namespace MackySoft.SerializeReferenceExtensions.Editor {
} }
} }
#endif
@@ -12,9 +12,7 @@
"overrideReferences": false, "overrideReferences": false,
"precompiledReferences": [], "precompiledReferences": [],
"autoReferenced": true, "autoReferenced": true,
"defineConstraints": [ "defineConstraints": [],
"UNITY_2019_3_OR_NEWER"
],
"versionDefines": [], "versionDefines": [],
"noEngineReferences": false "noEngineReferences": false
} }
@@ -1,17 +1,20 @@
// NOTE: managedReferenceValue getter is available only in Unity 2021.3 or later. // NOTE: managedReferenceValue getter is available only in Unity 2021.3 or later.
#if UNITY_2021_3_OR_NEWER #if UNITY_2021_3_OR_NEWER
using System;
using UnityEditor; using UnityEditor;
using UnityEngine; using UnityEngine;
namespace MackySoft.SerializeReferenceExtensions.Editor namespace MackySoft.SerializeReferenceExtensions.Editor
{ {
public static class CopyAndPasteProperty public static class ManagedReferenceContextualPropertyMenu
{ {
const string kCopiedPropertyPathKey = "SerializeReferenceExtensions.CopiedPropertyPath"; const string kCopiedPropertyPathKey = "SerializeReferenceExtensions.CopiedPropertyPath";
const string kClipboardKey = "SerializeReferenceExtensions.CopyAndPasteProperty"; const string kClipboardKey = "SerializeReferenceExtensions.CopyAndPasteProperty";
static readonly GUIContent kPasteContent = new GUIContent("Paste Property"); static readonly GUIContent kPasteContent = new GUIContent("Paste Property");
static readonly GUIContent kNewInstanceContent = new GUIContent("New Instance");
static readonly GUIContent kResetAndNewInstanceContent = new GUIContent("Reset and New Instance");
[InitializeOnLoadMethod] [InitializeOnLoadMethod]
static void Initialize () static void Initialize ()
@@ -38,6 +41,20 @@ namespace MackySoft.SerializeReferenceExtensions.Editor
{ {
menu.AddDisabledItem(kPasteContent); menu.AddDisabledItem(kPasteContent);
} }
menu.AddSeparator("");
bool hasInstance = clonedProperty.managedReferenceValue != null;
if (hasInstance)
{
menu.AddItem(kNewInstanceContent, false, NewInstance, clonedProperty);
menu.AddItem(kResetAndNewInstanceContent, false, ResetAndNewInstance, clonedProperty);
}
else
{
menu.AddDisabledItem(kNewInstanceContent);
menu.AddDisabledItem(kResetAndNewInstanceContent);
}
} }
} }
@@ -62,6 +79,29 @@ namespace MackySoft.SerializeReferenceExtensions.Editor
JsonUtility.FromJsonOverwrite(json, property.managedReferenceValue); JsonUtility.FromJsonOverwrite(json, property.managedReferenceValue);
property.serializedObject.ApplyModifiedProperties(); property.serializedObject.ApplyModifiedProperties();
} }
static void NewInstance (object customData)
{
SerializedProperty property = (SerializedProperty)customData;
string json = JsonUtility.ToJson(property.managedReferenceValue);
Undo.RecordObject(property.serializedObject.targetObject, "New Instance");
property.managedReferenceValue = JsonUtility.FromJson(json, property.managedReferenceValue.GetType());
property.serializedObject.ApplyModifiedProperties();
Debug.Log($"Create new instance of \"{property.propertyPath}\".");
}
static void ResetAndNewInstance (object customData)
{
SerializedProperty property = (SerializedProperty)customData;
Undo.RecordObject(property.serializedObject.targetObject, "Reset and New Instance");
property.managedReferenceValue = Activator.CreateInstance(property.managedReferenceValue.GetType());
property.serializedObject.ApplyModifiedProperties();
Debug.Log($"Reset property and created new instance of \"{property.propertyPath}\".");
}
} }
} }
#endif #endif
@@ -1,10 +1,11 @@
#if UNITY_2019_3_OR_NEWER using System;
using System;
using System.Reflection; using System.Reflection;
using UnityEditor; using UnityEditor;
using UnityEngine; using UnityEngine;
namespace MackySoft.SerializeReferenceExtensions.Editor { namespace MackySoft.SerializeReferenceExtensions.Editor
{
public static class ManagedReferenceUtility { public static class ManagedReferenceUtility {
public static object SetManagedReference (this SerializedProperty property,Type type) { public static object SetManagedReference (this SerializedProperty property,Type type) {
@@ -12,7 +13,7 @@ namespace MackySoft.SerializeReferenceExtensions.Editor {
#if UNITY_2021_3_OR_NEWER #if UNITY_2021_3_OR_NEWER
// NOTE: managedReferenceValue getter is available only in Unity 2021.3 or later. // NOTE: managedReferenceValue getter is available only in Unity 2021.3 or later.
if (property.managedReferenceValue != null && type != null) if ((type != null) && (property.managedReferenceValue != null))
{ {
// Restore an previous values from json. // Restore an previous values from json.
string json = JsonUtility.ToJson(property.managedReferenceValue); string json = JsonUtility.ToJson(property.managedReferenceValue);
@@ -43,4 +44,3 @@ namespace MackySoft.SerializeReferenceExtensions.Editor {
} }
} }
#endif
@@ -1,5 +1,4 @@
#if UNITY_2019_3_OR_NEWER using System;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEditor; using UnityEditor;
using System.Reflection; using System.Reflection;
@@ -27,9 +26,8 @@ namespace MackySoft.SerializeReferenceExtensions.Editor
{ {
Type[] interfaceTypes = type.GetInterfaces(); Type[] interfaceTypes = type.GetInterfaces();
foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) var types = TypeCache.GetTypesWithAttribute<CustomPropertyDrawer>();
{ foreach (Type drawerType in types)
foreach (Type drawerType in assembly.GetTypes())
{ {
var customPropertyDrawerAttributes = drawerType.GetCustomAttributes(typeof(CustomPropertyDrawer), true); var customPropertyDrawerAttributes = drawerType.GetCustomAttributes(typeof(CustomPropertyDrawer), true);
foreach (CustomPropertyDrawer customPropertyDrawer in customPropertyDrawerAttributes) foreach (CustomPropertyDrawer customPropertyDrawer in customPropertyDrawerAttributes)
@@ -75,10 +73,8 @@ namespace MackySoft.SerializeReferenceExtensions.Editor
} }
} }
} }
}
return null; return null;
} }
} }
} }
#endif
@@ -0,0 +1,29 @@
using System.Collections.Generic;
using UnityEditor;
namespace MackySoft.SerializeReferenceExtensions.Editor
{
public static class SerializedPropertyExtensions
{
public static IEnumerable<SerializedProperty> GetChildProperties (this SerializedProperty parent, int depth = 1)
{
parent = parent.Copy();
int depthOfParent = parent.depth;
var enumerator = parent.GetEnumerator();
while (enumerator.MoveNext())
{
if (enumerator.Current is not SerializedProperty childProperty)
{
continue;
}
if (childProperty.depth > (depthOfParent + depth))
{
continue;
}
yield return childProperty.Copy();
}
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b934aeca38cb7a24cabd6047fe0e298a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,5 +1,4 @@
#if UNITY_2019_3_OR_NEWER using System;
using System;
using System.Linq; using System.Linq;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
@@ -22,7 +21,7 @@ namespace MackySoft.SerializeReferenceExtensions.Editor
} }
const int k_MaxTypePopupLineCount = 13; const int k_MaxTypePopupLineCount = 13;
static readonly Type k_UnityObjectType = typeof(UnityEngine.Object);
static readonly GUIContent k_NullDisplayName = new GUIContent(TypeMenuUtility.k_NullDisplayName); static readonly GUIContent k_NullDisplayName = new GUIContent(TypeMenuUtility.k_NullDisplayName);
static readonly GUIContent k_IsNotManagedReferenceLabel = new GUIContent("The property type is not manage reference."); static readonly GUIContent k_IsNotManagedReferenceLabel = new GUIContent("The property type is not manage reference.");
@@ -31,51 +30,93 @@ namespace MackySoft.SerializeReferenceExtensions.Editor
SerializedProperty m_TargetProperty; SerializedProperty m_TargetProperty;
public override void OnGUI (Rect position,SerializedProperty property,GUIContent label) { public override void OnGUI (Rect position, SerializedProperty property, GUIContent label)
EditorGUI.BeginProperty(position,label,property); {
EditorGUI.BeginProperty(position, label, property);
if (property.propertyType == SerializedPropertyType.ManagedReference) { if (property.propertyType == SerializedPropertyType.ManagedReference)
{
// render label first to avoid label overlap for lists // Render label first to avoid label overlap for lists
Rect foldoutLabelRect = new Rect(position); Rect foldoutLabelRect = new Rect(position);
foldoutLabelRect.height = EditorGUIUtility.singleLineHeight; foldoutLabelRect.height = EditorGUIUtility.singleLineHeight;
foldoutLabelRect.x += EditorGUI.indentLevel * 12; foldoutLabelRect = EditorGUI.IndentedRect(foldoutLabelRect);
Rect popupPosition = EditorGUI.PrefixLabel(foldoutLabelRect, label); Rect popupPosition = EditorGUI.PrefixLabel(foldoutLabelRect, label);
#if UNITY_2021_3_OR_NEWER
// Override the label text with the ToString() of the managed reference.
var subclassSelectorAttribute = (SubclassSelectorAttribute)attribute;
if (subclassSelectorAttribute.UseToStringAsLabel && !property.hasMultipleDifferentValues)
{
object managedReferenceValue = property.managedReferenceValue;
if (managedReferenceValue != null)
{
label.text = managedReferenceValue.ToString();
}
}
#endif
// Draw the subclass selector popup. // Draw the subclass selector popup.
if (EditorGUI.DropdownButton(popupPosition,GetTypeName(property),FocusType.Keyboard)) { if (EditorGUI.DropdownButton(popupPosition, GetTypeName(property), FocusType.Keyboard))
{
TypePopupCache popup = GetTypePopup(property); TypePopupCache popup = GetTypePopup(property);
m_TargetProperty = property; m_TargetProperty = property;
popup.TypePopup.Show(popupPosition); popup.TypePopup.Show(popupPosition);
} }
// Draw the foldout.
if (!string.IsNullOrEmpty(property.managedReferenceFullTypename))
{
Rect foldoutRect = new Rect(position);
foldoutRect.height = EditorGUIUtility.singleLineHeight;
#if UNITY_2022_2
// NOTE: Position x must be adjusted.
// FIXME: Is there a more essential solution...?
foldoutRect.x -= 12;
#endif
property.isExpanded = EditorGUI.Foldout(foldoutRect, property.isExpanded, GUIContent.none, true);
}
// Draw property if expanded.
if (property.isExpanded)
{
using (new EditorGUI.IndentLevelScope())
{
// Check if a custom property drawer exists for this type. // Check if a custom property drawer exists for this type.
PropertyDrawer customDrawer = GetCustomPropertyDrawer(property); PropertyDrawer customDrawer = GetCustomPropertyDrawer(property);
if (customDrawer != null) if (customDrawer != null)
{ {
// Draw the property with custom property drawer. // Draw the property with custom property drawer.
Rect foldoutRect = new Rect(position);
foldoutRect.height = EditorGUIUtility.singleLineHeight;
property.isExpanded = EditorGUI.Foldout(foldoutRect, property.isExpanded, GUIContent.none, true);
if (property.isExpanded)
{
using (new EditorGUI.IndentLevelScope())
{
Rect indentedRect = position; Rect indentedRect = position;
float foldoutDifference = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; float foldoutDifference = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
indentedRect.height = customDrawer.GetPropertyHeight(property, label); indentedRect.height = customDrawer.GetPropertyHeight(property, label);
indentedRect.y += foldoutDifference; indentedRect.y += foldoutDifference;
customDrawer.OnGUI(indentedRect, property, label); customDrawer.OnGUI(indentedRect, property, label);
} }
else
{
// Draw the properties of the child elements.
// NOTE: In the following code, since the foldout layout isn't working properly, I'll iterate through the properties of the child elements myself.
// EditorGUI.PropertyField(position, property, GUIContent.none, true);
Rect childPosition = position;
childPosition.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
foreach (SerializedProperty childProperty in property.GetChildProperties())
{
float height = EditorGUI.GetPropertyHeight(childProperty, new GUIContent(childProperty.displayName, childProperty.tooltip), true);
childPosition.height = height;
EditorGUI.PropertyField(childPosition, childProperty, true);
childPosition.y += height + EditorGUIUtility.standardVerticalSpacing;
}
}
}
} }
} }
else else
{ {
EditorGUI.PropertyField(position, property, GUIContent.none, true); EditorGUI.LabelField(position, label, k_IsNotManagedReferenceLabel);
}
} else {
EditorGUI.LabelField(position,label,k_IsNotManagedReferenceLabel);
} }
EditorGUI.EndProperty(); EditorGUI.EndProperty();
@@ -100,13 +141,7 @@ namespace MackySoft.SerializeReferenceExtensions.Editor
Type baseType = ManagedReferenceUtility.GetType(managedReferenceFieldTypename); Type baseType = ManagedReferenceUtility.GetType(managedReferenceFieldTypename);
var popup = new AdvancedTypePopup( var popup = new AdvancedTypePopup(
TypeCache.GetTypesDerivedFrom(baseType).Append(baseType).Where(p => TypeMenuUtility.GetTypes(baseType),
(p.IsPublic || p.IsNestedPublic) &&
!p.IsAbstract &&
!p.IsGenericType &&
!k_UnityObjectType.IsAssignableFrom(p) &&
Attribute.IsDefined(p,typeof(SerializableAttribute))
),
k_MaxTypePopupLineCount, k_MaxTypePopupLineCount,
state state
); );
@@ -117,7 +152,6 @@ namespace MackySoft.SerializeReferenceExtensions.Editor
foreach (var targetObject in m_TargetProperty.serializedObject.targetObjects) { foreach (var targetObject in m_TargetProperty.serializedObject.targetObjects) {
SerializedObject individualObject = new SerializedObject(targetObject); SerializedObject individualObject = new SerializedObject(targetObject);
SerializedProperty individualProperty = individualObject.FindProperty(m_TargetProperty.propertyPath); SerializedProperty individualProperty = individualObject.FindProperty(m_TargetProperty.propertyPath);
object obj = individualProperty.SetManagedReference(type); object obj = individualProperty.SetManagedReference(type);
individualProperty.isExpanded = (obj != null); individualProperty.isExpanded = (obj != null);
@@ -177,4 +211,3 @@ namespace MackySoft.SerializeReferenceExtensions.Editor
} }
} }
#endif
@@ -1,12 +1,25 @@
#if UNITY_2019_3_OR_NEWER using System;
using System;
using System.Linq; using System.Linq;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEditor;
namespace MackySoft.SerializeReferenceExtensions.Editor { namespace MackySoft.SerializeReferenceExtensions.Editor {
public static class TypeMenuUtility { public static class TypeMenuUtility {
public const string k_NullDisplayName = "<null>"; public const string k_NullDisplayName = "<null>";
static readonly Type k_UnityObjectType = typeof(UnityEngine.Object);
public static IEnumerable<Type> GetTypes (Type baseType)
{
return TypeCache.GetTypesDerivedFrom(baseType).Append(baseType).Where(p =>
(p.IsPublic || p.IsNestedPublic || p.IsNestedPrivate) &&
!p.IsAbstract &&
!p.IsGenericType &&
!k_UnityObjectType.IsAssignableFrom(p) &&
Attribute.IsDefined(p, typeof(SerializableAttribute)) &&
!Attribute.IsDefined(p, typeof(HideInTypeMenuAttribute))
);
}
public static AddTypeMenuAttribute GetAttribute (Type type) { public static AddTypeMenuAttribute GetAttribute (Type type) {
return Attribute.GetCustomAttribute(type,typeof(AddTypeMenuAttribute)) as AddTypeMenuAttribute; return Attribute.GetCustomAttribute(type,typeof(AddTypeMenuAttribute)) as AddTypeMenuAttribute;
@@ -42,4 +55,3 @@ namespace MackySoft.SerializeReferenceExtensions.Editor {
} }
} }
#endif
@@ -1,6 +1,4 @@
#if UNITY_2019_3_OR_NEWER using System;
using System;
/// <summary> /// <summary>
/// An attribute that overrides the name of the type displayed in the SubclassSelector popup. /// An attribute that overrides the name of the type displayed in the SubclassSelector popup.
@@ -35,4 +33,3 @@ public sealed class AddTypeMenuAttribute : Attribute {
} }
} }
#endif
@@ -0,0 +1,9 @@
using System;
/// <summary>
/// An attribute that hides the type in the SubclassSelector.
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Interface, AllowMultiple = false, Inherited = false)]
public sealed class HideInTypeMenuAttribute : Attribute {
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 9f48f5d86a108b94a9c26381f5ce678c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -8,9 +8,7 @@
"overrideReferences": false, "overrideReferences": false,
"precompiledReferences": [], "precompiledReferences": [],
"autoReferenced": true, "autoReferenced": true,
"defineConstraints": [ "defineConstraints": [],
"UNITY_2019_3_OR_NEWER"
],
"versionDefines": [], "versionDefines": [],
"noEngineReferences": false "noEngineReferences": false
} }
@@ -1,12 +1,16 @@
#if UNITY_2019_3_OR_NEWER using System;
using System;
using UnityEngine; using UnityEngine;
/// <summary> /// <summary>
/// Attribute to specify the type of the field serialized by the SerializeReference attribute in the inspector. /// Attribute to specify the type of the field serialized by the SerializeReference attribute in the inspector.
/// </summary> /// </summary>
[AttributeUsage(AttributeTargets.Field,AllowMultiple = false)] [AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
public sealed class SubclassSelectorAttribute : PropertyAttribute { public sealed class SubclassSelectorAttribute : PropertyAttribute
{
#if UNITY_2021_3_OR_NEWER
// NOTE: Use managedReferenceValue getter to invoke instance method in SubclassSelectorDrawer.
public bool UseToStringAsLabel { get; set; }
#endif
} }
#endif
@@ -2,7 +2,7 @@
"name": "com.mackysoft.serializereference-extensions", "name": "com.mackysoft.serializereference-extensions",
"displayName": "SerializeReference Extensions", "displayName": "SerializeReference Extensions",
"author": { "name": "MackySoft", "url": "https://github.com/mackysoft" }, "author": { "name": "MackySoft", "url": "https://github.com/mackysoft" },
"version": "1.2.2", "version": "1.5.0",
"unity": "2021.3", "unity": "2021.3",
"description": "Provide popup to specify the type of the field serialized by the [SerializeReference] attribute in the inspector.", "description": "Provide popup to specify the type of the field serialized by the [SerializeReference] attribute in the inspector.",
"keywords": [ "SerializeReference", "Editor" ], "keywords": [ "SerializeReference", "Editor" ],
+2 -2
View File
@@ -1,7 +1,7 @@
{ {
"dependencies": { "dependencies": {
"com.unity.ide.rider": "3.0.24", "com.unity.ide.rider": "3.0.28",
"com.unity.ide.visualstudio": "2.0.18", "com.unity.ide.visualstudio": "2.0.22",
"com.unity.ide.vscode": "1.2.5", "com.unity.ide.vscode": "1.2.5",
"com.unity.test-framework": "1.1.33", "com.unity.test-framework": "1.1.33",
"com.unity.modules.ai": "1.0.0", "com.unity.modules.ai": "1.0.0",
+2 -2
View File
@@ -8,7 +8,7 @@
"url": "https://packages.unity.com" "url": "https://packages.unity.com"
}, },
"com.unity.ide.rider": { "com.unity.ide.rider": {
"version": "3.0.24", "version": "3.0.28",
"depth": 0, "depth": 0,
"source": "registry", "source": "registry",
"dependencies": { "dependencies": {
@@ -17,7 +17,7 @@
"url": "https://packages.unity.com" "url": "https://packages.unity.com"
}, },
"com.unity.ide.visualstudio": { "com.unity.ide.visualstudio": {
"version": "2.0.18", "version": "2.0.22",
"depth": 0, "depth": 0,
"source": "registry", "source": "registry",
"dependencies": { "dependencies": {
+2 -1
View File
@@ -18,6 +18,7 @@ The `SubclassSelector` attribute allows you to easily set subclasses of those ab
- **[New]** Available `CustomPropertyDrawer` for subclasses. - **[New]** Available `CustomPropertyDrawer` for subclasses.
- **[New]** Restore values of previous object from JSON when subclass is changed. (required Unity 2021.3 or later) - **[New]** Restore values of previous object from JSON when subclass is changed. (required Unity 2021.3 or later)
- **[New]** Copy & Paste the subclass properties. (required Unity 2021.3 or later) - **[New]** Copy & Paste the subclass properties. (required Unity 2021.3 or later)
- **[New]** Clear & reset the subclass properties. (required Unity 2021.3 or later)
> See below for the reason for the limitation of versions less than Unity 2021.3. > See below for the reason for the limitation of versions less than Unity 2021.3.
> >
@@ -138,7 +139,7 @@ public struct StructCommand : ICommand {
The `SubclassSelector` attribute supports types that meet the following conditions. The `SubclassSelector` attribute supports types that meet the following conditions.
- Public - Public or nested private
- Not abstract - Not abstract
- Not generic - Not generic
- Not unity object - Not unity object