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