UE5运行时操作撤销系统插件

🔗插件功能演示解说视频

📋 插件概述

CYS_RevokeTool 是一个为虚幻引擎5开发的运行时撤销系统插件。它允许在游戏运行过程中(包括PIE测试模式和打包后的游戏)记录玩家或系统对游戏对象的各种操作,并支持随时撤销这些操作,将对象恢复到之前的状态。


🎯 主要功能

1. 属性修改的记录与撤销

可以记录并撤销对象的任何属性变化,包括但不限于:

  • 位置、旋转、缩放 → 移动了物体后可以撤销回原位
  • 材质和颜色 → 改变了物体颜色或材质后可以恢复
  • 自定义属性 → 游戏中定义的任何属性都可以被追踪

💡 使用场景举例:

  • 建造游戏中移动家具位置后撤销
  • 绘画工具中修改颜色后撤销
  • 策略游戏中移动单位后悔棋

2. 对象创建的撤销

记录新创建对象的操作,撤销时会删除该对象。

💡 使用场景举例:

  • 建造模式中放置了错误的建筑物,撤销即可删除
  • 关卡编辑器中生成了不需要的道具

3. 对象删除的撤销

这是最强大的功能之一!

当你删除一个对象前先记录删除操作,撤销时系统会完整地重建这个对象,包括它的所有属性、材质、位置等信息。

💡 使用场景举例:

  • 不小心删除了重要的游戏对象
  • 建造游戏中误拆除了建筑
  • 需要"回收站"功能的任何场景

4. 批量操作支持

可以同时记录多个对象的修改,一次撤销就能恢复所有对象。

💡 使用场景举例:

  • 同时移动了多个单位后一键撤销
  • 批量修改了多个物体的颜色后恢复

5. 智能引用管理 🧠

这是插件的核心技术优势。当对象被删除后重建,内存地址会改变,普通的引用会失效。插件提供了智能引用系统,自动追踪对象的"转世",确保你始终能找到正确的对象。

✅ 解决的问题:

  • 删除后撤销重建的对象,蓝图中的引用自动更新
  • 多次删除撤销后,系统仍能正确追踪对象
  • 避免了"空引用"导致的游戏崩溃

📊 蓝图函数列表

记录操作类函数

函数名 功能说明 参数说明 典型用途
RecordSingleModify 记录单个对象的修改 Object: 要记录的对象 Description: 操作描述文字 记录移动、旋转、属性修改等操作
RecordBatchModify 记录多个对象的修改 Objects: 对象数组 Description: 操作描述文字 批量修改多个物体时使用
RecordObjectCreation 记录对象创建 Object: 新创建的对象 Description: 操作描述文字 在生成新物体后调用
RecordObjectDeletion 记录对象删除 Object: 即将删除的对象 Description: 操作描述文字 ⚠️ 在删除物体之前调用

撤销控制类函数

函数名 功能说明 返回值 典型用途
Undo 执行撤销操作 布尔值: 是否成功撤销 绑定到撤销按键或UI按钮
CanUndo 检查是否可以撤销 布尔值: 是否有可撤销的操作 控制撤销按钮的启用状态
GetUndoHistory 获取历史记录列表 字符串数组: 所有操作的描述 显示操作历史UI
ClearHistory 清空所有历史记录 场景切换时清理内存

引用管理类函数

函数名 功能说明 参数说明 返回值 典型用途
GetValidObject 获取对象的有效引用 Object: 可能已失效的对象引用 有效的对象引用 (失败返回空) 在操作对象前更新引用

🔄 工作流程说明

场景一:移动物体并支持撤销 📦

  1. ▶️ 玩家按下移动键
  2. 🎯 获取要移动的物体
  3. 🚀 执行移动操作
  4. 💾 调用 "记录单个对象修改" 函数
  5. ↩️ 玩家按下撤销键时,物体回到移动前的位置

