Unity3d Undo

Unity的Undo撤销操作也是可以自定义的,当我们将自己的操作组册到Undo事件中,那么,我们就可以按照自己的方式撤销操作了。

目录

Undo操作的简单测试

下面是一些撤销测试,非常简单,直接看代码

using UnityEngine;
using UnityEditor;
public class UndoTest 
{
    //把选中物体位置归零
    [MenuItem("Undo/RecordObject")]
    static void RecordObject ()
    {

        Transform transform = Selection.activeTransform;

        Undo.RecordObject (transform, "Pos");
        transform.position = new Vector3 (0, 0, 0);
    }

    //选中物体添加刚体组件
    [MenuItem("Undo/AddComponent")]
    static void AddComponent ()
    {
        GameObject go = Selection.activeGameObject;
//      添加组件,执行撤销后将被删除
        Rigidbody rigidbody = Undo.AddComponent<Rigidbody> (go);

    }

//  删除物体
    [MenuItem("Undo/DestroyObjectImmediate")]
    static void DestroyObjectImmediate ()
    {
        GameObject go = Selection.activeGameObject;
//      注册撤销删除对象
        Undo.DestroyObjectImmediate (go);
    }
    [MenuItem("Undo/SetTransformParent")]
    static void SetTransformParent ()
    {

        Transform root = Camera.main.transform;

        Transform transform = Selection.activeTransform;

//      撤销父子关系
        Undo.SetTransformParent (transform, root, "Main Cameta");
    }

//  创建一个物体,如果物体的ID含有0数字则取消创建
    [MenuItem("Undo/RevertAllInCurrentGroup")]
    static void RevertAllInCurrentGroup ()
    {
        GameObject ticket = new GameObject ("Ticket");

        Undo.RegisterCreatedObjectUndo (ticket, "UndoCreate");


        int number = ticket.GetInstanceID ();

        int winningNumber = 0;
        Debug.Log (ticket.GetInstanceID());
        if (ticket.GetInstanceID ().ToString().Contains(winningNumber.ToString())) {

            Undo.RevertAllInCurrentGroup ();
        }
    }
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

Undo操作的分组折叠

撤销操作可以将一系列操作分为一组,这样一次撤销就可以撤销这一组的操作了

using UnityEngine;
using UnityEditor;

public class UndoWindow : EditorWindow
{
    int groupID = 0;

    [MenuItem ("Window/UndoWindow")]
    static void Open ()
    {
        GetWindow<UndoWindow> ();
    }

    void OnEnable ()
    {
        groupID = Undo.GetCurrentGroup ();
    }

    void OnDisable ()
    {
//      折叠撤销操作
        Undo.CollapseUndoOperations (groupID);
    }

    void OnGUI ()
    {
        if (GUILayout.Button ("Cube 生成")) {
            var cube = GameObject.CreatePrimitive (PrimitiveType.Cube);
            Undo.RegisterCreatedObjectUndo (cube, "Create Cube");
        }

        if (GUILayout.Button ("Plane 生成")) {
            var plane = GameObject.CreatePrimitive (PrimitiveType.Plane);
            Undo.RegisterCreatedObjectUndo (plane, "Create Plane");
        }

        if (GUILayout.Button ("Cylinder 生成")) {
            var cylinder = GameObject.CreatePrimitive (PrimitiveType.Cylinder);
            Undo.RegisterCreatedObjectUndo (cylinder, "Create Cylinder");
        }
        if (GUILayout.Button("折叠撤销操作")) {
            Undo.CollapseUndoOperations (groupID);
        }
        if (GUILayout.Button("撤销")) {
            Undo.PerformUndo ();
        }
        if (GUILayout.Button("取消撤销")) {
            Undo.PerformRedo ();
        }
    }
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

这里写图片描述

对选中物体操作,并注册Undo练习

将自己编写的一些操作加入到Undo中

using UnityEngine;
using UnityEditor;

public class Example
{
    [MenuItem("Example/Create Cube")]
    static void CreateCube ()
    {
//      创建一个cube
        var cube=GameObject.CreatePrimitive (PrimitiveType.Cube);
//      注册撤销 参数一代表撤销操作的物体,
//      参数二代表撤销操作的名称,在Edit-》undo后面有显示,目前只支持英文
        Undo.RegisterCreatedObjectUndo (cube, "Create Cube");

    }

    [MenuItem("Example/Random Rotate")]
    static void RandomRotate ()
    {
//      获取当前选中物体
        var transform = Selection.activeTransform;

        if (transform) {
            Undo.RecordObject (transform, "Rotate " + transform.name);
            transform.rotation = Random.rotation;
        }
    }
    [MenuItem("Example/Random Rotate2")]
    static void RandomRotate2 ()
    {
        var transform = Selection.activeTransform;

        if (transform) {
            Undo.willFlushUndoRecord += () => Debug.Log ("flush");

            Undo.postprocessModifications += (modifications) => {
                Debug.Log ("modifications");
                return modifications;
            };

            Undo.RecordObject (transform, "Rotate 2" + transform.name);
            Debug.Log ("recorded");

            transform.rotation = Random.rotation;
            Debug.Log("changed");
        }
    }

}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

将Undo操作分组,撤销到指定位置

Undo的每一步操作都有它的ID,纪录ID就可以实现特殊的Undo操作

using UnityEngine;
using UnityEditor;

public class ExampleWindow : EditorWindow
{

    [MenuItem("Window/ExampleWindow")]
    static void Open ()
    {
        GetWindow<ExampleWindow> ();
    }

    GameObject go;

    int group1 = 0;
    int group2 = 0;
    int group3 = 0;

    void OnEnable ()
    {
        go = Camera.main.gameObject;
    }


    void OnGUI ()
    {

        if (GUILayout.Button("给摄像机添加组件")) {
            group1 = Undo.GetCurrentGroup();

            Undo.AddComponent<Rigidbody> (go);

            Undo.IncrementCurrentGroup();

            group2 = Undo.GetCurrentGroup();


            Undo.AddComponent<BoxCollider> (go);

            Undo.IncrementCurrentGroup();

            group3 = Undo.GetCurrentGroup();

            Undo.AddComponent<ConstantForce>(go);
//          打印撤销操作编号
            Debug.Log (group1+"--"+group2+"--"+group3);
        }

        if (GUILayout.Button("取消到group2状态")) {
            //回到group2之前的状态
            Undo.RevertAllDownToGroup(group2);

            EditorGUIUtility.ExitGUI();
        }


    }
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

本文工程:http://download.csdn.net/detail/warrenmondeville/9708468 
本文链接:http://blog.csdn.net/WarrenMondeville/article/details/53577379

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值