Compare commits

...

26 Commits

Author SHA1 Message Date
github-actions[bot] 7f424c0f97 feat: Update package.json to 1.2.2 2024-02-16 12:59:32 +00:00
Makihiro 2934eea84e Merge pull request #52 from mackysoft/fix/nullreference-when-fromjson
Fixed a bug when trying to deserialize a null type with FromJson.
2024-02-16 21:58:54 +09:00
Makihiro f781ad7373 Fixed a bug when trying to deserialize a null type with FromJson. 2024-02-16 21:58:38 +09:00
Makihiro e5a5157b3c Merge pull request #48 from JohannesDeml/bugfix/propertydrawer-allow-inheritance
Add logic to check for inherited PropertyDrawers from base classes and interfaces
2024-02-16 20:53:46 +09:00
Makihiro 69830f3583 Merge pull request #49 from JohannesDeml/bugfix/avoid-label-overlap
Fix label overlapping button
2024-02-16 20:50:55 +09:00
Johannes Deml c9b5193e51 Fix use prefixLabel position right away 2024-02-07 19:31:33 +01:00
Johannes Deml a8bcece352 Fix label overlapping button
By drawing the label first we avoid the overlap. By drawing just the label without the foldout we need to work around a unity problem with indentation and apply that ourselves. The foldout property will then be rendered without gui content
2024-01-17 14:40:52 +01:00
Johannes Deml 70f2cdaf16 Add logic to check for inherited PropertyDrawers from base classes and interfaces
This way an inherited drawer will be used if it exists, which might not be too uncommon in the case of SerializeReference fields
2024-01-17 13:27:49 +01:00
Makihiro 97c4e632bc Update README.md 2024-01-10 16:09:00 +09:00
github-actions[bot] 93d7e13f62 feat: Update package.json to 1.2.1 2024-01-10 07:02:25 +00:00
Makihiro f522e0f285 Merge pull request #47 from mackysoft/fix/compatibility-less-than-2021-3
Fix compatibility for less than Unity 2021.3
2024-01-10 16:01:46 +09:00
Makihiro d061f748b8 Fix compatibility for less than Unity 2021.3 2024-01-10 15:58:31 +09:00
Makihiro afb3089943 Update README.md 2023-12-31 18:56:57 +09:00
github-actions[bot] d2d5c8ed52 feat: Update package.json to 1.2.0 2023-12-31 09:27:46 +00:00
Makihiro 2455229944 Update release.yaml 2023-12-31 18:27:09 +09:00
Makihiro 6ae47efa1d Update package.json 2023-12-31 18:24:42 +09:00
Makihiro 343d930155 Merge pull request #42 from mackysoft/feature/copy-paste-property
Implement copy and paste property
2023-12-31 17:44:18 +09:00
Makihiro 1e52b89dd2 Merge pull request #43 from mackysoft/update-release-workflow
Update release.yaml
2023-12-31 17:44:04 +09:00
Makihiro ba83546f0a Update release.yaml 2023-12-31 17:43:53 +09:00
Makihiro 15a627bd48 Add CopyAndPasteProperty 2023-12-31 17:39:48 +09:00
Makihiro e6f57ed763 Merge pull request #41 from mackysoft/feature/new-object-from-json
Restore values from json on create new managed reference
2023-12-31 16:59:03 +09:00
Makihiro 59da3868b1 Update package.yaml 2023-12-31 16:55:44 +09:00
Makihiro 65b0076c95 Update package.yaml 2023-12-31 16:46:11 +09:00
Makihiro 360c800b25 Revert "Update Unity to 2021.3.32f1"
This reverts commit 5d43ced8cc.
2023-12-31 16:03:32 +09:00
Makihiro cdbc2daf21 Restore values from json on create new managed reference 2023-12-31 16:00:13 +09:00
Makihiro 5d43ced8cc Update Unity to 2021.3.32f1 2023-12-31 15:47:43 +09:00
9 changed files with 178 additions and 25 deletions
+6 -2
View File
@@ -28,9 +28,13 @@ jobs:
# Build # Build
- name: Build .unitypackage - name: Build .unitypackage
uses: game-ci/unity-builder@v2 uses: game-ci/unity-builder@v4
env:
UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
with: with:
unityVersion: 2020.3.8f1 unityVersion: 2021.3.29f1
buildMethod: MackySoft.PackageTools.Editor.UnityPackageExporter.Export buildMethod: MackySoft.PackageTools.Editor.UnityPackageExporter.Export
# Upload # Upload
+7 -5
View File
@@ -61,10 +61,10 @@ jobs:
needs: [update-packagejson] needs: [update-packagejson]
strategy: strategy:
matrix: matrix:
unity: ["2020.3.8f1"] unity: ["2021.3.29f1"]
include: include:
- unityVersion: 2020.3.8f1 - unityVersion: 2021.3.29f1
license: UNITY_LICENSE_2020 license: UNITY_LICENSE
runs-on: ubuntu-latest runs-on: ubuntu-latest
timeout-minutes: 15 timeout-minutes: 15
steps: steps:
@@ -74,9 +74,11 @@ jobs:
ref: ${{ needs.update-packagejson.outputs.sha }} ref: ${{ needs.update-packagejson.outputs.sha }}
- name: Export unitypackage - name: Export unitypackage
uses: game-ci/unity-builder@v2 uses: game-ci/unity-builder@v4
env: env:
UNITY_LICENSE: ${{ secrets[matrix.license] }} UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
with: with:
projectPath: . projectPath: .
unityVersion: ${{ matrix.unityVersion }} unityVersion: ${{ matrix.unityVersion }}
@@ -0,0 +1,67 @@
// NOTE: managedReferenceValue getter is available only in Unity 2021.3 or later.
#if UNITY_2021_3_OR_NEWER
using UnityEditor;
using UnityEngine;
namespace MackySoft.SerializeReferenceExtensions.Editor
{
public static class CopyAndPasteProperty
{
const string kCopiedPropertyPathKey = "SerializeReferenceExtensions.CopiedPropertyPath";
const string kClipboardKey = "SerializeReferenceExtensions.CopyAndPasteProperty";
static readonly GUIContent kPasteContent = new GUIContent("Paste Property");
[InitializeOnLoadMethod]
static void Initialize ()
{
EditorApplication.contextualPropertyMenu += OnContextualPropertyMenu;
}
static void OnContextualPropertyMenu (GenericMenu menu, SerializedProperty property)
{
if (property.propertyType == SerializedPropertyType.ManagedReference)
{
// NOTE: When the callback function is called, the SerializedProperty is rewritten to the property that was being moused over at the time,
// so a new SerializedProperty instance must be created.
SerializedProperty clonedProperty = property.Copy();
menu.AddItem(new GUIContent($"Copy \"{property.propertyPath}\" property"), false, Copy, clonedProperty);
string copiedPropertyPath = SessionState.GetString(kCopiedPropertyPathKey, string.Empty);
if (!string.IsNullOrEmpty(copiedPropertyPath))
{
menu.AddItem(new GUIContent($"Paste \"{copiedPropertyPath}\" property"), false, Paste, clonedProperty);
}
else
{
menu.AddDisabledItem(kPasteContent);
}
}
}
static void Copy (object customData)
{
SerializedProperty property = (SerializedProperty)customData;
string json = JsonUtility.ToJson(property.managedReferenceValue);
SessionState.SetString(kCopiedPropertyPathKey, property.propertyPath);
SessionState.SetString(kClipboardKey, json);
}
static void Paste (object customData)
{
SerializedProperty property = (SerializedProperty)customData;
string json = SessionState.GetString(kClipboardKey, string.Empty);
if (string.IsNullOrEmpty(json))
{
return;
}
Undo.RecordObject(property.serializedObject.targetObject, "Paste Property");
JsonUtility.FromJsonOverwrite(json, property.managedReferenceValue);
property.serializedObject.ApplyModifiedProperties();
}
}
}
#endif
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 734d3eb8da4785b49919aea6db62d877
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -2,14 +2,32 @@
using System; using System;
using System.Reflection; using System.Reflection;
using UnityEditor; using UnityEditor;
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) {
object obj = (type != null) ? Activator.CreateInstance(type) : null; object result = null;
property.managedReferenceValue = obj;
return obj; #if UNITY_2021_3_OR_NEWER
// NOTE: managedReferenceValue getter is available only in Unity 2021.3 or later.
if (property.managedReferenceValue != null && type != null)
{
// Restore an previous values from json.
string json = JsonUtility.ToJson(property.managedReferenceValue);
result = JsonUtility.FromJson(json, type);
}
#endif
if (result == null)
{
result = (type != null) ? Activator.CreateInstance(type) : null;
}
property.managedReferenceValue = result;
return result;
} }
public static Type GetType (string typeName) { public static Type GetType (string typeName) {
@@ -25,6 +25,8 @@ namespace MackySoft.SerializeReferenceExtensions.Editor
static Type GetCustomPropertyDrawerType (Type type) static Type GetCustomPropertyDrawerType (Type type)
{ {
Type[] interfaceTypes = type.GetInterfaces();
foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{ {
foreach (Type drawerType in assembly.GetTypes()) foreach (Type drawerType in assembly.GetTypes())
@@ -36,9 +38,39 @@ namespace MackySoft.SerializeReferenceExtensions.Editor
if (field != null) if (field != null)
{ {
var fieldType = field.GetValue(customPropertyDrawer) as Type; var fieldType = field.GetValue(customPropertyDrawer) as Type;
if (fieldType != null && fieldType == type) if (fieldType != null)
{ {
return drawerType; if (fieldType == type)
{
return drawerType;
}
// If the property drawer also allows for being applied to child classes, check if they match
var useForChildrenField = customPropertyDrawer.GetType().GetField("m_UseForChildren", BindingFlags.NonPublic | BindingFlags.Instance);
if (useForChildrenField != null)
{
object useForChildrenValue = useForChildrenField.GetValue(customPropertyDrawer);
if (useForChildrenValue is bool && (bool)useForChildrenValue)
{
// Check interfaces
if (Array.Exists(interfaceTypes, interfaceType => interfaceType == fieldType))
{
return drawerType;
}
// Check derived types
Type baseType = type.BaseType;
while (baseType != null)
{
if (baseType == fieldType)
{
return drawerType;
}
baseType = baseType.BaseType;
}
}
}
} }
} }
} }
@@ -35,12 +35,14 @@ namespace MackySoft.SerializeReferenceExtensions.Editor
EditorGUI.BeginProperty(position,label,property); EditorGUI.BeginProperty(position,label,property);
if (property.propertyType == SerializedPropertyType.ManagedReference) { if (property.propertyType == SerializedPropertyType.ManagedReference) {
// Draw the subclass selector popup.
Rect popupPosition = new Rect(position);
popupPosition.width -= EditorGUIUtility.labelWidth;
popupPosition.x += EditorGUIUtility.labelWidth;
popupPosition.height = EditorGUIUtility.singleLineHeight;
// render label first to avoid label overlap for lists
Rect foldoutLabelRect = new Rect(position);
foldoutLabelRect.height = EditorGUIUtility.singleLineHeight;
foldoutLabelRect.x += EditorGUI.indentLevel * 12;
Rect popupPosition = EditorGUI.PrefixLabel(foldoutLabelRect, label);
// 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;
@@ -54,7 +56,7 @@ namespace MackySoft.SerializeReferenceExtensions.Editor
// Draw the property with custom property drawer. // Draw the property with custom property drawer.
Rect foldoutRect = new Rect(position); Rect foldoutRect = new Rect(position);
foldoutRect.height = EditorGUIUtility.singleLineHeight; foldoutRect.height = EditorGUIUtility.singleLineHeight;
property.isExpanded = EditorGUI.Foldout(foldoutRect, property.isExpanded, label, true); property.isExpanded = EditorGUI.Foldout(foldoutRect, property.isExpanded, GUIContent.none, true);
if (property.isExpanded) if (property.isExpanded)
{ {
@@ -70,7 +72,7 @@ namespace MackySoft.SerializeReferenceExtensions.Editor
} }
else else
{ {
EditorGUI.PropertyField(position, property, label, true); EditorGUI.PropertyField(position, property, GUIContent.none, true);
} }
} else { } else {
EditorGUI.LabelField(position,label,k_IsNotManagedReferenceLabel); EditorGUI.LabelField(position,label,k_IsNotManagedReferenceLabel);
@@ -1,8 +1,9 @@
{ {
"name": "com.mackysoft.serializereference-extensions", "name": "com.mackysoft.serializereference-extensions",
"displayName": "SerializeReference Extensions", "displayName": "SerializeReference Extensions",
"version": "1.1.9", "author": { "name": "MackySoft", "url": "https://github.com/mackysoft" },
"unity": "2019.4", "version": "1.2.2",
"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" ],
"license": "MIT", "license": "MIT",
+17 -1
View File
@@ -15,9 +15,18 @@ The `SubclassSelector` attribute allows you to easily set subclasses of those ab
- Easily set subclass by popup. - Easily set subclass by popup.
- **[New]** Type finding by fuzzy finder. - **[New]** Type finding by fuzzy finder.
- **[New]** Override the type name and path by the `AddTypeMenu` attribute. - **[New]** Override the type name and path by the `AddTypeMenu` attribute.
- **[New]** Available `CustomPropertyDrawer` for subclasses.
- **[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)
> See below for the reason for the limitation of versions less than Unity 2021.3.
>
> https://blog.unity.com/engine-platform/serializereference-improvements-in-unity-2021-lts
## 📥 Installation ## 📥 Installation
#### Install via `.unitypackage`
Download any version from releases. Download any version from releases.
Releases: https://github.com/mackysoft/Unity-SerializeReferenceExtensions/releases Releases: https://github.com/mackysoft/Unity-SerializeReferenceExtensions/releases
@@ -26,10 +35,17 @@ Releases: https://github.com/mackysoft/Unity-SerializeReferenceExtensions/releas
Or, you can add this package by opening PackageManager and entering Or, you can add this package by opening PackageManager and entering
`https://github.com/mackysoft/Unity-SerializeReferenceExtensions.git?path=Assets/MackySoft/MackySoft.SerializeReferenceExtensions` ```
https://github.com/mackysoft/Unity-SerializeReferenceExtensions.git?path=Assets/MackySoft/MackySoft.SerializeReferenceExtensions
```
from the `Add package from git URL` option. from the `Add package from git URL` option.
If you are specifying a version, enter `#{VERSION}` at the end, as shown below.
```
https://github.com/mackysoft/Unity-SerializeReferenceExtensions.git?path=Assets/MackySoft/MackySoft.SerializeReferenceExtensions#1.1.9
```
#### Install via Open UPM #### Install via Open UPM