本文地址:https://blog.csdn.net/t163361/article/details/141352178
项目最近想要加入撤销功能。想要比较完美的实现撤销功能,需要两个基础
1.添加和删除使用命令模式
2.基础数据支持序列化
项目框架使用的QFramework,支持简单的命令模式。数据部分引入了领域驱动的概念,数据和表现分离的比较干净,只需要对数据部分进行序列化就行了,这部分可以用json也可以用其他的序列化形式。
命令模式
需要实现原子命令和复合命令。
例如删除场景中一批选中的物体,就需要使用复合命令,把相关的操作拆分成原子命令组合;这样撤销的时候可以一次性将所有物体恢复。
序列化
主要是为了在删除物体时可以完整的再次重建。
具体的实现就不赘述了,可以看下面列出来的参考文章和项目
撤销(Undo)
针对UI的撤销,有可能还需要实现针对某个窗口的撤销。全局窗口通用一套撤销功能,弹出窗口使用局部撤销行为。
文章
- 【命令模式】设计模式系列:从理论到实践
- 设计模式之美:Command(命令)
- Undo/Redo的C#实现方式
- 【游戏设计模式】之二 论撤消重做、回放系统的实现:命令模式
- 第16章 行为型模式—命令模式
- Undo/Redo的C#实现方式
参考项目
真实项目
- FlaxEngine
项目级,很复杂
Unity
- RundoUnityRuntimeEditor
基于命令模式的撤销恢复机制
很漂亮的框架 - Runtime Editor
状态很完善
支持命令组 - RuntimeUndoRedo
简单好用的撤销功能
基于Action的录制行为,可以很方便的和命令模式集成
支持事务机制 - UndoRedoBlog
命令继承Command包含Excute和Undo两个接口
CommandPool中集成了命令执行和撤销功能 - UndoPro
针对Unity编辑器的撤销功能
C#