Unity实现运行时撤销(undo)功能浅谈

本文地址: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#

  • Undo-redo Manager
    项目分析了三种撤销类型的性能对比
  • OOPS
    AccumulatorManager支持多个撤销实例
    Accumulator 行为栈
  • Memento
    基于属性进行撤销,支持批处理操作
  • Muf
    UndoService提供多个撤销实例管理功能
    UndoRoot支持撤销功能的处理类
    UndoBatch将多个修改整合成一个操作
    通过监控属性变化而不是命令的方式完成的撤销功能
  • DefaultUnDo
    命令继承UnDo包含_doAction和_undoAction两个Action
    UnDoManager中集成了命令执行和撤销功能
    支持事务嵌套
    提供基础类型的Undo功能

你可能感兴趣的:(Unity,调研,unity,游戏引擎,undo,撤销)