C# 在Unity中使用OnMouseDrag在屏幕上拖动时如何禁用按钮OnClick

C# 在Unity中使用OnMouseDrag在屏幕上拖动时如何禁用按钮OnClick,c#,button,unity3d,mouse,drag,C#,Button,Unity3d,Mouse,Drag,我正在使用OnMouseDrag()更改屏幕上对象的相机视图。代码如下: void OnMouseDrag() { if (isGameOver) { return; } float rotSpeed = GameConst.rotateSpeed * 20.0f ; float rotX = Input.GetAxis("Mouse X") * rotSpeed * Mathf.Deg2Rad; float rotY = Input

我正在使用
OnMouseDrag()
更改屏幕上对象的相机视图。代码如下:

void OnMouseDrag() {    
if (isGameOver) {           
return;         
}       
float rotSpeed = GameConst.rotateSpeed * 20.0f ;
float rotX = Input.GetAxis("Mouse X") * rotSpeed * Mathf.Deg2Rad;
float rotY = Input.GetAxis("Mouse Y") * rotSpeed * Mathf.Deg2Rad;
transform.RotateAround(Vector3.up, -rotX);      transform.RotateAround(Vector3.right - Vector3.forward, -rotY);
}
然后我使用
button.OnClick().AddListerner()
在单击按钮时附加一个函数


问题是,每次我完成拖动时,如果鼠标向上位置位于按钮区域,按钮也会调用
OnClick()
函数。如果只是一个拖动操作,我如何禁用
OnClick()

如果你只是想解决这个问题,我想你可以添加一个布尔值
isDragging
,当你输入
OnMouseDrag
时设置为true,当输入onmouseuup时设置为false。然后用
if(!isDraging)
或等效项包装按钮侦听器方法


可能有一个基于MonoBehavior行为的更技术性的解决方案,我不知道。

使用IDragHandler执行拖动,并设置您一直拖动的标志。

然后,如果该标志未启用,则使用IPInterupHandler调用该操作。此外,无论发生什么情况,都要重置标志:

public class DragMe : MonoBehaviour, IBeginDragHandler, IPointerUpHandler
{
    private bool isDragging = false;


    public void OnBeginDrag(PointerEventData data)
    {
        this.isDragging = true;
    }
    public void OnPointerUp(PointerEventData eventData)
    {
       if(this.isDragging == false){ Invoke();}
       this.isDragging = false;
    }
}

不要通过简单的点击按钮直接从代码中添加监听器。直接从检查员处分配该功能。在我看来,这会降低代码的可读性。我完全不同意。如果没有代码来指示侦听器,我会说这很难理解。Inspector分配非常脆弱。不工作,我想
OnClick()
OnMouseUp()
.Hm之后执行,这是合理的。你可以通过延迟bool开关和一个协同程序来解决这个问题,但这是非常糟糕的,只是在寻找bug。我可能会将按钮行为更改为仅当OnMouseDown和Up在按钮上时触发。我将考虑几分钟……这个解决方案对我来说似乎很好。我在
OnBeginDrag()
中设置
isDragging=true
,在
onendrag()中设置
isDragging=false
。检查按钮的
OnClick()
功能中的
isDraging
。现在一切看起来都很好。让我们再测试一下,然后我接受这个答案。