Unity 射線碰撞檢測

項目原由:

前段時間項目須要完成一個點擊,拖動,縮放功能。並無使用Ngui或者Ugui自帶的手勢識別的功能,是直接在Update中處理了這些事務。可是後來根據項目需求添加了一個按鈕(其實爲一個Sprite),發現點擊事件與按鈕的事件是相互衝突的。緣由應該是Update是獲取的屏幕的事件是和按鈕同級別的,因此須要修改。最後使用的是射線碰撞檢測。c#

1.射線檢測原理:

  • 獲取屏幕點擊點的位置
  • 從主攝像機做出射線到屏幕點擊點
  • 使用RayCast函數計算

2.代碼實現:

首先對須要被檢測的物體添加碰撞器。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 ("點擊");
        }
}

3.關鍵函數:

從攝像頭到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);

4.總結:

事實上射線碰撞也能夠用在遊戲中物體的拾取判斷,這裏原理是同樣的我就不作例子了。對於手勢的處理我以爲不該該放在update中處理,應該好好利用NGUI這些插件。固然多懂些原理也並無什麼壞處。插件

相關文章
相關標籤/搜索