UE4编辑器中对UObject实现的重做(Redo)和撤销(Undo)的方式

有没有人在啊,想请教下,UE4编辑器中对UObject实现的重做(Redo)和撤销(Undo)的方式
最新回答
未央几寒

2026-10-23 08:55:01

在虚幻编辑器的源码探索中,"RF_Transactional"这一关键字引起了我的注意。在查阅相关定义后,我了解到它与编辑器的撤销和重做操作紧密相关。撤销(Ctrl + Z)和重做(Ctrl + Y)是我们在使用虚幻编辑器时常见的功能,那么如何在自定义的UObject或子对象中实现这些操作?虚幻提供了关于UObject属性撤销和重做的系统,我们可以通过以下步骤来实现。

要实现撤销和重做功能,首先需要给要支持这些操作的Uobject对象或子对象添加"RF_Transactional"标签。这一步是实现撤销和重做操作的前提。

接下来,我们需要标识每一次具体的内容修改,以便编辑器能够在此基础上进行撤销和重做操作。虚幻提供了两种方式来标记修改内容:

1. 使用`GEditor->BeginTransaction`和`GEditor->EndTransaction`来标记修改的开始和结束。在进行修改前,调用`UObject::Modify()`函数将修改前的数据保存到TransactionBuffer中。关键在于`SaveToTransactionBuffer`函数的调用,这是UObject保存操作的关键。

2. 采用`FScopedTransaction`类,它将`GEditor->BeginTransaction`和`GEditor->EndTransaction`方法封装其中,超出作用域时自动定义为一次修改,操作更为便捷。

如果某个Uobject成员不希望参与撤销和重做系统,可以使用“NonTransactional”关键字进行修饰。

虚幻在Uobject类中还提供了两个方法,方便开发者进行更多操作:

1. `PreEditUndo`:用于在撤销或重做Uobject属性之前调用。
2. `PostEditUndo`:用于在撤销或重做Uobject属性之后调用。

为了验证这些功能,我编写了一个简单的测试代码。首先定义了一个`TestObject`类,其中包含一个成员变量`value`,用于展示在撤销和重做操作时值的变化。然后创建了一个`TestActor`类,将成员函数`TestSpawn`使用`CallInEditor`修饰,以便在编辑器中直接进行测试。记得在`Build.cs`文件中添加“UnrealEd”模块。

通过这个测试代码,我们可以直观地观察到UObject在撤销和重做操作时属性值的变化,从而验证了虚幻编辑器中撤销和重做机制的正确实现。