You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 09:37:36