1. 程式人生 > >NGUI與EasyTouch結合使用

NGUI與EasyTouch結合使用

idt 可能 點擊 ngui itoo pre led 小問題 超過

用了EasyTouch插件一段時間了,小問題還是有一些,總體來說用起來還行。這篇文章我就來說說EasyTouch和NGUI的結合。

總體來說觸摸屏幕也就三種情況。

1.觸摸事件只響應NGUI部分,不響應3D部分。

2.觸摸事件只響應3D部分,不響應NGUI部分。

3.觸摸事件同時響應。

舉個例子,在戰鬥場景我們希望通過手指滑動來控制攝像機的旋轉。但是這時屏幕上可能還有一些UI的按鈕,但是我們不希望用戶點擊UI按鈕也影響到了攝像機的旋轉。所以此時我們只希望觸摸事件在3D部分響應。

1. 如下圖所示,這裏我增加了一個UISprite,我希望我的手指觸摸事件只在UI上響應,不在3D上響應

 1 using
UnityEngine; 2 using System.Collections; 3 4 public class UImomo : MonoBehaviour { 5 //頭像 6 GameObject icon; 7 void Start () 8 { 9 icon = transform.Find("icon").gameObject; 10 //添加一個手指滑動的事件。 11 EasyTouch.On_SwipeEnd += EasyTouch_On_SwipeEnd; 12 } 13
14 void OnDestroy() 15 { 16 //施放一個手指滑動的事件。 17 EasyTouch.On_SwipeEnd -= EasyTouch_On_SwipeEnd; 18 } 19 20 //當手指滑動結束時在這裏 21 void EasyTouch_On_SwipeEnd(Gesture gesture) 22 { 23 //判斷手指是否觸摸在NGUI的頭像中 24 if(gesture.IsStartInRect(NGUIObjectToRect(icon)))
25 { 26 //輸出手指滑動的方向 27 Debug.Log(gesture.swipe); 28 } 29 } 30 31 //計算出NGUI某個UISprite或者UITexture或者 UILabel 在屏幕中占的矩形位置。 32 private Rect NGUIObjectToRect(GameObject go) 33 { 34 Camera camera = NGUITools.FindCameraForLayer(go.layer); 35 Bounds bounds = NGUIMath.CalculateAbsoluteWidgetBounds(go.transform); 36 Vector3 min = camera.WorldToScreenPoint(bounds.min); 37 Vector3 max = camera.WorldToScreenPoint(bounds.max); 38 return new Rect(min.x, min.y, max.x - min.x, max.y - min.y); 39 } 40 41 }

2.我希望手指觸摸只響應3D,不響應NGUI 。這裏其實更多的運用於遊戲的戰鬥界面,戰鬥界面的UI一般都集中在屏幕的四個角, 比如頭像 小地圖 技能 搖桿等等。EasyTouch提供了NGUI模式,可以很方便的解決這個問題,不過它原理也是用射線來判斷,所以你要確保需要略過的UI空間有BoxCollider組件。

我們把所有NGUI做的界面放在UI層上面。代碼簡單的改改,這樣EasyTouch就不會在UI層上響應了。

 1 void Start () 
 2     {
 3         icon = transform.Find("icon").gameObject;
 4         //添加一個手指滑動的事件。
 5         EasyTouch.On_SwipeEnd += EasyTouch_On_SwipeEnd;
 6         //得到UI攝像機
 7         Camera uiCamera = GameObject.Find("UI Root/Camera").GetComponent<Camera>();
 8         if(uiCamera != null)
 9         {
10             //啟動NGUI模式
11             EasyTouch.instance.enabledNGuiMode = true;
12             //把NGUI攝像機加入過濾隊列
13             if(!EasyTouch.instance.nGUICameras.Contains(uiCamera))
14             {
15                 EasyTouch.instance.nGUICameras.Add(uiCamera);
16             }
17             //設置需要過濾的UI層
18             EasyTouch.instance.nGUILayers = (1 << LayerMask.NameToLayer("UI"));
19         }
20     }
21  
22     void OnDestroy()
23     {
24         //施放一個手指滑動的事件。
25         EasyTouch.On_SwipeEnd -= EasyTouch_On_SwipeEnd;
26         //施放
27         EasyTouch.instance.enabledNGuiMode = false;
28         EasyTouch.instance.nGUILayers =0;
29         EasyTouch.instance.nGUICameras.Clear();
30     }

最後,我現在用的EasyTouch可能版本比較老,我用的版本是v3.1.1。EasyTouch這個版本裏有一個BUG。就是超過10只手指在屏幕中滑動會出現空指針的錯誤,後來我看了一下代碼,在UpdateTouches 裏面做一下判斷就好了。

技術分享

EasyTouch有很強大的事件回調方法,大家可以去它的官網上查一下。不知道現在還有沒有更好用的觸屏插件。

原文鏈接: http://www.xuanyusong.com/archives/2948

NGUI與EasyTouch結合使用