NGUI與EasyTouch結合使用
阿新 • • 發佈:2017-06-17
idt 可能 點擊 ngui itoo pre led 小問題 超過
用了EasyTouch插件一段時間了,小問題還是有一些,總體來說用起來還行。這篇文章我就來說說EasyTouch和NGUI的結合。
總體來說觸摸屏幕也就三種情況。
1.觸摸事件只響應NGUI部分,不響應3D部分。
2.觸摸事件只響應3D部分,不響應NGUI部分。
3.觸摸事件同時響應。
舉個例子,在戰鬥場景我們希望通過手指滑動來控制攝像機的旋轉。但是這時屏幕上可能還有一些UI的按鈕,但是我們不希望用戶點擊UI按鈕也影響到了攝像機的旋轉。所以此時我們只希望觸摸事件在3D部分響應。
1. 如下圖所示,這裏我增加了一個UISprite,我希望我的手指觸摸事件只在UI上響應,不在3D上響應
1 usingUnityEngine; 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 } 1314 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結合使用