using System; using UnityEditor; namespace Unity.Pipeline.Editor.Authoring { /// /// /// Groups all Undo operations registered during its lifetime into a single, collapsible Editor /// Undo step, so a multi-step agent action reverts as one. Register mutations inside the scope /// with Undo.RegisterCreatedObjectUndo / RegisterCompleteObjectUndo / etc. /// /// /// /// using (new AuthoringUndoScope("Create Enemy")) /// { /// var go = new GameObject("Enemy"); /// Undo.RegisterCreatedObjectUndo(go, "Create Enemy"); /// // ... further registered mutations collapse into the same step /// } /// /// /// /// NOTE: minimal seed for the shared safety policy (CAT-2509). AssetDatabase operations /// (folder/asset creation, import) are NOT part of Unity's Undo system, so this scope only /// affects scene/object mutations. /// /// public sealed class AuthoringUndoScope : IDisposable { private readonly int m_Group; private bool m_Canceled; /// Start a new collapsible Undo group. /// Name shown for the collapsed Undo step. public AuthoringUndoScope(string name) { Undo.IncrementCurrentGroup(); m_Group = Undo.GetCurrentGroup(); if (!string.IsNullOrEmpty(name)) Undo.SetCurrentGroupName(name); } /// /// Skip the collapse on dispose. Call after the scope's registered operations have been /// reverted wholesale (e.g. Undo.RevertAllDownToGroup(group) on a transactional batch /// abort): the group id no longer refers to this scope's operations on the Undo stack, and /// collapsing a discarded id could fold whatever now sits at that index into a stray group. /// public void Cancel() => m_Canceled = true; /// Collapse all Undo operations registered during this scope into one step, unless was called. public void Dispose() { if (!m_Canceled) Undo.CollapseUndoOperations(m_Group); } } }