Уничтожить событие GetMouseButtonDown и расположить или заставить кнопку мыши подняться

Когда я запускаю свое приложение на Android, первое касание пальца вызывает Input.GetMouseButtonDown(0), а второе касание вызывает Input.GetMouseButtonDown(1). В некоторых случаях я хочу переопределить GetMouseButtonDown(0), поэтому касание второго пальца (1) станет первым (0), и я не знаю, как это сделать. Либо это, либо как заставить mouseButtonUp при первом касании пальцем - я хочу удалить этот первый «щелчок» из системы, чтобы он не использовал Input.mousePosition в случае 2 касаний.

Почему? Я создаю приложение для рисования, когда пользователь может рисовать линии. Есть область, где пользователь может рисовать (в прямоугольнике), и область, где он не должен, я знаю, как обнаружить нажатие на нежелательную область. Но иногда моя ладонь создает нежелательное первое касание Input.GetMouseButtonDown(0) в нежелательной области (без Input.GetMouseButtonUp(0)), и когда я начинаю рисовать линию, Input.mousePosition получает среднее значение обоих касаний, поэтому мне просто нужен способ удалить касание «вниз». щелкните из системы. Или другой способ решить мою проблему.

Вот мой код:

 if (Input.touchCount == 0)
    { screenPoint = new Vector3(0, 0, 0); 
     currentTouch = 4;  //currentTouch is for GetMouseButtonUp(currentTouch)  }

    for (int i=0; i< Input.touchCount; i++)
    {
      touch = Input.GetTouch(i);
      screenPointTemp = touch.position;
      screenPointTemp3 = new Vector3(screenPointTemp.x, screenPointTemp.y, zCam);

       //if the touch is in a "good" zone-
      if (Camera.main.ScreenToWorldPoint(screenPointTemp3).z > BottomNod.transform.position.z - nodeScale) 
      {
          screenPoint = touch.position;
          currentTouch = i;
       }

        }
    }

if (Input.GetMouseButtonUp(currentTouch))
        {...}

person SHAI    schedule 09.07.2017    source источник


Ответы (1)


При работе на мобильных устройствах для обнаружения прикосновения к экрану без нажатия на какой-либо объект следует использовать Input.touchCount с Input.GetTouch или Input.touches. Хотя я настоятельно рекомендую Input.GetTouch, так как он даже не выделяет временные переменные, такие как Input.touches. Чтобы получить позицию касания, используйте Input.GetTouch(index).position.

Каждая из этих функций возвращает Touch, поэтому вы можете использовать Touch.fingerId, чтобы определять/отслеживать количество одновременных касаний. Вы также можете использовать индекс, который передается в Input.GetTouch, чтобы отслеживать касание. Это полностью зависит от вас.

Это обнаруживает каждое касание, перемещение и подъем на мобильных устройствах:

for (int i = 0; i < Input.touchCount; ++i)
{
    //Touch Down
    if (Input.GetTouch(i).phase == TouchPhase.Began)
    {

    }

    //Touch Moved
    if (Input.GetTouch(i).phase == TouchPhase.Moved)
    {

    }

    //Touch Up
    if (Input.GetTouch(i).phase == TouchPhase.Ended)
    {

    }
}

Ограничение только одним касанием (используйте индекс 0):

if (Input.touchCount == 1)
{
    //Touch Down
    if (Input.GetTouch(0).phase == TouchPhase.Began)
    {

    }

    //Touch Moved
    if (Input.GetTouch(0).phase == TouchPhase.Moved)
    {
        //Draw?
    }

    //Touch Up
    if (Input.GetTouch(0).phase == TouchPhase.Ended)
    {

    }
}

Как я уже сказал, вы можете ограничить это с помощью fingerId. Реализация зависит от того, что именно вы хотите.

person Programmer    schedule 10.07.2017
comment
Эй, спасибо, я не должен ограничиваться одним касанием, потому что, если я сделаю это, когда пользователь коснется первого касания (по ошибке) ладонью в нежелательной зоне, не заметив этого, он не поймет, почему, когда он коснется экрана ( второе касание) ничего не произойдет... Я добавил свой код в свой вопрос, это было мое решение, но у меня все еще есть проблемы - когда первое касание неправильное, а второе правильное, когда я отпускаю первое касание (GetMouseButtonUp(CurrentTouch)) == правда, и я не хочу, чтобы это было правдой. - person SHAI; 10.07.2017
comment
Также, когда я использую Input.GetTouch, я не могу проверить его на единстве с помощью мыши. - person SHAI; 10.07.2017
comment
Вам нужно использовать Unity Remote для тестирования или используйте макрос Unity (#if UNITY_EDITOR) для разделения кода GetMouseButtonUp. - person Programmer; 10.07.2017
comment
когда пользователь при первом касании (по ошибке) коснется ладонью нежелательной зоны, не заметив этого, он не поймет, почему при касании экрана (втором касании) ничего не произойдет В таком случае , первое касание должно считаться действительным и использоваться, но пока первое касание все еще активно, остальные касания следует игнорировать? - person Programmer; 10.07.2017
comment
В этом конкретном случае первое касание, которое является ошибкой, должно быть проигнорировано, а второе должно быть допустимым. Ваш ответ был не совсем решением, но я заменил свой GetMouseButtonUp на ваш TouchPhase.Ended, и это решило мою проблему, так что спасибо. - person SHAI; 10.07.2017
comment
Ага. Мне не было дано прямого ответа. Это было сделано, чтобы показать вам, какой API вы должны использовать. Рад, что смог помочь. - person Programmer; 10.07.2017