1. 程式人生 > >Unity3D——學習分享(九)碰撞檢測

Unity3D——學習分享(九)碰撞檢測

在我們遊戲開發過程中,碰撞檢測函式的使用十分頻繁,比如射擊遊戲檢測子彈是否碰撞到敵人觸發敵人掉血、受傷等狀態,生存類遊戲中常見的走到門前,通過碰撞檢測來控制自動開關門等。

碰撞檢測函式

在unity的中有兩個用於碰撞檢測的函式

1. OnTriggerEnter(Collider other){

     }
 2. OnCollisionEnter(Collision collision){.
 
 }

OnTriggerEnter的使用:

  • 當A和B有一個物體上新增有Rigidbody元件時,只有帶Rigidbody的物體上的isTrigger被勾選後才能觸發
  • 當A和B都有Rigidbody元件時,有其中一個勾選isTrigger就能觸發

OnCollisionEnter的使用:

  • 當A和B有一個物體上新增有Rigidbody元件時,且有Rigidbody元件的物體去碰撞另一個物體才能觸發;
  • 當A和B都有Rigidbody元件時發生碰撞時,無論是誰碰撞的誰,兩者都能觸發該方法,前提是兩者都沒有勾選isTrigger。

在這裡插入圖片描述

在這裡插入圖片描述

碰撞檢測的共同點

兩個碰撞體A和B的身上都要有碰撞體Collider(碰撞體其中的任意一種)。
注意:兩個檢測函式不能同時存在

檢測碰撞常用的的方法

  1. 通過碰撞器檢測碰撞
    指定一個處於觸發器狀態的碰撞器,將實際檢測碰撞的物件包含進該觸發器中,即角色與觸發器之間的碰撞檢測。

  2. .通過射線檢測碰撞
    通過一條射線射到物體上進行觸發檢測,即從一個方向投射出一條射線,在光線長度範圍內檢測被光線射到的物體從而觸發碰撞。射線檢測程式碼如下:

private void OnTriggerEnter(Collider other){
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//將點到地面的點轉化為射線
RaycastHit hitInfo; //碰撞資訊
bool isCollider = Physics.Raycast(ray, out hitInfo);
            if
(isCollider ) { //判斷是否發生碰撞 //檢測碰撞後要執行的程式碼新增在此處 } }

下面通過碰撞器檢測方法來簡單實現一個例子。

例項的內容:一個從空中墜落的物體,在接觸到地面時進行碰撞檢測,並摧毀該物體。

實現過程:

  • 建立一個球體,為其加上Rigidbody元件,並勾選Sphere Collider上的isTrigger屬性
    在這裡插入圖片描述

  • 建立指令碼,新增程式碼,將指令碼賦給小球

private void OnTriggerEnter(UnityEngine.Collider other)
    {
        Destroy(this.gameObject);
    }

在這裡插入圖片描述

  • 檢視執行結果
    在這裡插入圖片描述

最後我們發現小球在接觸到地面的一瞬間被摧毀了。這就是碰撞檢測函式的簡單實用,就給大家分享這麼多,你也可以嘗試一下用射線檢測的方法完成這個例子。