场景二:删除物体并支持撤销 🗑️

  1. 🎯 玩家选中要删除的物体
  2. ⚠️ 调用 "记录对象删除" 函数(必须在删除前!
  3. 💥 执行删除操作
  4. ↩️ 玩家按下撤销键时,物体完整恢复

场景三:创建物体并支持撤销

  1. 🎨 玩家选择创建新物体
  2. ✨ 生成新物体
  3. 💾 调用 "记录对象创建" 函数
  4. ↩️ 玩家按下撤销键时,新物体被删除

⚙️ 系统设计特点

1. 完整的状态保存 💾

插件会保存对象的所有重要信息:

  • 基础信息: 对象类型、名称、所属关系
  • 变换数据: 位置、旋转、缩放
  • 材质数据: 包括动态材质的参数、颜色、纹理
  • 组件数据: 网格体、物理属性等
  • 自定义属性: 游戏逻辑中定义的各种数据

2. 历史记录管理 📚

  • 📌 默认保存最近50条操作记录
  • 📋 可以查看所有历史操作的描述
  • 🧹 支持一键清空历史(如场景切换时)
  • ♻️ 自动清理过旧的记录防止内存占用过大

3. 智能内存管理 🧠

  • 🔗 使用弱引用避免阻止对象被垃圾回收
  • 🧹 自动清理无效的映射关系
  • ⚡ 缓存查找结果提升性能
  • 🛡️ 循环检测防止死锁

4. 调试友好 🔍

  • 📊 三级日志系统:错误/信息/详细
  • 🗺️ 可以打印对象映射关系
  • 🔗 可以追踪对象的完整映射链
  • 📝 详细的操作描述帮助定位问题

💡 应用场景

🏗️ 关卡编辑器

构建游戏内的关卡编辑器时,撤销功能是必不可少的:

  • 放置物体后撤销
  • 删除物体后撤销
  • 修改物体属性后撤销
  • 批量操作的撤销

🏘️ 建造/沙盒游戏

玩家需要频繁尝试不同的布局:

  • 建筑位置调整
  • 装饰物摆放试错
  • 地形编辑撤销

♟️ 策略/棋类游戏

提供悔棋功能:

  • 移动单位后悔棋
  • 建造选择撤销
  • 战术调整

🎨 绘画/设计工具

创意类应用必备:

  • 笔刷操作撤销
  • 颜色修改撤销
  • 图层操作撤销

📚 教学/演示

记录操作步骤便于回溯:

  • 演示错误操作
  • 教学中的步骤回退
  • 对比不同方案

⚠️ 使用注意事项

关键要点 🎯

  1. ⚠️ 删除前必须先记录

    调用"记录对象删除"必须在实际删除之前,否则无法保存对象信息

  2. 🔗 及时更新引用

    涉及删除撤销的场景,每次操作对象前都应该先调用"获取有效对象"更新引用

  3. 📝 合理的操作描述

    给每个操作起个清晰的名字,方便查看历史和调试

  4. 🧹 适时清理历史

    场景切换或重新开始游戏时,记得清空历史记录释放内存

  5. ⚡ 考虑性能影响

    频繁记录大量对象的修改会占用内存和CPU,建议合理控制记录频率


最佳实践建议

  • ✅ 为每个操作提供有意义的描述,如 "移动建筑到(100, 200)" 而不是 "修改"
  • ✅ 在关键的游戏状态变化点清理历史,如关卡切换
  • ✅ 批量操作时使用批量记录函数而不是循环调用单个记录
  • ✅ 测试阶段开启详细日志,发布时关闭以提升性能
  • ✅ 定期检查历史记录数量,避免无限增长

📈 性能与限制

💾 内存占用

  • 📦 每条记录包含完整的对象快照
  • 📊 默认最多保存50条历史
  • 🎮 大型对象(如复杂网格体)会占用更多内存
  • ⚙️ 建议根据游戏需求调整历史记录上限

🎮 总结

CYS_RevokeTool 提供了一个强大而易用的运行时撤销系统,让游戏开发者可以轻松为玩家提供撤销功能,提升用户体验。

无论是建造游戏、关卡编辑器还是任何需要撤销功能的应用,这个插件都能提供可靠的技术支持。

通过完整的对象快照智能的引用管理友好的蓝图接口,开发者可以在几分钟内为游戏添加专业级的撤销功能,而无需深入了解复杂的底层实现细节。

相关推荐
北冥没有鱼啊2 小时前
UE5 离谱问题,角色动画不播放
游戏·ue5·ue4·游戏开发·虚幻
速冻鱼Kiel5 小时前
GASP笔记03
笔记·ue5·游戏引擎·虚幻
曼巴UE520 小时前
UE Sequencer,MediaPlay的使用经验总结
ue5·音视频·ue
AI视觉网奇1 天前
ue c++ 编译常量
c++·学习·ue5
AI视觉网奇1 天前
ue5 默认相机设置
笔记·学习·ue5
_守一1 天前
UE5.2 C++插件中调用C#第三方库
c++·ue5·c#
zhangzhangkeji1 天前
UE5 C++(37-2):
ue5
哎呦哥哥和巨炮叔叔2 天前
2026 年 UE5 与 Chaos Vantage 实测对比:建筑可视化实时渲染该如何选择?
ue5·云渲染·实时渲染·3ds max·建筑可视化·渲染101·chaos vantage
1204157137 肖哥2 天前
3dmax 解决导入ue5的平滑组问题
ue5·3dsmax