objectToUndo | 新创建的对象。执行撤消操作时,此对象将被销毁。当值为 GameObject 时,Unity 会注册 GameObject 及其子 GameObject,但不会注册同级或父 GameObject。 |
name | 要撤消的操作名称。使用此字符串提供要撤消的操作的简短描述。对于编辑菜单中的撤消或重做项,Unity 会将“撤消”或“重做”添加到您提供的字符串中。例如,如果您提供字符串“创建游戏对象”,则 Unity 编辑器会显示菜单项编辑 > 撤消创建游戏对象。 |
注册撤消创建对象的操作。
此方法将对象的创建注册到撤消堆栈,以便用户可以撤消创建对象的操作。每次定义创建对象的动作时使用此方法,例如,在自定义编辑器或菜单项中。Unity 使用撤消操作的名称更新编辑菜单中的撤消操作。当用户执行撤消操作时,Unity 会销毁该对象。
注意:撤消过程以与Object.Destroy相同的方式销毁对象,但没有延迟。
当您同时创建和修改对象时,请使用以下工作流程以确保Undo.RegisterCreatedObjectUndo保存对对象的所有更新
Undo.RegisterCreatedObjectUndo
注册已创建的对象。如果您不遵循此工作流程,Undo.RegisterCreatedObjectUndo
可能不会保存对对象的任何更新,除了对象创建之外。
当您使用Undo.RegisterCreatedObjectUndo
注册新对象时,Unity 会注册对当前由Undo.RecordObject记录的对象的任何更改,然后停止记录。这意味着在您注册新对象后,Unity 不会记录对Undo.RecordObject
之前已在记录的任何其他对象的任何后续更改。
当 Unity 已经使用Undo.RecordObject
记录对现有对象的更改,并且您想要注册新创建的对象时,最佳做法是遵循此工作流程
Undo.RecordObject
正在记录的对象进行的任何更改。Unity 会自动调用Undo.FlushUndoRecordObjects。Undo.RegisterCreatedObjectUndo
注册新创建的对象。如果您不遵循此工作流程,Unity 可能无法正确地将记录对象的的状态存储在撤消堆栈上。
以下示例演示如何创建一个具有子对象的游戏对象,并将其修改为可在单个撤消步骤中撤消的操作。
using UnityEditor; using UnityEngine;
class CreateGameObjectMenu { [MenuItem("Example/Create GameObject")] static void CreateGameObject() { // Create new undo group Undo.IncrementCurrentGroup();
// Create GameObject hierarchy GameObject go = new GameObject("my GameObject"); Undo.RegisterCreatedObjectUndo(go, "Create my GameObject"); GameObject child = new GameObject(); Undo.RegisterCreatedObjectUndo(child, "Create child"); Undo.SetTransformParent(child.transform, go.transform, "Modify parent");
// Move GameObject hierarchy Undo.RegisterFullObjectHierarchyUndo(go, "Update my GameObject position"); go.transform.position = new Vector3(5, 5, 5);
// Name undo group Undo.SetCurrentGroupName("Create and Reposition GameObject with Child"); } }
注意:当isProcessing为true
时,无法执行此操作。