Unity Editor 编辑器扩展 八 Undo
2016-12-12 01:29
696 查看
Unity的Undo撤销操作也是可以自定义的,当我们将自己的操作组册到Undo事件中,那么,我们就可以按照自己的方式撤销操作了。
目录
Undo操作的简单测试
Undo操作的分组折叠
对选中物体操作并注册Undo练习
将Undo操作分组撤销到指定位置
本文工程:http://download.csdn.net/detail/warrenmondeville/9708468
本文链接:http://blog.csdn.net/WarrenMondeville/article/details/53577379
目录
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 (); } } }
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 (); } } }
对选中物体操作,并注册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"); } } }
将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(); } } }
本文工程:http://download.csdn.net/detail/warrenmondeville/9708468
本文链接:http://blog.csdn.net/WarrenMondeville/article/details/53577379
相关文章推荐
- [cb]Unity Editor Toolbar 编辑器扩展
- Unity Editor 编辑器扩展 六 EditorWindow
- Unity教程之-制作闪亮的星星Star(四):Unity Editor编辑器实现Undo
- Unity Editor 编辑器扩展 十五 提取NGUI 的Transform ResetPosition 功能
- 【Unity编辑器】EditorWindow扩展-SubWindow
- Unity Editor 编辑器扩展 七 创建脚本模版
- Unity Editor 编辑器扩展三 Unity Editor 数据持久化及Editor窗口的初识
- Unity编辑器扩展之EditorWindow
- Unity Editor 编辑器扩展 十 Handle控件
- Unity Editor 编辑器扩展 十一 Inspector可排序列表
- Unity Editor 编辑器扩展 五 EditorGUI
- Unity Editor 编辑器扩展 十三 自定义创建资源
- UnityEditor扩展 - 编辑器中的内置属性Attribute
- Unity Editor Toolbar 编辑器扩展
- UnityEditor扩展编辑器实现从场景中渲染得到Cubemap
- Unity扩展编辑器--类型1:Editor Windows
- Unity教程之-制作闪亮的星星Star(三):给Star创建Unity Editor编辑器
- Unity Behavior Tree Editor 行为树编辑器初级实现
- Unity Editor扩展入门(1) Unity Editor功能扩展所使用的文件夹
- Unity编辑器扩展