🔗插件功能演示解说视频
📋 插件概述
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. 历史记录管理 📚
- 📌 默认保存最近50条操作记录
- 📋 可以查看所有历史操作的描述
- 🧹 支持一键清空历史(如场景切换时)
- ♻️ 自动清理过旧的记录防止内存占用过大
3. 智能内存管理 🧠
- 🔗 使用弱引用避免阻止对象被垃圾回收
- 🧹 自动清理无效的映射关系
- ⚡ 缓存查找结果提升性能
- 🛡️ 循环检测防止死锁
4. 调试友好 🔍
- 📊 三级日志系统:错误/信息/详细
- 🗺️ 可以打印对象映射关系
- 🔗 可以追踪对象的完整映射链
- 📝 详细的操作描述帮助定位问题
💡 应用场景
🏗️ 关卡编辑器
构建游戏内的关卡编辑器时,撤销功能是必不可少的:
- 放置物体后撤销
- 删除物体后撤销
- 修改物体属性后撤销
- 批量操作的撤销
🏘️ 建造/沙盒游戏
玩家需要频繁尝试不同的布局:
- 建筑位置调整
- 装饰物摆放试错
- 地形编辑撤销
♟️ 策略/棋类游戏
提供悔棋功能:
- 移动单位后悔棋
- 建造选择撤销
- 战术调整
🎨 绘画/设计工具
创意类应用必备:
- 笔刷操作撤销
- 颜色修改撤销
- 图层操作撤销
📚 教学/演示
记录操作步骤便于回溯:
- 演示错误操作
- 教学中的步骤回退
- 对比不同方案
⚠️ 使用注意事项
关键要点 🎯
-
⚠️ 删除前必须先记录
调用"记录对象删除"必须在实际删除之前,否则无法保存对象信息
-
🔗 及时更新引用
涉及删除撤销的场景,每次操作对象前都应该先调用"获取有效对象"更新引用
-
📝 合理的操作描述
给每个操作起个清晰的名字,方便查看历史和调试
-
🧹 适时清理历史
场景切换或重新开始游戏时,记得清空历史记录释放内存
-
⚡ 考虑性能影响
频繁记录大量对象的修改会占用内存和CPU,建议合理控制记录频率
最佳实践建议 ✨
- ✅ 为每个操作提供有意义的描述,如 "移动建筑到(100, 200)" 而不是 "修改"
- ✅ 在关键的游戏状态变化点清理历史,如关卡切换
- ✅ 批量操作时使用批量记录函数而不是循环调用单个记录
- ✅ 测试阶段开启详细日志,发布时关闭以提升性能
- ✅ 定期检查历史记录数量,避免无限增长
📈 性能与限制
💾 内存占用
- 📦 每条记录包含完整的对象快照
- 📊 默认最多保存50条历史
- 🎮 大型对象(如复杂网格体)会占用更多内存
- ⚙️ 建议根据游戏需求调整历史记录上限
🎮 总结
CYS_RevokeTool 提供了一个强大而易用的运行时撤销系统,让游戏开发者可以轻松为玩家提供撤销功能,提升用户体验。
无论是建造游戏、关卡编辑器还是任何需要撤销功能的应用,这个插件都能提供可靠的技术支持。
通过完整的对象快照 、智能的引用管理 和友好的蓝图接口,开发者可以在几分钟内为游戏添加专业级的撤销功能,而无需深入了解复杂的底层实现细节。