Провел жесты на Android в единстве -- android поле с участием input поле с участием unity3d поле с участием touch поле с участием gestures пол Связанный проблема

swipe gestures on android in unity


4
vote

проблема

русский

Я пытаюсь получить единство, чтобы узнать, что я провожу оставить вправо, я решил, что, но моя проблема заключается в том, что это не понимает этого, пока я не поднимет свой палец с экрана.

Мой вопрос в том, как бы я сделал это так, чтобы он знал, что я пошел прямо, а потом ушел, а затем снова все, не принимая палец экрана

Вот код, который у меня есть до сих пор

 <код> using UnityEngine; using System.Collections;  public class Gestures : MonoBehaviour {  private Vector2 fingerStart; private Vector2 fingerEnd;  public int leftRight = 0; public int upDown = 0;  void Update () {     foreach(Touch touch in Input.touches)     {         if (touch.phase == TouchPhase.Began)         {             fingerStart = touch.position;             fingerEnd  = touch.position;         }         if (touch.phase == TouchPhase.Moved )         {             fingerEnd = touch.position;          }         if(touch.phase == TouchPhase.Ended)         {             if((fingerStart.x - fingerEnd.x) > 80 || (fingerStart.x - fingerEnd.x) < -80) // Side to side Swipe             {                 leftRight ++;             }             else if((fingerStart.y - fingerEnd.y) < -80 || (fingerStart.y - fingerEnd.y) > 80) // top to bottom swipe             {                 upDown ++;              }             if(leftRight >= 3){                  leftRight = 0;             }             if(upDown >= 4){                  upDown = 0;             }         }     } } }   
Английский оригинал

I'm trying to get unity to recognize that I am swiping left to right, I have solved that but my issue is that it doesn't understand this till I lift my finger off the screen.

My question is how would i make it so that it knows i went right and then left and then right again all without ever taking my finger of the screen

Here is the code I have so far

using UnityEngine; using System.Collections;  public class Gestures : MonoBehaviour {  private Vector2 fingerStart; private Vector2 fingerEnd;  public int leftRight = 0; public int upDown = 0;  void Update () {     foreach(Touch touch in Input.touches)     {         if (touch.phase == TouchPhase.Began)         {             fingerStart = touch.position;             fingerEnd  = touch.position;         }         if (touch.phase == TouchPhase.Moved )         {             fingerEnd = touch.position;          }         if(touch.phase == TouchPhase.Ended)         {             if((fingerStart.x - fingerEnd.x) > 80 || (fingerStart.x - fingerEnd.x) < -80) // Side to side Swipe             {                 leftRight ++;             }             else if((fingerStart.y - fingerEnd.y) < -80 || (fingerStart.y - fingerEnd.y) > 80) // top to bottom swipe             {                 upDown ++;              }             if(leftRight >= 3){                  leftRight = 0;             }             if(upDown >= 4){                  upDown = 0;             }         }     } } } 
</div
              

Список ответов

11
 
vote
vote
Лучший ответ
 

Проблема, которую вы обращены, заключается в том, что вы сделали свои чеки в сенсорнойфе. То, что вы хотите сделать, это выполнить ваши чеки в TouchPhase.Moved, с меньшим изменением значения (вы используете 80 в конечном итоге, попробуйте что-то вроде 10, если вы не работаете код)

Документация Unity на TouchPhase http://docs.unity3d.com/scripptreference/touchphase.html

.
 <код> jsconfig.json3  




Если вы хотите явно проверить на шаблон (то есть влево - и GT; вправо - & gt; слева), а не просто проверять, если это некоторое боковое / вертикальное движение в качестве кода, попробуйте код ниже. Просто не забудьте включить System.collentions.generic & amp; System.linq пространства имен

 <код> jsconfig.json4  



Редактировать Добавлен еще несколько кода в качестве образца

 <код> jsconfig.json5  



Вот как выглядит моя функция обновления. Обратите внимание на использование getmousebutton через input.touch

 <код> jsconfig.json6  
 

The issue you're facing is because you've done your checks in the TouchPhase.Ended. What you want to do is perform your checks in TouchPhase.Moved, with a smaller change in value (you're using 80 in Ended, try something like 10 if you the code doesn't work)

Unity's documentation on TouchPhase http://docs.unity3d.com/ScriptReference/TouchPhase.html

    foreach(Touch touch in Input.touches)     {          if (touch.phase == TouchPhase.Began)         {             fingerStart = touch.position;             fingerEnd  = touch.position;         }         if (touch.phase == TouchPhase.Moved )         {             fingerEnd = touch.position;              if((fingerStart.x - fingerEnd.x) > 80 ||                 (fingerStart.x - fingerEnd.x) < -80) // Side to side Swipe             {                 leftRight ++;             }             else if((fingerStart.y - fingerEnd.y) < -80 ||                      (fingerStart.y - fingerEnd.y) > 80) // top to bottom swipe             {                 upDown ++;              }             if(leftRight >= 3){                  leftRight = 0;             }             if(upDown >= 4){                  upDown = 0;             }              //After the checks are performed, set the fingerStart & fingerEnd to be the same             fingerStart = touch.position;             }         if(touch.phase == TouchPhase.Ended)         {             leftRight = 0;             upDown = 0;             fingerStart = Vector2.zero;             fingerEnd = Vector2.zero;         } 




If you want to explicitly check for a pattern (i.e. left -> right -> left), rather than just checking if it's some lateral / vertical movement as the code you have will do, try the below code. Just remember to include System.Collentions.Generic & System.Linq namespaces

private Vector2 fingerStart; private Vector2 fingerEnd;  public enum Movement {     Left,     Right,      Up,     Down };  public List<Movement> movements = new List<Movement>();   void Update () {     foreach(Touch touch in Input.touches)     {          if (touch.phase == TouchPhase.Began) {             fingerStart = touch.position;             fingerEnd  = touch.position;         }          if(touch.phase == TouchPhase.Moved) {             fingerEnd = touch.position;              //There is more movement on the X axis than the Y axis             if(Mathf.Abs(fingerStart.x - fingerEnd.x) > Mathf.Abs(fingerStart.y - fingerEnd.y)) {                  //Right Swipe                 if((fingerEnd.x - fingerStart.x) > 0)                     movements.Add(Movement.Right);                 //Left Swipe                 else                     movements.Add(Movement.Left);              }              //More movement along the Y axis than the X axis             else {                 //Upward Swipe                 if((fingerEnd.y - fingerStart.y) > 0)                     movements.Add(Movement.Up);                 //Downward Swipe                 else                     movements.Add(Movement.Down);             }             //After the checks are performed, set the fingerStart & fingerEnd to be the same             fingerStart = touch.position;                 //Now let's check if the Movement pattern is what we want             //In this example, I'm checking whether the pattern is Left, then Right, then Left again             Debug.Log (CheckForPatternMove(0, 3, new List<Movement>() { Movement.Left, Movement.Right, Movement.Left } ));         }           if(touch.phase == TouchPhase.Ended)         {             fingerStart = Vector2.zero;             fingerEnd = Vector2.zero;             movements.Clear();         }     } }   private bool CheckForPatternMove (int startIndex, int lengthOfPattern, List<Movement> movementToCheck) {      //If the currently stored movements are fewer than the length of the pattern to be detected     //it can never match the pattern. So, let's get out     if(lengthOfPattern > movements.Count)         return false;      //In case the start index for the check plus the length of the pattern     //exceeds the movement list's count, it'll throw an exception, so lets get out     if(startIndex + lengthOfPattern > movements.Count)         return false;      //Populate a temporary list with the respective elements     //from the movement list     List<Movement> tMovements = new List<Movement>();     for(int i = startIndex; i < startIndex + lengthOfPattern; i++)         tMovements.Add(movements[i]);      //Now check whether the sequence of movements is the same as the pattern you want to check for     //The SequenceEqual method is in the System.Linq namespace     return tMovements.SequenceEqual(movementToCheck); } 



EDIT Added some more code as a sample

    //The idea of a pattern match is to check for the exact same set of swipe gesture.     //This requires the following conditions to be met     // (a) The List of movements that need to be checked must be at least as long as the List of movements to check against.     // (b) The correct indices should be used for the startIndex. In this case I'm just using 0 as the startIndex.     // (c) Remember to clear the List right after you get a true return from the method, otherwise the next return will most likely be a false.       //Example - Training set is Left -> Right -> Left (This is what we want to check)     // Step 1 - User swipes LEFT, method returns false because there are too few Movements to check     // Step 2 - User swipes RIGHT, method returns false (same reason as above)      // Step 3a - User swipes RIGHT (L, R, R now) - false, incorrect pattern (L, R, R instead of L, R, L)     // Step 3b - User swipes LEFT (L, R, L now) - TRUE, Correct pattern!      //Immediately clear if Step 3b happens otherwise Step 4 will occur      // Step 4 - User swipes L or R (direction is immaterial right now), and method will return FALSE     // if you use the last three indexes!        //Pre-populating the movements List with L, R, L     movements = new List<Movement>()     {         Movement.Left,         Movement.Right,         Movement.Left     };      //Checking a match against an L, R, L training set     //This prints true to the console     Debug.Log (CheckForPatternMove(0, 3, new List<Movement>() { Movement.Left, Movement.Right, Movement.Left }  )); 



Here's how my Update function looks like. Note the usage of GetMouseButton over Input.touch

void Update () {      //Example usage in Update. Note how I use Input.GetMouseButton instead of Input.touch      //GetMouseButtonDown(0) instead of TouchPhase.Began     if (Input.GetMouseButtonDown(0)) {         fingerStart = Input.mousePosition;         fingerEnd  = Input.mousePosition;     }      //GetMouseButton instead of TouchPhase.Moved     //This returns true if the LMB is held down in standalone OR     //there is a single finger touch on a mobile device     if(Input.GetMouseButton(0)) {         fingerEnd = Input.mousePosition;          //There was some movement! The tolerance variable is to detect some useful movement         //i.e. an actual swipe rather than some jitter. This is the same as the value of 80         //you used in your original code.         if(Mathf.Abs(fingerEnd.x - fingerStart.x) > tolerance ||             Mathf.Abs(fingerEnd.y - fingerStart.y) > tolerance) {              //There is more movement on the X axis than the Y axis             if(Mathf.Abs(fingerStart.x - fingerEnd.x) > Mathf.Abs(fingerStart.y - fingerEnd.y)) {                 //Right Swipe                 if((fingerEnd.x - fingerStart.x) > 0)                     movements.Add(Movement.Right);                 //Left Swipe                 else                     movements.Add(Movement.Left);             }              //More movement along the Y axis than the X axis             else {                 //Upward Swipe                 if((fingerEnd.y - fingerStart.y) > 0)                     movements.Add(Movement.Up);                 //Downward Swipe                 else                     movements.Add(Movement.Down);             }              //After the checks are performed, set the fingerStart & fingerEnd to be the same             fingerStart = fingerEnd;              //Now let's check if the Movement pattern is what we want             //In this example, I'm checking whether the pattern is Left, then Right, then Left again             Debug.Log (CheckForPatternMove(0, 3, new List<Movement>() { Movement.Left, Movement.Right, Movement.Left } ));         }     }      //GetMouseButtonUp(0) instead of TouchPhase.Ended     if(Input.GetMouseButtonUp(0)) {         fingerStart = Vector2.zero;         fingerEnd = Vector2.zero;         movements.Clear();     }   } 
</div
 
 
       
       

Связанный проблема

7  Мигающий фон  ( Flashing background ) 
У меня есть <код> LinearLayout с несколькими <код> Buttons и <код> TextViews . Я хочу, чтобы мой фон прошился на временных интервалах, скажем из красного до...

0  Как мне изменить стиль кнопки в Android?  ( How do i change the style of a button in android ) 
Я хочу изменить стиль кнопки в приложении Android. Вот картинка, которая имеет оба вида кнопок, то, что у меня есть сейчас, и тот, который я хочу переключитьс...

0  Получить почту пользователя, используя FQL  ( Get user email using fql ) 
Я использую следующий FQL, чтобы получить дни рождения из Facebook (я знаю, что API TEH изменился) Однако я хочу продолжить с этим: <код> String fqlQuery = ...

0  Набор ToggleButton состояние из входящих данных JSON  ( Set togglebutton status from incoming json data ) 
<Р> Я пытаюсь следовать Android учебник , чтобы изменить базу данных MySQL данные из приложения Android. Я довольно новый для концепции JSON синтаксического р...

4  Создайте VCARD, который можно скачать на Android с помощью ASP.NET  ( Generate vcard that can be downloaded on android using asp net ) 
Я пробую довольно некоторое время, чтобы сгенерировать VCARD, используя ASP.NET (C #), которые можно загрузить на устройство Android. Процесс генерации карт...

7  Как портировать родной C-код на Android  ( How to port native c code on android ) 
Кто-нибудь может сказать мне, как портировать нативную программу C на платформе Android ..умел ли я включить некоторые библиотеки C или как именно ...? Спас...

2  Android Soundpool Heast Limits  ( Android soundpool heap limits ) 
Я использую Soundpool, чтобы загрузить несколько звуковых клипов и воспроизводить их обратно. Это правильно функционирует на 100% от того, что я могу сказат...

0  Разница между установкой APK с ADB и Eclipse  ( Difference between installing an apk with adb and eclipse ) 
У меня есть приложение, которое закрывается после того, как он закончен. Если я устанавливаю его через Eclipse, он работает нормально, но если я устанавливаю ...

0  Получить данные с удаленного сервера в Android  ( Get data from remote server in android ) 
Я использую Oracle DB и WEBLOGIC как веб-сервер. Из моего приложения для Android я могу отправлять параметры на мой удаленный сервер .. Моя проблема заключает...

8  Когда Android остановит свой процессор без блокировки Wake?  ( When will android stop its cpu without wake lock ) 
Я знаю, что Android использует Sake Blance, чтобы поддерживать запуск CPU или на экране. Очевидно, что Screen Sake Box предотвращает выключение экрана активно...

0  Бросить исключение, если код ответа не 20x  ( Throw exception if response code isnt 20x ) 
Я использую библиотеку koush Ion, и я хочу знать, есть ли возможность бросить исключение, если код ответа не 20x (например, если это 400, 401 и т. Д.). ...

0  Автоматически заканчивать приложение / или автоматическое уничтожение приложения, поставляемое в Android?  ( Automatically finish an app or auto destroy app posible in android ) 
Два вопроса: 1) Я хочу добавить к моему приложению возможность автоматически выхода через несколько минут бездействия. Что я подразумеваю под автоматическим в...

38  Android / iOS одноранговая архитектура [закрыто]  ( Android ios peer to peer architecture ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыт . Этот вопрос должен быть больше Фокусированный . В настоя...

1  Обновление поле PDF штрих-кода в IOS и устройстве Android  ( Updating a pdf barcode field in ios and android device ) 
Я создал одну корпус Acrobat, используя радиообъекты, текстовое поле, кнопку, флажок и штрих-код в Adobe Acrobat Pro. После этого я открыл эту форму в Adobe...

18  Не может решить импорт LocalBroadCastManager на оператор Android.support.v4.content.localboadcastmanager;  ( Can not resolve import localbroadcastmanager on statement android support v4 con ) 
Я получил эту ошибку при импорте проекта Eclipse на Android Studio. Он показывает предложение добавить библиотеку <код> Gradle: com.android.support:support-co...