using JetBrains.Annotations; using UdonSharp; using UnityEditor; using UnityEngine; using VRC.Udon; namespace UdonSharpEditor { public static class UdonSharpUndo { [PublicAPI] public static void DestroyImmediate(UdonSharpBehaviour behaviour) { UdonBehaviour udonBehaviour = UdonSharpEditorUtility.GetBackingUdonBehaviour(behaviour); if (udonBehaviour) Undo.DestroyObjectImmediate(udonBehaviour); UdonSharpEditorUtility.SetIgnoreEvents(true); try { Undo.DestroyObjectImmediate(behaviour); } finally { UdonSharpEditorUtility.SetIgnoreEvents(false); } } /// /// Adds an UdonSharpBehaviour to the target GameObject and registers an Undo operation for the add /// /// /// /// [PublicAPI] public static UdonSharpBehaviour AddComponent(GameObject gameObject, System.Type type) { if (type == typeof(UdonSharpBehaviour)) throw new System.ArgumentException("Cannot add components of type 'UdonSharpBehaviour', you can only add subclasses of this type"); if (!typeof(UdonSharpBehaviour).IsAssignableFrom(type)) throw new System.ArgumentException("Type for AddUdonSharpComponent must be a subclass of UdonSharpBehaviour"); UdonBehaviour udonBehaviour = Undo.AddComponent(gameObject); UdonSharpProgramAsset programAsset = UdonSharpProgramAsset.GetProgramAssetForClass(type); udonBehaviour.programSource = programAsset; #pragma warning disable CS0618 // Type or member is obsolete udonBehaviour.AllowCollisionOwnershipTransfer = false; #pragma warning restore CS0618 // Type or member is obsolete SerializedObject componentAsset = new SerializedObject(udonBehaviour); SerializedProperty serializedProgramAssetProperty = componentAsset.FindProperty("serializedProgramAsset"); serializedProgramAssetProperty.objectReferenceValue = programAsset.SerializedProgramAsset; componentAsset.ApplyModifiedProperties(); System.Type scriptType = programAsset.GetClass(); UdonSharpBehaviour proxyComponent = (UdonSharpBehaviour)Undo.AddComponent(udonBehaviour.gameObject, scriptType); proxyComponent.hideFlags = HideFlags.DontSaveInBuild | #if !UDONSHARP_DEBUG HideFlags.HideInInspector | #endif HideFlags.DontSaveInEditor; proxyComponent.enabled = false; UdonSharpEditorUtility.SetBackingUdonBehaviour(proxyComponent, udonBehaviour); UdonSharpEditorUtility.CopyUdonToProxy(proxyComponent, ProxySerializationPolicy.AllWithCreateUndo); if (EditorApplication.isPlaying) udonBehaviour.InitializeUdonContent(); return proxyComponent; } /// /// Adds an UdonSharpBehaviour to the target GameObject and registers an Undo operation for the add /// /// /// /// [PublicAPI] public static T AddComponent(GameObject gameObject) where T : UdonSharpBehaviour { return (T)AddComponent(gameObject, typeof(T)); } } }