在Unity中,触控板的点击仅算作鼠标按下,不算作鼠标

时间:2019-03-01 22:32:20

标签: c# unity3d

我遇到一个问题,当我在Unity Editor中打游戏以测试我的游戏时,我有一些函数在OnMouseUp()上执行,并且我发现有时它们不起作用,或者在奇怪的时间执行。当我开始调试时,我注意到当我用触控板单击时,这是正常现象,但是当我在触控板上 tap 时,它会记录一个鼠标按下事件,而不是鼠标按下事件。因此,从技术上讲,用户可以在不触发鼠标上移事件的情况下“单击”对象(请不要告诉我使用鼠标下移事件,因为我要执行的操作是不可能的)。

我毫不怀疑我们会在带触控板的笔记本电脑上玩游戏的用户,因此我不希望这对他们来说成为问题。我可以通过结合鼠标单击使用Unity的触摸系统来解决此问题吗?

如果有帮助,我在Mac上。我们将在Windows,Mac,iOS和Android上发布游戏。让我知道您是否需要更多信息。我只是想获得一般信息。我做了很多研究,但实际上并没有发现与我正在处理的事情完全相关的事情。

在此先感谢您提供的任何帮助!

编辑:

我一直在研究这个问题,并有一个相关的问题。有人发布了链接,但我想它已被删除。链接在这里:Mouse up vs. touch up in Unity。我认为我的问题可能与您有关。我决定尝试使用Unity Touch系统来查看是否可以修复它。这是我的代码(这是创建滑动手势功能的脚本):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Ibuprogames.CameraTransitionsAsset;

public class SwipeColliderScript : MonoBehaviour {

    [HideInInspector]
    public float mouseDistance;
    Vector3 lastPosition;
    bool trackMouse;
    [HideInInspector]
    public bool isSwipe;
    [HideInInspector]
    public bool swipeRight;
    [HideInInspector]
    public bool swipeLeft;
    private Touch touch;

    private void Awake()
    {
        swipeLeft = false;
        swipeRight = false;
    }

    // Update is called once per frame
    void Update()
    {

        if (Input.GetMouseButtonDown(0) && Input.touchCount > 0)
            {
            touch = Input.GetTouch(0);
            Debug.LogError("Touch activated");
            }

        if (Input.GetMouseButtonDown(0) || touch.phase == TouchPhase.Began)
            {
                trackMouse = true;
                isSwipe = false;
                lastPosition = Input.mousePosition;
                Debug.LogError("Mouse or tap down registered");
            }
            else if (Input.GetMouseButtonUp(0) || touch.phase == TouchPhase.Ended)
            {
                trackMouse = false;
                Debug.LogError(@"Mouse held for " + mouseDistance + "pixels!");

                mouseDistance = 0;
            }

            if (trackMouse)
            {
                Vector3 newPosition = Input.mousePosition;
                mouseDistance += (newPosition.x - lastPosition.x);

                if (mouseDistance > 20 || mouseDistance < -20){
                    isSwipe = true;
                }

                if (mouseDistance > 20)
                {
                    swipeLeft = true;
                    swipeRight = false;
                }
                else if (mouseDistance < -20)
                {
                    swipeRight = true;
                    swipeLeft = false;
                }

                lastPosition = newPosition;
            }
       }
  }

我认为类似的解决方案将起作用,但是现在我的问题是Debug.LogError(“ Mouse or tap downregistered”)触发每一帧,这又意味着touch.phase == TouchPhase.Began即使我的手指不在触控板上,显然一直都是如此。为什么会这样呢?仅在touchcount> 0时才创建touch,所以我不知道为什么在将手指放在触控板上之前会触发它。有人可以帮忙吗?

编辑2:

我尝试将其添加到Awake函数中

if (SystemInfo.deviceType != DeviceType.Handheld)
        {
            Input.simulateMouseWithTouches = false;
        }

然后,我创建了一些调试逻辑来确定触控板的轻触是触摸还是鼠标按下(我应该先这样做,但我是菜鸟,花了我很长时间才意识到这一点)。

按下鼠标即可。

我真的不知道该怎么做。如果触控板点击和触控板点击都起着鼠标按下的作用,我该如何区分?

请帮助!

查理

1 个答案:

答案 0 :(得分:0)

好吧,我得出的结论是,我无法分辨是按下触控板还是单击鼠标来按下鼠标,所以我决定重新编写脚本,使其仅适用于Unity触控系统。这样,手势只能在手持设备上使用,并且触控板没有问题,因为我使用的是触摸而不是按下鼠标。如果您有兴趣,这是我的脚本。我并没有更改变量的所有名称,但是所有相关的位都已更改为使用touch。如果您发现我错过的任何错误,请向我指出。希望这可以帮助某人:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Ibuprogames.CameraTransitionsAsset;

public class SwipeColliderScript : MonoBehaviour {

    [HideInInspector]
    public float mouseDistance;
    Vector3 lastPosition;
    bool trackMouse;
    [HideInInspector]
    public bool isSwipe;
    [HideInInspector]
    public bool swipeRight;
    [HideInInspector]
    public bool swipeLeft;

    // Update is called once per frame
    void Update()
    {
        if (SystemInfo.deviceType == DeviceType.Handheld)
        {
            if (Input.touchCount == 1)
            {
                Debug.LogError("touch down registered");
                Touch touch = Input.GetTouch(0);

                if (touch.phase == TouchPhase.Began)
                {
                    trackMouse = true;
                    isSwipe = false;
                    lastPosition = touch.position;
                    Debug.LogError("Mouse down registered");
                }
                else if (touch.phase == TouchPhase.Ended)
                {
                    trackMouse = false;
                    Debug.LogError(@"Swipe held for " + mouseDistance + "pixels!");

                    mouseDistance = 0;
                }

                if (trackMouse)
                {
                    Vector3 newPosition = touch.position;
                    mouseDistance += (newPosition.x - lastPosition.x);

                    if (mouseDistance > 20 || mouseDistance < -20)
                    {
                        isSwipe = true;
                    }

                    if (mouseDistance > 20)
                    {
                        swipeLeft = true;
                        swipeRight = false;
                    }
                    else if (mouseDistance < -20)
                    {
                        swipeRight = true;
                        swipeLeft = false;
                    }

                    lastPosition = newPosition;
                }
            }
        }
     }
  }