前段時間項目須要完成一個點擊,拖動,縮放功能。並無使用Ngui或者Ugui自帶的手勢識別的功能,是直接在Update中處理了這些事務。可是後來根據項目需求添加了一個按鈕(其實爲一個Sprite),發現點擊事件與按鈕的事件是相互衝突的。緣由應該是Update是獲取的屏幕的事件是和按鈕同級別的,因此須要修改。最後使用的是射線碰撞檢測。c#
- 獲取屏幕點擊點的位置
- 從主攝像機做出射線到屏幕點擊點
- 使用RayCast函數計算
首先對須要被檢測的物體添加碰撞器。ide
Ray buttonRay; RaycastHit myRayHit void Update(){ if (Input.touches.Count > 0 && Input.GetTouch(0).phase == TouchPhase.Ended) { //若是場景中存在多個攝像頭,須要定義是哪一個Camera。通常是用UI的那個。 buttonRay = Camera.main.ScreenPointToRay (Input.GetTouch(0).position); //用來劃線 //Debug.DrawLine (buttonRay.origin, myRayHit.point, Color.red, 2); if (Physics.Raycast(buttonRay, out myRayHit){ //這裏能夠經過myRayHit來獲取碰撞到的東西。 Debug.Log ("按鈕"); }else{ Debug.Log ("點擊"); } }
從攝像頭到position的射線: {% highlight c# %} public Ray ScreenPointToRay(Vector3 position); {% endhighlight %}函數
檢測在這個射線中碰撞到碰撞器ui
/* Returns bool bool True if the ray intersects with a Collider, otherwise false. */ public static bool Raycast( Vector3 origin, Vector3 direction, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);
事實上射線碰撞也能夠用在遊戲中物體的拾取判斷,這裏原理是同樣的我就不作例子了。對於手勢的處理我以爲不該該放在update中處理,應該好好利用NGUI這些插件。固然多懂些原理也並無什麼壞處。插件