From fdc0a286c812b3271d16b835cd8568b6960b7d3b Mon Sep 17 00:00:00 2001 From: Makihiro Date: Sun, 18 Feb 2024 03:02:41 +0900 Subject: [PATCH 1/2] Implement new instance menu --- .../Editor/CopyAndPasteProperty.cs | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Editor/CopyAndPasteProperty.cs b/Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Editor/CopyAndPasteProperty.cs index 9b6c8b8..b6d56b9 100644 --- a/Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Editor/CopyAndPasteProperty.cs +++ b/Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Editor/CopyAndPasteProperty.cs @@ -1,5 +1,6 @@ // NOTE: managedReferenceValue getter is available only in Unity 2021.3 or later. #if UNITY_2021_3_OR_NEWER +using System; using UnityEditor; using UnityEngine; @@ -12,6 +13,8 @@ namespace MackySoft.SerializeReferenceExtensions.Editor const string kClipboardKey = "SerializeReferenceExtensions.CopyAndPasteProperty"; 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] static void Initialize () @@ -38,6 +41,20 @@ namespace MackySoft.SerializeReferenceExtensions.Editor { 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); 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 \ No newline at end of file From c141acf1291e0401678298c2a003157b085ce36c Mon Sep 17 00:00:00 2001 From: Makihiro Date: Sun, 18 Feb 2024 03:03:53 +0900 Subject: [PATCH 2/2] Rename to ManagedReferenceContextualPropertyMenu --- ...steProperty.cs => ManagedReferenceContextualPropertyMenu.cs} | 2 +- ...y.cs.meta => ManagedReferenceContextualPropertyMenu.cs.meta} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Editor/{CopyAndPasteProperty.cs => ManagedReferenceContextualPropertyMenu.cs} (98%) rename Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Editor/{CopyAndPasteProperty.cs.meta => ManagedReferenceContextualPropertyMenu.cs.meta} (100%) diff --git a/Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Editor/CopyAndPasteProperty.cs b/Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Editor/ManagedReferenceContextualPropertyMenu.cs similarity index 98% rename from Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Editor/CopyAndPasteProperty.cs rename to Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Editor/ManagedReferenceContextualPropertyMenu.cs index b6d56b9..837f1c3 100644 --- a/Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Editor/CopyAndPasteProperty.cs +++ b/Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Editor/ManagedReferenceContextualPropertyMenu.cs @@ -6,7 +6,7 @@ using UnityEngine; namespace MackySoft.SerializeReferenceExtensions.Editor { - public static class CopyAndPasteProperty + public static class ManagedReferenceContextualPropertyMenu { const string kCopiedPropertyPathKey = "SerializeReferenceExtensions.CopiedPropertyPath"; diff --git a/Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Editor/CopyAndPasteProperty.cs.meta b/Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Editor/ManagedReferenceContextualPropertyMenu.cs.meta similarity index 100% rename from Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Editor/CopyAndPasteProperty.cs.meta rename to Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Editor/ManagedReferenceContextualPropertyMenu.cs.meta