Compare commits

..

1 Commits

Author SHA1 Message Date
Makihiro a78f5a340f UIToolKit test 2024-08-03 23:33:05 +09:00
18 changed files with 139 additions and 87 deletions
+2 -2
View File
@@ -14,7 +14,7 @@ jobs:
steps: steps:
# Checkout # Checkout
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v2
with: with:
lfs: true lfs: true
@@ -39,7 +39,7 @@ jobs:
# Upload # Upload
- name: Upload .unitypackage - name: Upload .unitypackage
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v2
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@v4 - uses: actions/checkout@v2
- 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@v4 - uses: actions/checkout@v2
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@v4 - uses: actions/upload-artifact@v2
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@v4 - uses: actions/download-artifact@v2
# Upload to Releases(unitypackage) # Upload to Releases(unitypackage)
- uses: actions/upload-release-asset@v1 - uses: actions/upload-release-asset@v1
+4 -13
View File
@@ -1,3 +1,4 @@
#if UNITY_2019_3_OR_NEWER
using System.Collections.Generic; using System.Collections.Generic;
using System; using System;
using UnityEditor; using UnityEditor;
@@ -41,17 +42,6 @@ public class Grape : Food
} }
} }
[Serializable]
[HideInTypeMenu]
public class Banana : Food
{
public Banana ()
{
name = "Banana";
kcal = 100f;
}
}
public class Example : MonoBehaviour public class Example : MonoBehaviour
{ {
@@ -70,8 +60,7 @@ public class Example : MonoBehaviour
[SerializeReference, SubclassSelector] [SerializeReference, SubclassSelector]
public Food foodTwo = new Peach(); public Food foodTwo = new Peach();
// UseToStringAsLabel support on UNITY_2021_3_OR_NEWER [SerializeReference, SubclassSelector]
[SerializeReference, SubclassSelector(UseToStringAsLabel = true)]
public Food foodThree = new Grape(); public Food foodThree = new Grape();
[SerializeReference] [SerializeReference]
@@ -127,3 +116,5 @@ public class AppleDrawer : PropertyDrawer
} }
} }
#endif #endif
#endif
@@ -1,4 +1,5 @@
using System; #if UNITY_2019_3_OR_NEWER
using System;
using System.Linq; using System.Linq;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
@@ -137,3 +138,4 @@ namespace MackySoft.SerializeReferenceExtensions.Editor {
} }
} }
#endif
@@ -12,7 +12,9 @@
"overrideReferences": false, "overrideReferences": false,
"precompiledReferences": [], "precompiledReferences": [],
"autoReferenced": true, "autoReferenced": true,
"defineConstraints": [], "defineConstraints": [
"UNITY_2019_3_OR_NEWER"
],
"versionDefines": [], "versionDefines": [],
"noEngineReferences": false "noEngineReferences": false
} }
@@ -1,4 +1,5 @@
using System; #if UNITY_2019_3_OR_NEWER
using System;
using System.Reflection; using System.Reflection;
using UnityEditor; using UnityEditor;
using UnityEngine; using UnityEngine;
@@ -44,3 +45,4 @@ namespace MackySoft.SerializeReferenceExtensions.Editor
} }
} }
#endif
@@ -1,4 +1,5 @@
using System; #if UNITY_2019_3_OR_NEWER
using System;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEditor; using UnityEditor;
using System.Reflection; using System.Reflection;
@@ -78,3 +79,4 @@ namespace MackySoft.SerializeReferenceExtensions.Editor
} }
} }
#endif
@@ -1,4 +1,5 @@
using System.Collections.Generic; #if UNITY_2019_3_OR_NEWER
using System.Collections.Generic;
using UnityEditor; using UnityEditor;
namespace MackySoft.SerializeReferenceExtensions.Editor namespace MackySoft.SerializeReferenceExtensions.Editor
@@ -27,3 +28,4 @@ namespace MackySoft.SerializeReferenceExtensions.Editor
} }
} }
} }
#endif
@@ -1,9 +1,12 @@
using System; #if UNITY_2019_3_OR_NEWER
using System;
using System.Linq; using System.Linq;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
using UnityEditor; using UnityEditor;
using UnityEditor.IMGUI.Controls; using UnityEditor.IMGUI.Controls;
using UnityEngine.UIElements;
using UnityEditor.UIElements;
namespace MackySoft.SerializeReferenceExtensions.Editor namespace MackySoft.SerializeReferenceExtensions.Editor
{ {
@@ -21,7 +24,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.");
@@ -42,19 +45,6 @@ namespace MackySoft.SerializeReferenceExtensions.Editor
foldoutLabelRect = EditorGUI.IndentedRect(foldoutLabelRect); 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))
{ {
@@ -69,7 +59,7 @@ namespace MackySoft.SerializeReferenceExtensions.Editor
Rect foldoutRect = new Rect(position); Rect foldoutRect = new Rect(position);
foldoutRect.height = EditorGUIUtility.singleLineHeight; foldoutRect.height = EditorGUIUtility.singleLineHeight;
#if UNITY_2022_2 #if UNITY_2022_2_OR_NEWER
// NOTE: Position x must be adjusted. // NOTE: Position x must be adjusted.
// FIXME: Is there a more essential solution...? // FIXME: Is there a more essential solution...?
foldoutRect.x -= 12; foldoutRect.x -= 12;
@@ -122,6 +112,21 @@ namespace MackySoft.SerializeReferenceExtensions.Editor
EditorGUI.EndProperty(); EditorGUI.EndProperty();
} }
public override VisualElement CreatePropertyGUI (SerializedProperty property)
{
VisualElement root = new VisualElement();
if (property.propertyType == SerializedPropertyType.ManagedReference)
{
TypePopupField typePopupField = new TypePopupField(property, new VisualElement());
root.Add(typePopupField);
}
else
{
return new Label(k_IsNotManagedReferenceLabel.text);
}
return root;
}
PropertyDrawer GetCustomPropertyDrawer (SerializedProperty property) PropertyDrawer GetCustomPropertyDrawer (SerializedProperty property)
{ {
Type propertyType = ManagedReferenceUtility.GetType(property.managedReferenceFullTypename); Type propertyType = ManagedReferenceUtility.GetType(property.managedReferenceFullTypename);
@@ -141,7 +146,13 @@ namespace MackySoft.SerializeReferenceExtensions.Editor
Type baseType = ManagedReferenceUtility.GetType(managedReferenceFieldTypename); Type baseType = ManagedReferenceUtility.GetType(managedReferenceFieldTypename);
var popup = new AdvancedTypePopup( var popup = new AdvancedTypePopup(
TypeMenuUtility.GetTypes(baseType), TypeCache.GetTypesDerivedFrom(baseType).Append(baseType).Where(p =>
(p.IsPublic || p.IsNestedPublic) &&
!p.IsAbstract &&
!p.IsGenericType &&
!k_UnityObjectType.IsAssignableFrom(p) &&
Attribute.IsDefined(p,typeof(SerializableAttribute))
),
k_MaxTypePopupLineCount, k_MaxTypePopupLineCount,
state state
); );
@@ -211,3 +222,4 @@ namespace MackySoft.SerializeReferenceExtensions.Editor
} }
} }
#endif
@@ -1,25 +1,12 @@
using System; #if UNITY_2019_3_OR_NEWER
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;
@@ -55,3 +42,4 @@ namespace MackySoft.SerializeReferenceExtensions.Editor {
} }
} }
#endif
@@ -0,0 +1,59 @@
#if UNITY_2019_3_OR_NEWER
using UnityEditor;
using UnityEngine.UIElements;
namespace MackySoft.SerializeReferenceExtensions.Editor
{
public sealed class TypePopupField : BaseField<object>
{
public new static readonly string ussClassName = "unity-base-popup-field";
public static readonly string textUssClassName = ussClassName + "__text";
public static readonly string arrowUssClassName = ussClassName + "__arrow";
public new static readonly string labelUssClassName = ussClassName + "__label";
public new static readonly string inputUssClassName = ussClassName + "__input";
readonly SerializedProperty m_Property;
readonly Toggle m_Toggle;
readonly VisualElement m_ArrowElement;
readonly Label m_TextElement;
public TypePopupField (SerializedProperty property, VisualElement visualInput) : base(property.displayName, visualInput)
{
m_Property = property;
style.flexDirection = FlexDirection.Row;
style.flexShrink = 0;
style.flexGrow = 1;
AddToClassList(ussClassName);
AddToClassList("unity-base-field__aligned");
AddToClassList("unity-base-field__inspector-field");
labelElement.AddToClassList(labelUssClassName);
labelElement.AddToClassList("unity-popup-field__label");
labelElement.AddToClassList("unity-property-field__label");
m_TextElement = new Label(property.displayName)
{
pickingMode = PickingMode.Ignore
};
m_TextElement.AddToClassList(textUssClassName);
visualInput.AddToClassList(inputUssClassName);
visualInput.Add(m_TextElement);
visualInput.pickingMode = PickingMode.Ignore;
m_ArrowElement = new VisualElement();
m_ArrowElement.AddToClassList(arrowUssClassName);
m_ArrowElement.pickingMode = PickingMode.Ignore;
visualInput.Add(m_ArrowElement);
}
}
}
#endif
@@ -1,5 +1,5 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: 9f48f5d86a108b94a9c26381f5ce678c guid: ad665a39f1251a14ea9f40c0c9cf3a75
MonoImporter: MonoImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 serializedVersion: 2
@@ -1,4 +1,6 @@
using System; #if UNITY_2019_3_OR_NEWER
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.
@@ -33,3 +35,4 @@ public sealed class AddTypeMenuAttribute : Attribute {
} }
} }
#endif
@@ -1,9 +0,0 @@
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 {
}
@@ -8,7 +8,9 @@
"overrideReferences": false, "overrideReferences": false,
"precompiledReferences": [], "precompiledReferences": [],
"autoReferenced": true, "autoReferenced": true,
"defineConstraints": [], "defineConstraints": [
"UNITY_2019_3_OR_NEWER"
],
"versionDefines": [], "versionDefines": [],
"noEngineReferences": false "noEngineReferences": false
} }
@@ -1,16 +1,12 @@
using System; #if UNITY_2019_3_OR_NEWER
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.5.0", "version": "1.3.1",
"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" ],
+1 -1
View File
@@ -139,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 or nested private - Public
- Not abstract - Not abstract
- Not generic - Not generic
- Not unity object - Not unity object