Unity中的Mouse up和Touch up有什么区别?

3
我有一个小问题。我似乎找不到一种好的方法来区分Unity是否在触发鼠标抬起事件或者是触摸屏幕后释放手指的触摸抬起事件。我的问题是:用户同时释放选择的内容并点击UI按钮(换句话说,我正在尝试检测仅鼠标抬起或仅触摸抬起 - 我该如何做到这一点?)。我尝试使用Input.GetMouseButtonUp(0)和Input.GetMouseButton(0),但两者都会更改它们的状态以响应触摸抬起或鼠标按钮抬起事件。那么,如何正确区分二者?我甚至尝试了使用Touch.fingerId属性来跟踪/区分仅限于触摸事件,但问题在于,即使是在触摸抬起事件的情况下,我仍然无法仅区分鼠标抬起与Input.GetMouseButton(0)。是否有人知道在Unity中分别检测鼠标或触摸释放的正确方法?
编辑: 有人没有理解这个问题,所以我们假设你有一台支持触摸的桌面设备,并添加此脚本:
void Update () {
    if (Input.GetMouseButtonDown(0))
        Debug.Log("Mouse button down.");
    if (Input.GetMouseButtonUp(0))
        Debug.Log("Mouse button up.");
}

如果您用鼠标左键点击并按住,接着用手指触摸屏幕并松开,这时会记录鼠标按钮抬起的事件,尽管您并没有释放鼠标按钮。我该如何区分鼠标抬起和触摸释放事件?

2个回答

8

针对桌面设备:

  • 鼠标按下 - Input.GetMouseButtonDown
  • 鼠标松开 - Input.GetMouseButtonUp

示例:

if (Input.GetMouseButtonDown(0))
{
    Debug.Log("Mouse Pressed");
}

if (Input.GetMouseButtonUp(0))
{
    Debug.Log("Mouse Lifted/Released");
}

对于移动设备

  • 按下触摸 - TouchPhase.Began
  • 释放触摸 - TouchPhase.Ended

示例:

if (Input.touchCount >= 1)
{
    if (Input.touches[0].phase == TouchPhase.Began)
    {
        Debug.Log("Touch Pressed");
    }

    if (Input.touches[0].phase == TouchPhase.Ended)
    {
        Debug.Log("Touch Lifted/Released");
    }
}

如果你发现在点击某个UI元素时会误触其他元素,请参考这篇文章,了解如何正确地检测任何类型的游戏对象上的点击事件。


你没有理解问题,因此我将编辑我的问题。 - Alexandru
问题是桌面设备可以支持触摸屏,因此如果您在按住左鼠标按钮的同时释放触摸,则Input.GetMouseButtonUp(0)实际上将计算为true,但我需要一种确定是否仅释放了左鼠标按钮的方法。 - Alexandru
我曾经看到人们在移动设备和桌面上都使用 Input.GetMouseButton。虽然它可能有效,但这是错误的。请注意我的答案中将两个示例分开。我期望你在运行时使用 Application.isMobilePlatform 来确定使用哪一个,或者在编译时使用 Unity 的指令来确定。 - Programmer
这里真正的问题在于Unity默认情况下会触发鼠标函数来模拟鼠标功能,但很少有文档告诉你需要禁用此行为。这可能会在同时具有鼠标和触摸显示屏的桌面设备上产生一些严重的错误。 - Alexandru
这实际上是一个非常好的功能。Unity 的理念是让一切变得简单,而且它确实做到了。对于新手 Unity 用户来说,这个功能非常有用,同时也适用于制作原型,以便您的简单代码可以在移动设备上进行测试,但一旦涉及到处理多点触控,您就必须使用 Touch 类并分离输入,否则会遇到问题。 - Programmer
这不是一个坏特性,但我希望它能在这里记录下来(比如备注说明触摸的情况以及如何禁用它们):https://docs.unity3d.com/ScriptReference/Input.GetMouseButtonUp.html - Alexandru

2

我想通了。

我错过了这个调用:Input.simulateMouseWithTouches = false;

如果你只在Start()事件中设置它,它似乎可以工作(我可能错了,也许你需要在第一个Input访问器之前设置它并在更新时测试一下)。否则,Unity将从触摸事件模拟鼠标事件。我只能猜测他们这样做是为了让游戏开发人员更容易地编写一次跨平台游戏。

注意:一旦设置,它就会全局设置,因此您甚至需要在稍后加载的不同场景中取消设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接