AR测量工具:点击Undo/Redo按钮时误在按钮后生成测量点求助
问题分析与解决思路
核心问题根源
你当前的代码逻辑犯了关键错误:把Undo按钮的点击逻辑和触摸判断、UI拦截逻辑混在了一起。点击Undo按钮时,EventSystem.current.IsPointerOverGameObject(touch.fingerId)会返回true,导致Undo核心逻辑无法执行,按钮直接失效;而生成测量点的逻辑没有做UI拦截,所以点击按钮时会误触发点的生成。
分步解决方法
1. 拆分生成测量点与Undo/Redo的逻辑
把生成测量点的操作和按钮点击操作完全分离,各自处理交互判断:
生成测量点的逻辑(仅点击AR平面时触发)
在负责生成测量点的独立方法中,加入UI触摸拦截判断,确保只有点击非UI区域时才生成点:
// 示例:生成测量点的独立方法 void HandlePlaneTapToPlacePoint() { if (Input.touchCount <= 0) return; Touch touch = Input.GetTouch(0); // 仅当触摸未命中UI时,才执行放置逻辑 if (!EventSystem.current.IsPointerOverGameObject(touch.fingerId)) { // 编写AR平面检测、生成测量点的代码 // 同时将该操作封装成命令,加入undoHistoryStack } }
修正Undo按钮的逻辑
按钮点击事件直接触发撤销操作,不需要在方法内做触摸和UI判断(按钮点击本身就是合法的UI交互):
public void UndoCommands() { // 仅判断撤销栈是否有内容,有则执行撤销 if (undoHistoryStack.Count > 0) { var lastCommand = undoHistoryStack.Pop(); lastCommand.Undo(); redoStack.Push(lastCommand); // 添加更新测量线、UI状态等后续逻辑 } // 无内容时直接返回,不会触发任何生成操作 }
修正Redo按钮的逻辑
同理,Redo按钮只判断恢复栈是否有内容,有则执行恢复,无内容时直接返回:
public void RedoCommands() { if (redoStack.Count > 0) { var redoCommand = redoStack.Pop(); redoCommand.Execute(); undoHistoryStack.Push(redoCommand); // 更新测量线、UI状态等后续逻辑 } // 无内容时直接返回,避免误生成点 }
2. 额外注意事项
- 确保命令模式封装正确:每个测量点的生成/撤销操作都封装成独立命令对象,包含
Execute()和Undo()方法,Undo/Redo时仅操作已有节点,不会触发新生成逻辑 - 检查按钮事件绑定:确认Undo/Redo按钮的OnClick事件正确绑定到对应方法,未误绑定到生成点的逻辑
内容的提问来源于stack exchange,提问作者P D
相关产品推荐
相关产品推荐

