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

server/2024/9/23 13:02:24/

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

http://www.ppmy.cn/server/105037.html

相关文章

电脑如何录屏?高清录制教程来袭,快收藏!

在数字化时代,电脑录屏已经成为了我们学习和工作中的一项重要技能。如果你想知道电脑如何录屏,这里有几个简单的方法可以帮助你开始。 一、福昕网课录制大师 虫洞 https://www.foxitsoftware.cn/REC/ 这个软件因为又专业又好上手,挺受大家…

如何培养单元测试的习惯?怎样才算一个好的单元测试?

你是怎么编写单元测试的呢?很多人的做法是先把所有的功能代码都写完,然后,再针对写好的代码一点一点地补写测试。 在这种编写测试的做法中,单元测试扮演着非常不受人待见的角色。你的整个功能代码都写完了,再去写测试…

《图解设计模式》笔记(四)分开考虑

九、Bridge模式:将类的功能层次结构与实现层次结构分离 类的两个层次结构和作用 类的功能层次结构:希望增加新功能时 父类有基本功能,在子类中增加新功能 Something父类 …├─SomethingGood子类 想要再增加新功能 Something父类 …├─So…

stm32智能颜色送餐小车(红外光管避障)

大家好啊,我是情谊,今天我们来介绍一下我最近设计的stm32产品,我们在今年七月份的时候参加了光电设计大赛,我们小队使用的就是stm32的智能送餐小车,虽然止步于省赛,但是还是一次成长的经验吧,那…

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(三)---创建自定义激光雷达Componet组件

前言 本系列教程旨在使用UE5配置一个具备激光雷达深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博…

【Linux网络】select函数

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 select函数介绍select函数参数介绍select函数返回值select的工作流程TCP服务器【多路复用版】 select函数介绍 在Linux网络编程中,select 函数是一种非常有用的IO多路复用技术&#xff0…

C++ | Leetcode C++题解之第371题两整数之和

题目&#xff1a; 题解&#xff1a; class Solution { public:int getSum(int a, int b) {while (b ! 0) {unsigned int carry (unsigned int)(a & b) << 1;a a ^ b;b carry;}return a;} };

大数据开发工程师面试整理-系统设计

系统设计是软件工程中的关键环节,尤其是在处理大规模分布式系统和大数据平台时,系统设计需要考虑多个方面,包括系统的可扩展性、可靠性、性能、安全性等。以下是系统设计的一些核心原则和常见的设计步骤,以及在大数据环境下的具体应用场景: 1. 核心设计原则 ● 可扩展性(…