unity editor里的undo操作

主要是使用unity里的Undo的API。

1.Undo.RegisterCreatedObjectUndo //撤销创建

[MenuItem("Example/Create Cube")]
    static void CreateCube()
    {
    
    
        var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        Undo.RegisterCreatedObjectUndo(cube, "Create Cube");
    }

2.Undo.DestroyObjectImmediate //撤销对象销毁

[MenuItem("Example/UndoDestory")]
    static void UndoDestory()
    {
    
    
        GameObject player = Selection.activeGameObject;
        if (player)
        {
    
    
            // Store the states of the player object.
            Undo.DestroyObjectImmediate(player);
            Object.DestroyImmediate(player);
        }
    }

3 Undo.RegisterCompleteObjectUndo //撤销Object的状态
能撤销object的各种公共字段的修改。
除了AddComponent,改变父子关系和销毁。

[MenuItem("Example/RegisterCompleteObjectUndo")]
    static void Example()
    {
    
    
        GameObject player = Selection.activeGameObject;
        if (player)
        {
    
    
            // Store the states of the player object.
            Undo.RegisterCompleteObjectUndo(player, "Player name change");
            player.name = "New Player";
        }
    }

3.1 Undo.RegisterFullObjectHierarchyUndo //撤销Object及其子物体的状态

[MenuItem("Example/UndoFullObjectHierarchy")]
    static void UndoFullObjectHierarchy()
    {
    
    
        GameObject player = Selection.activeGameObject;
        if (player.transform.childCount > 0)
        {
    
    
            Undo.RegisterFullObjectHierarchyUndo(player, "Player name change");
            player.transform.GetChild(0).name = "New Player";
        }
    }

3.2 Undo.RecordObject //也是记录当前该对象状态用于撤销
使用方法类似RegisterCompleteObjectUndo ,暂时没发现啥不同。

[MenuItem("Example/UndoRecordObject")]
    static void UndoRecordObject()
    {
    
    
        var obj = Selection.activeGameObject;
        if (obj)
        {
    
    
            Undo.RecordObject(obj,"test");
            obj.name = "Changed";
        }
    }

4 Undo.AddComponent //向参数对象添加相应组件并支持撤销
注意执行该代码就会给该对象加一个组件

[MenuItem("Example/UndoAddComponent")]
    static void UndoAddComponent()
    {
    
    
        GameObject player = Selection.activeGameObject;
        if (player)
        {
    
    
            Undo.AddComponent<test>(player);
        }
    }

4 Undo.SetTransformParent(t1,t2,name) //将t1作为t2的子物体,并支持撤销
注意执行该代码就会执行相应的父子关系变换

[MenuItem("Example/UndoTransform")]
    static void UndoTransParent()
    {
    
    
        Transform root = GameObject.Find("Main Camera").transform;
        Transform transform = Selection.activeTransform;
        Undo.SetTransformParent(transform, root, "摄像机子物体");
    }

5.将撤销操作分组
如果在一段操作里注册复数个撤销,在实际撤销时,这些撤销会作为一个组一起被撤销。如果想要阶段性撤销。就要对撤销操作分组。
//会被统一撤销掉

		var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        Undo.RegisterCreatedObjectUndo(cube, "Create");
        var sp = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        Undo.RegisterCreatedObjectUndo(sp, "Create sp");

//会被分为两个撤销

		var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        Undo.RegisterCreatedObjectUndo(cube, "Create");
        Undo.IncrementCurrentGroup();//组ID累加1,即这之后的撤销为另一组
        var sp = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        Undo.RegisterCreatedObjectUndo(sp, "Create sp");

Undo.GetCurrentGroup() //获取当前组ID
Undo.IncrementCurrentGroup();//增加撤销分组
Undo.RevertAllDownToGroup(int group);//执行该组id下所有撤销操作
Undo.RevertAllInCurrentGroup();//执行当前组下所有撤销操作
Undo.CollapseUndoOperations(int groupid);//将所有的撤销操作折叠到groupid里,就是groupid之后的撤销分组失效,撤销操作都折叠到groupid里。

var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        Undo.RegisterCreatedObjectUndo(cube, "Create");
        var id = Undo.GetCurrentGroup();//试着移动这个
        Undo.IncrementCurrentGroup();
        var sp = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        Undo.RegisterCreatedObjectUndo(sp, "Create sp");
        Undo.IncrementCurrentGroup();
        var cap = GameObject.CreatePrimitive(PrimitiveType.Capsule);
        Undo.RegisterCreatedObjectUndo(cap, "Create cap");
        Undo.CollapseUndoOperations(id);

参考
Undo
unityAPI

猜你喜欢

转载自blog.csdn.net/farcor_cn/article/details/116160549