如何在UI按钮组件上发生单击时检测鼠标左键单击但不检测

Dak*_*ake 3 c# unity-game-engine

我的脚本使GameObject继续前进Input.GetMouseButtonUp(0).不幸的是,当我点击a时UI Button,会触发移动功能,导致GameObject移动.

当我按下屏幕上的按钮(UI元素)时,我不希望我的GameObject移动.我想阻止GameObject在点击UI组件时移动,例如Button?我该如何解决这个问题?此外,我想检查鼠标是否被特定 UI元素(2或3个按钮)点击

Pro*_*mer 9

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

对于桌面

if(Input.GetMouseButtonUp(0) && !EventSystem.current.IsPointerOverGameObject())
{
    //Your code here
}
Run Code Online (Sandbox Code Playgroud)

//适用于移动设备

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

上面的解决方案应该有效,但有一个错误.当鼠标按钮按下UI Button然后释放的外部时UI Button,它将注册为单击.因此,基本上,该解决方案仅在您单击UI Button并释放时才起作用UI Button.如果你在外面发布U Button,原来的问题将再次出现.

最好的解决方案是使用临时boolean值并检查按钮最初是否在UI上按下Input.GetMouseButtonDown.保存后boolean,您可以在Button发布时使用Input.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
}
Run Code Online (Sandbox Code Playgroud)