У меня проблема с тем, что когда я нажимаю кнопку play, чтобы протестировать свою игру в редакторе Unity, у меня есть некоторые функции, которые выполняются в OnMouseUp (), и я заметил, что иногда они не работали или выполнялись в странное время,Когда я начал отладку, я заметил, что когда я щелкаю трекпадом, это нормально, но когда я нажимаю на трекпаде, это регистрирует событие нажатия мыши, но не событие повышения мыши.Таким образом, технически пользователь может «щелкнуть» по объекту, не вызывая событие «вверх» (пожалуйста, не говорите мне использовать событие «вниз», это невозможно для того, что я пытаюсь сделать).
Я не сомневаюсь, что у нас будут пользователи, играющие на ноутбуке с трекпадом, поэтому я не хочу, чтобы это стало для них проблемой.Могу ли я это исправить, используя сенсорную систему Unity в соответствии с щелчками мыши?
Я на Mac, если это вообще помогает.Мы выпустим игру для Windows, Mac, iOS и Android.Дайте мне знать, если вам нужна дополнительная информация.Я просто пытаюсь получить общую информацию.Я провел много исследований, но на самом деле я не нашел ничего, связанного с тем, с чем я имею дело.
Заранее благодарен за любую помощь, которую вы можете оказать!
РЕДАКТИРОВАТЬ:
Я работал над этой проблемой, и у меня есть связанный вопрос.Кто-то разместил ссылку, но я думаю, она была удалена.Ссылка была здесь: Мышь против подправить в 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 («Мышь или касание»).«зарегистрирован вниз») запускает каждый кадр, что, в свою очередь, означает, что touch.phase == TouchPhase.Began, по-видимому, всегда работает, даже когда мой палец не на трекпаде.С чего бы это?touch создается только тогда, когда touchcount> 0, поэтому я не понимаю, почему он должен срабатывать, прежде чем положить палец на трекпад.Кто-нибудь может помочь с этим?
РЕДАКТИРОВАТЬ 2:
Я попытался добавить это в функцию Awake:
if (SystemInfo.deviceType != DeviceType.Handheld)
{
Input.simulateMouseWithTouches = false;
}
Затем я создал некоторую логику отладки, чтобы определить, является ли трекпадкасание было касанием или мышкой вниз (я должен был сделать это первым, но я нуб, и мне потребовалось так много времени, чтобы понять это).
Это мышь вниз.
Iне знаю, что делать, знать.Как различить нажатия на трекпад и нажатия трекпада, если они оба работают как нажатие мыши?
Пожалуйста, помогите!
Чарли