C# 如何检测鼠标左键单击而不是在UI按钮组件上发生单击

C# 如何检测鼠标左键单击而不是在UI按钮组件上发生单击,c#,unity3d,C#,Unity3d,我的脚本使游戏对象在Input.GetMouseButtonUp(0)上移动。不幸的是,当我点击UI按钮时,移动功能被触发,导致游戏对象移动 当我按下屏幕上的按钮(UI元素)时,我不希望我的游戏对象移动。我想防止当点击某个UI组件(如按钮)时游戏对象移动?我该怎么补救呢?另外,我想检查鼠标是否点击了特定的UI元素(2或3个按钮)我打赌有更好的解决方案,但我想到的第一件事是: 检查您是否正在单击UI元素,或者在鼠标向上移动对象事件 通过使用GraphicsRaycaster在鼠标位置投射光线,可以

我的脚本使游戏对象在
Input.GetMouseButtonUp(0)
上移动。不幸的是,当我点击
UI按钮时,移动功能被触发,导致游戏对象移动


当我按下屏幕上的按钮(UI元素)时,我不希望我的游戏对象移动。我想防止当点击某个UI组件(如
按钮
)时游戏对象移动?我该怎么补救呢?另外,我想检查鼠标是否点击了特定的UI元素(2或3个按钮)

我打赌有更好的解决方案,但我想到的第一件事是:

检查您是否正在单击UI元素,或者在鼠标向上移动对象事件

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


请参阅:

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


示例:在整个屏幕上创建一个大的不可见UI面板,但必须位于UI画布中其他所有内容的后面。然后在其上添加一个按钮组件,并通过此按钮的
OnClick()
事件控制您的
gameObject
移动。(如果它解决了问题,请投票帮助他人)

阅读您的评论后。您需要的是检查指针是否在UI上<当指针位于UI上方时,代码>真
,否则
。您可以将其与“
”一起使用”并仅当鼠标不在UI上时运行旋转代码

用于桌面

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按钮上,然后将其释放到
UI按钮之外时,它将注册为单击。因此,基本上,只有当您单击
UI按钮
并释放
UI按钮
时,解决方案才会起作用。如果在
U按钮
外释放,原始问题将再次出现

最好的解决方案是使用一个临时的
布尔值
并检查按钮是否最初是在带有
输入的UI上按下的。GetMouseButtonDown
。保存的
boolean
,然后在使用
Input.GetMouseButtonUp(0)
释放
按钮时使用。下面提供的解决方案可用于移动和桌面。移动测试和它的工作

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
}

你到底是怎么阻止它的?发布你所有负责移动的代码@ḞḹáḿíṅḡⱫỏḿ你不明白这个问题。我有一个脚本,在我释放鼠标按钮时使立方体移动。问题是:当我在画布上按下一个按钮时,立方体无论如何都会移动。当我按下画布按钮时,我不希望多维数据集移动。请阅读此部分,特别是
帮助他人重现问题
部分。如果失败,您可能会发现本教程很有用。此脚本适用于移动设备吗?@Dake Yes。它将在每个平台上运行。试试看,让我知道谢谢。只需将下面的脚本附加到你想要检测的游戏对象上,点击“你在谈论我的按钮吗?”@Dake No。别动
UI
按钮。你想检测你正在移动的游戏对象上的点击吗?然后将它连接到你移动的所有游戏对象上。如此简单。这是我收到的最好的答案之一。你应该得到的不仅仅是一个公认的答案。非常感谢。