Unity3d Undo

来源:互联网 发布:发热丝数据 编辑:程序博客网 时间:2024/06/08 07:07

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

目录

  • Undo操作的简单测试
  • Undo操作的分组折叠
  • 对选中物体操作并注册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

原创粉丝点击