diff --git a/MCPForUnity/Editor/Tools/GameObjects/GameObjectDelete.cs b/MCPForUnity/Editor/Tools/GameObjects/GameObjectDelete.cs index 74382ef49..74d573ab8 100644 --- a/MCPForUnity/Editor/Tools/GameObjects/GameObjectDelete.cs +++ b/MCPForUnity/Editor/Tools/GameObjects/GameObjectDelete.cs @@ -26,10 +26,7 @@ internal static object Handle(JToken targetToken, string searchMethod) { string goName = targetGo.name; int goId = targetGo.GetInstanceIDCompat(); - // Note: Undo.DestroyObjectImmediate doesn't work reliably in test context, - // so we use Object.DestroyImmediate. This means delete isn't undoable. - // TODO: Investigate Undo.DestroyObjectImmediate behavior in Unity 2022+ - Object.DestroyImmediate(targetGo); + Undo.DestroyObjectImmediate(targetGo); deletedObjects.Add(new { name = goName, instanceID = goId }); } } diff --git a/TestProjects/UnityMCPTests/Assets/Tests/EditMode/Tools/ManageGameObjectDeleteTests.cs b/TestProjects/UnityMCPTests/Assets/Tests/EditMode/Tools/ManageGameObjectDeleteTests.cs index f3afc7d35..e3e03655b 100644 --- a/TestProjects/UnityMCPTests/Assets/Tests/EditMode/Tools/ManageGameObjectDeleteTests.cs +++ b/TestProjects/UnityMCPTests/Assets/Tests/EditMode/Tools/ManageGameObjectDeleteTests.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using NUnit.Framework; +using UnityEditor; using UnityEngine; using Newtonsoft.Json.Linq; using MCPForUnity.Editor.Tools.GameObjects; @@ -375,6 +376,35 @@ public void Delete_MultipleObjectsSameName_DeletesCorrectly() } #endregion + + #region Undo Tests + + [Test] + public void Delete_RegistersUndo_RestoresOnUndo() + { + var target = CreateTestObject("UndoRoundtrip"); + + var p = new JObject + { + ["action"] = "delete", + ["target"] = "UndoRoundtrip", + ["searchMethod"] = "by_name" + }; + + var result = ManageGameObject.HandleCommand(p); + var resultObj = result as JObject ?? JObject.FromObject(result); + Assert.IsTrue(resultObj.Value("success"), resultObj.ToString()); + Assert.IsNull(GameObject.Find("UndoRoundtrip"), "Object should be deleted before undo"); + testObjects.Remove(target); + + Undo.PerformUndo(); + + var restored = GameObject.Find("UndoRoundtrip"); + Assert.IsNotNull(restored, "Undo should restore deleted GameObject"); + testObjects.Add(restored); + } + + #endregion } }