在 Unity 中使用 OnMouseDrag 在屏幕上拖动时如何禁用按钮 OnClick
How to disable button OnClick when drag on the screen with OnMouseDrag in Unity
我正在使用 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,当 OnMouseUp 时设置为 false。然后你用 if (!isDragging)
或等价物包装你的按钮侦听器方法。
可能有基于我不知道的 MonoBehaviour 行为的更技术性的解决方案。
使用 IDragHandler 执行拖动并设置您一直在拖动的标志。
https://docs.unity3d.com/ScriptReference/EventSystems.IDragHandler.html
如果标志未打开,则使用 IPointerUpHandler 调用操作。此外,无论发生什么,都重置标志:
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;
}
}
我正在使用 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,当 OnMouseUp 时设置为 false。然后你用 if (!isDragging)
或等价物包装你的按钮侦听器方法。
可能有基于我不知道的 MonoBehaviour 行为的更技术性的解决方案。
使用 IDragHandler 执行拖动并设置您一直在拖动的标志。 https://docs.unity3d.com/ScriptReference/EventSystems.IDragHandler.html
如果标志未打开,则使用 IPointerUpHandler 调用操作。此外,无论发生什么,都重置标志:
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;
}
}