我的脚本使Input.GetMouseButtonUp(0)
上的GameObject移动。不幸的是,当我点击UI Button
时,移动功能被触发,导致GameObject移动。如何检测鼠标左键单击,但在UI上发生单击时没有按钮组件
当我按下屏幕上的按钮(UI元素)时,我不希望我的GameObject移动。当点击位于UI组件(如Button
)上时,我想阻止GameObject移动?我该如何补救?另外,我想检查是否鼠标被点击超过具体 UI元素(2或3个按钮)
我的脚本使Input.GetMouseButtonUp(0)
上的GameObject移动。不幸的是,当我点击UI Button
时,移动功能被触发,导致GameObject移动。如何检测鼠标左键单击,但在UI上发生单击时没有按钮组件
当我按下屏幕上的按钮(UI元素)时,我不希望我的GameObject移动。当点击位于UI组件(如Button
)上时,我想阻止GameObject移动?我该如何补救?另外,我想检查是否鼠标被点击超过具体 UI元素(2或3个按钮)
看完评论。你需要的是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
,然后您可以使用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
}
此脚本适用于移动设备吗? – Dake
@Dake是的。它将在每个平台上。试试吧,让我知道 – Programmer
谢谢。 “只需将下面的脚本附加到您想检测的GameObject上点击”您正在谈论我的按钮? – Dake
我打赌有更好的解决方案,但在我脑海的第一件事是:
检查你是否点击一个UI元素,在鼠标移动事件中移动你的对象。
您可以通过使用GraphicsRaycaster
在您的鼠标位置上投射光线来检查您是否击中了UI元素。如果它碰到任何东西,那么你点击任何画布。
请参见:https://docs.unity3d.com/Manual/script-GraphicRaycaster.html
我猜你正在使用Update()
方法来处理鼠标输入,没有适当的条件。我建议你改变你的代码,使用交互与UI元素,而不是鼠标按钮等
例子:所有在屏幕上创建一个看不见的大UI面板但必须一切其他落后UI帆布。然后在它上面添加一个按钮组件,并通过OnClick()
这个按钮的事件来控制你的移动。 (如果能解决问题,请投票支持他人)
你是如何完全阻止它的? –
发布所有负责移动的代码 –
@ḞḹáḿíṅḡⱫỏḿƀíé您不明白这个问题。当我释放鼠标按钮时,我有一个脚本可以让多维数据集移动。问题是:当我在画布上按下按钮时,无论如何,立方体都会移动。当我按下画布按钮时,我不希望立方体移动。 – Dake