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
按钮。你想检测你正在移动的游戏对象上的点击吗?然后将它连接到你移动的所有游戏对象上。如此简单。这是我收到的最好的答案之一。你应该得到的不仅仅是一个公认的答案。非常感谢。