我尝试使用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.RegisterCompleteObjectUndo
和Undo.ClearUndo
,但他们似乎也没做任何事情(撤消操作仍会出现在撤消堆栈中)。
为了澄清,我根据从服务器(这是一个正在运行的Unity游戏,可能在编辑器内部或外部的游戏)收到的消息,在编辑器中动态创建GameObjects
组件 - 这是实时更新系统)。然后我允许编辑这些组件,并将更改的组件发送回服务器。我正在渲染我自己的检查器UI,并且我想使用内置的Editor
实例来组件(例如,如果有{{1}那么将使用内置CameraEditor
} component)。
唯一的问题是使用内置编辑器会导致撤消操作被添加到堆栈中,但我真的不关心这些撤消操作,因为它们适用的Camera
只是一个临时占位符GameObject
,每当我从服务器收到新消息时,每隔几秒就会不断更新。
答案 0 :(得分:0)
如果你想要的是点击Edit-> Undo菜单(或者当你放置,撤消编辑器应用的最后一个操作),请使用下面的代码:
Undo.PerformUndo();