如何从历史记录中删除撤消(RevertAllInCurrentGroup?)

时间:2016-01-22 05:52:40

标签: unity3d

我尝试使用RevertAllInCurrentGroup撤消上一次操作,但它似乎无法正常工作。实际上我真正想做的就是从历史中删除撤消;我不在乎是否应用撤消。

在某些初始化代码中,我有:

// 'component' is a MonoBehaviour-derived class. Here I create the default editor for the component
m_editor = Editor.CreateEditor(component);

然后在OnGUI中的EditorWindow

m_editor.OnInspectorGUI();
// ..'hasChanged' is set to true if the user changed some property
if (hasChanged)
{
    // ..do some stuff using the new values on the object, which includes sending a message to a server
    Undo.RevertAllInCurrentGroup();
}

当我致电RevertAllInCurrentGroup时,我会在InvalidOperationException: Operation is not valid due to the current state of the object中的某个Stack对象中获得GUILayoutUtility.EndLayoutGroup。我想也许我不应该在OnGUI中进行还原,所以我将其更改为设置标志并在Update中进行还原,但这并没有任何区别(除了我显然不再得到例外)。

有没有人知道如何使用此函数,或者是否有其他方法可以撤消Editor实例应用的上一个操作?我尝试过使用Undo.RegisterCompleteObjectUndoUndo.ClearUndo,但他们似乎也没做任何事情(撤消操作仍会出现在撤消堆栈中)。

为了澄清,我根据从服务器(这是一个正在运行的Unity游戏,可能在编辑器内部或外部的游戏)收到的消息,在编辑器中动态创建GameObjects组件 - 这是实时更新系统)。然后我允许编辑这些组件,并将更改的组件发送回服务器。我正在渲染我自己的检查器UI,并且我想使用内置的Editor实例来组件(例如,如果有{{1}那么将使用内置CameraEditor } component)。

唯一的问题是使用内置编辑器会导致撤消操作被添加到堆栈中,但我真的不关心这些撤消操作,因为它们适用的Camera只是一个临时占位符GameObject,每当我从服务器收到新消息时,每隔几秒就会不断更新。

1 个答案:

答案 0 :(得分:0)

如果你想要的是点击Edit-> Undo菜单(或者当你放置,撤消编辑器应用的最后一个操作),请使用下面的代码:

Undo.PerformUndo();