您的位置:首页 > 移动开发 > Unity3D

Unity Editor 编辑器扩展 八 Undo

2016-12-12 01:29 696 查看
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 ();
}
}
}


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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息