diff --git a/Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Editor/CopyAndPasteProperty.cs b/Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Editor/CopyAndPasteProperty.cs new file mode 100644 index 0000000..1911fae --- /dev/null +++ b/Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Editor/CopyAndPasteProperty.cs @@ -0,0 +1,66 @@ +#if UNITY_2019_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 \ No newline at end of file diff --git a/Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Editor/CopyAndPasteProperty.cs.meta b/Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Editor/CopyAndPasteProperty.cs.meta new file mode 100644 index 0000000..2f75340 --- /dev/null +++ b/Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Editor/CopyAndPasteProperty.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 734d3eb8da4785b49919aea6db62d877 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: