2016-07-05 56 views
1

我的脚本使Input.GetMouseButtonUp(0)上的GameObject移动。不幸的是,当我点击UI Button时,移动功能被触发,导致GameObject移动。如何检测鼠标左键单击,但在UI上发生单击时没有按钮组件

当我按下屏幕上的按钮(UI元素)时,我不希望我的GameObject移动。当点击位于UI组件(如Button)上时,我想阻止GameObject移动?我该如何补救?另外,我想检查是否鼠标被点击超过具体 UI元素(2或3个按钮)

+0

你是如何完全阻止它的? –

+3

发布所有负责移动的代码 –

+0

@ḞḹáḿíṅḡⱫỏḿƀíé您不明白这个问题。当我释放鼠标按钮时,我有一个脚本可以让多维数据集移动。问题是:当我在画布上按下按钮时,无论如何,立方体都会移动。当我按下画布按钮时,我不希望立方体移动。 – Dake

回答

5

看完评论。你需要的是EventSystem.current.IsPointerOverGameObject()它检查指针是否在UI上。 true指针在UI上时,否则为false。您可以将其与'!'一起使用,并且只有当鼠标不在用户界面上时才运行旋转代码。

对于桌面

if(Input.GetMouseButtonUp(0) && !EventSystem.current.IsPointerOverGameObject()) 
{ 
    //Your code here 
} 

//移动

if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Ended && !EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)) 
{ 
    //Your code here 
} 

上面的解决方案应该工作,但有一个bug。当UI Button上的鼠标按钮被按下,然后在UI Button之外被释放时,它将被注册为点击。因此,基本上,只有当您点击UI Button并在UI Button上发布时,该解决方案才有效。如果您在U Button之外发布,原始问题将再次回到原来的问题。

最好的解决方案是使用临时值boolean值并检查按钮是否最初是在Input.GetMouseButtonDown的UI上按下的。那保存了boolean,然后您可以使用ButtonInput.GetMouseButtonUp(0)一起发布。提供以下解决方案可与Mobile和Desktop一起使用。移动测试,它的工作原理。

bool validInput = true; 

private void Update() 
{ 
    validateInput(); 

    #if UNITY_STANDALONE || UNITY_EDITOR 

    //DESKTOP COMPUTERS 
    if (Input.GetMouseButtonUp(0) && validInput) 
    { 
     //Put your code here 
     Debug.Log("Valid Input"); 
    } 
    #else 

    //MOBILE DEVICES 
    if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Ended && validInput) 
    { 
     //Put your code here 
     Debug.Log("Valid Input"); 
    } 
    #endif 
} 

void validateInput() 
{ 
    #if UNITY_STANDALONE || UNITY_EDITOR 
    //DESKTOP COMPUTERS 
    if (Input.GetMouseButtonDown(0)) 
    { 
     if (EventSystem.current.IsPointerOverGameObject()) 
      validInput = false; 
     else 
      validInput = true; 
    } 
    #else 
    //MOBILE DEVICES 
    if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) 
    { 
     if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)) 
      validInput = false; 
     else 
      validInput = true; 
    } 
    #endif 
} 
+0

此脚本适用于移动设备吗? – Dake

+0

@Dake是的。它将在每个平台上。试试吧,让我知道 – Programmer

+0

谢谢。 “只需将下面的脚本附加到您想检测的GameObject上点击”您正在谈论我的按钮? – Dake

0

我打赌有更好的解决方案,但在我脑海的第一件事是:

检查你是否点击一个UI元素,在鼠标移动事件中移动你的对象。

您可以通过使用GraphicsRaycaster在您的鼠标位置上投射光线来检查您是否击中了UI元素。如果它碰到任何东西,那么你点击任何画布。

请参见:https://docs.unity3d.com/Manual/script-GraphicRaycaster.html

0

我猜你正在使用Update()方法来处理鼠标输入,没有适当的条件。我建议你改变你的代码,使用交互与UI元素,而不是鼠标按钮等

例子:所有在屏幕上创建一个看不见的大UI面板但必须一切其他落后UI帆布。然后在它上面添加一个按钮组件,并通过OnClick()这个按钮的事件来控制你的移动。 (如果能解决问题,请投票支持他人)

相关问题