Author Topic: Adding Muti-touch gestures to NGUI  (Read 1980 times)

Aurigan

  • Newbie
  • *
  • Thank You
  • -Given: 2
  • -Receive: 0
  • Posts: 21
    • View Profile
Adding Muti-touch gestures to NGUI
« on: August 20, 2016, 12:15:31 AM »
Hi all, this question has been asked a few times but after searching through everything I could find there still doesn't seem to be an easy way to add gestures like pinch-zoom to an NGUI project. My specific need is to add pinch-zoom to a map made up of hexagons where each is currently an NGUI sprite/button on a scroll view.

The closest I've come is finding https://github.com/TouchScript/TouchScript which a couple of years ago Aren wrote some integration for (http://www.tasharen.com/forum/index.php?topic=4984.msg56678#msg56678). The integration script requires an older version of TouchScript that's a few hundred commits behind current ... I tried updating it with 8.2 and Unity 5.4 (added below) which gets me a compiling project but then really no idea what to do next :)

Are there any easier solutions out there? What are devs using for mobile these days? Anyone have an example of how to detect pinches without breaking all of the other touch/mouse events?

  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. // Download the appropriate TouchScript 8.2 package here:
  6. // https://github.com/TouchScript/TouchScript/releases/tag/8.2
  7.  
  8. using TouchScript;
  9. using TouchScript.InputSources;
  10.  
  11. /// <summary>
  12. /// Bridge script between TouchScript and NGUI. Simply attach this script to any game object.
  13. /// </summary>
  14.  
  15. public class TouchScriptNGUI : MonoBehaviour
  16. {
  17.         static public TouchScriptNGUI instance;
  18.  
  19.         /// <summary>
  20.         /// Whether the multi-touch should be enabled or not.
  21.         /// </summary>
  22.  
  23.         static public bool isEnabled
  24.         {
  25.                 get
  26.                 {
  27.                         if (instance != null) return instance.enabled;
  28.                         return PlayerPrefs.GetInt("Multitouch", 1) == 1;
  29.                 }
  30.                 set
  31.                 {
  32.                         PlayerPrefs.SetInt("Multitouch", value ? 1 : 0);
  33.                         if (instance != null) instance.enabled = value;
  34.                 }
  35.         }
  36.  
  37.         [System.NonSerialized] bool mActive = false;
  38.         [System.NonSerialized] BetterList<UICamera.Touch> mTouches = new BetterList<UICamera.Touch>();
  39.  
  40.         void Awake ()
  41.         {
  42.                 if (instance == null)
  43.                 {
  44.                         enabled = isEnabled;
  45.                         instance = this;
  46.                 }
  47.                 else Destroy(gameObject);
  48.         }
  49.  
  50.         void OnDestroy () { if (instance == this) instance = null; }
  51.  
  52.         void OnEnable ()
  53.         {
  54.                 mActive = true;
  55.                 NGUITools.AddMissingComponent<TouchManager>(gameObject);
  56.  
  57.                 UICamera.GetInputTouchCount = OnGetTouchCount;
  58.                 UICamera.GetInputTouch = OnGetTouch;
  59.  
  60.                 ITouchManager instance = TouchManager.Instance;
  61.                 instance.TouchesBegan += OnTouchBegan;
  62.                 instance.TouchesEnded += OnTouchEnded;
  63.                 instance.TouchesMoved += OnTouchMove;
  64.                 instance.TouchesCancelled += OnTouchCancel;
  65.  
  66.         }
  67.  
  68.         void OnDisable ()
  69.         {
  70.                 if (mActive)
  71.                 {
  72.                         mActive = false;
  73.                         UICamera.GetInputTouchCount = null;
  74.                         UICamera.GetInputTouch = null;
  75.                         ITouchManager instance = TouchManager.Instance;
  76.  
  77.                         if (instance != null)
  78.                         {
  79.                                 instance.TouchesBegan -= OnTouchBegan;
  80.                                 instance.TouchesEnded -= OnTouchEnded;
  81.                                 instance.TouchesMoved -= OnTouchMove;
  82.                                 instance.TouchesCancelled -= OnTouchCancel;
  83.                         }
  84.                         mTouches.Clear();
  85.                 }
  86.         }
  87.  
  88.         int OnGetTouchCount () { return mTouches.size; }
  89.         UICamera.Touch OnGetTouch (int index) { return mTouches[index]; }
  90.  
  91.         void OnTouchBegan (object sender, TouchEventArgs e)
  92.         {
  93.                 foreach (TouchPoint touch in e.Touches)
  94.                 {
  95.                         if (touch.Tags.HasTag(Tags.INPUT_MOUSE)) continue;
  96.  
  97.                         mTouches.Add(new UICamera.Touch()
  98.                                 {
  99.                                         phase = TouchPhase.Began,
  100.                                         fingerId = touch.Id,
  101.                                         position = touch.Position,
  102.                                         tapCount = 1
  103.                                 });
  104.                 }
  105.         }
  106.  
  107.         void OnTouchEnded (object sender, TouchEventArgs e)
  108.         {
  109.                 foreach (TouchPoint touch in e.Touches)
  110.                 {
  111.                         if (touch.Tags.HasTag(Tags.INPUT_MOUSE)) continue;
  112.  
  113.                         for (int index = 0; index < mTouches.size; ++index)
  114.                         {
  115.                                 UICamera.Touch t = mTouches[index];
  116.  
  117.                                 if (t.fingerId == touch.Id)
  118.                                 {
  119.                                         t.phase = TouchPhase.Ended;
  120.                                         t.position = touch.Position;
  121.                                         break;
  122.                                 }
  123.                         }
  124.                 }
  125.         }
  126.  
  127.         void OnTouchMove (object sender, TouchEventArgs e)
  128.         {
  129.                 foreach (TouchPoint touch in e.Touches)
  130.                 {
  131.                         if (touch.Tags.HasTag(Tags.INPUT_MOUSE)) continue;
  132.  
  133.                         for (int index = 0; index < mTouches.size; ++index)
  134.                         {
  135.                                 UICamera.Touch t = mTouches[index];
  136.  
  137.                                 if (t.fingerId == touch.Id)
  138.                                 {
  139.                                         t.position = touch.Position;
  140.                                         break;
  141.                                 }
  142.                         }
  143.                 }
  144.         }
  145.  
  146.         void OnTouchCancel (object sender, TouchEventArgs e) { OnTouchEnded(sender, e); }
  147.  
  148.         void LateUpdate ()
  149.         {
  150.                 int index = 0;
  151.  
  152.                 while (index < mTouches.size)
  153.                 {
  154.                         UICamera.Touch touch = mTouches[index];
  155.  
  156.                         if (touch.phase == TouchPhase.Ended)
  157.                         {
  158.                                 mTouches.RemoveAt(index);
  159.                         }
  160.                         else
  161.                         {
  162.                                 touch.phase = TouchPhase.Moved;
  163.                                 ++index;
  164.                         }
  165.                 }
  166.         }
  167. }