主要是使用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);