我遇到一个问题,当我在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;
}
然后,我创建了一些调试逻辑来确定触控板的轻触是触摸还是鼠标按下(我应该先这样做,但我是菜鸟,花了我很长时间才意识到这一点)。
按下鼠标即可。
我真的不知道该怎么做。如果触控板点击和触控板点击都起着鼠标按下的作用,我该如何区分?
请帮助!
查理
答案 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;
}
}
}
}
}