【Unity入門】碰撞檢測與觸發檢測


版權聲明:本文為博主原創文章,轉載請注明出處。

 

  在Unity里面,游戲物體的碰撞我們可以通過剛體組件(Rigidbody)和碰撞器組件(Collider)來進行檢測。首先在場景里面添加一個Plane面板作為地面,然后在Plane面板的上方一定高度處放一個Cube立方體。 

  然后給Cube立方體添加一個剛體組件(Rigidbody)。運行游戲,這時候我們可以看到立方體掉在了面板上面。 

  立方體和面板產生了碰撞,並且靜止在面板上,這時候我們可以可以通過腳本來進行檢測,比如立方體掉在面板上的時候我們可以將其銷毀。給立方體添加一個檢測碰撞的腳本組件CubeCollision,語言使用C#。代碼如下:

 1 /**
 2  *  Copyright (c) Clarence Zeng Binsi
 3  * 
 4  *      Author:     ZengBinsi
 5  *      Date:       2016/01/25 16:10:28
 6  *      Desc:       Collision test
 7  */
 8 
 9 
10 
11 
12 using UnityEngine;
13 using System.Collections;
14 
15 public class CubeCollision : MonoBehaviour {
16 
17 
18     // Use this for initialization
19     void Start () {
20 
21     }
22 
23     // Update is called once per frame
24     void Update () {
25 
26     }
27 
28 
29 
30 
31     // 碰撞開始
32     void OnCollisionEnter(Collision collision) {
33         // 銷毀當前游戲物體
34         Destroy(this.gameObject);
35     }
36 
37     // 碰撞結束
38     void OnCollisionExit(Collision collision) {
39 
40     }
41 
42     // 碰撞持續中
43     void OnCollisionStay(Collision collision) {
44 
45     }
46 
47 }

  在MonoBehaviour類中,OnCollisionEnter、OnCollisionExit和OnCollisionStay是碰撞時的回調方法,我們可以在CubeCollision類中重載它們。當綁定了CubeCollision腳本組件的游戲物體發生碰撞時,OnCollisionEnter便會被觸發調用一次。然后,在整個碰撞過程中會持續調用OnCollisionStay方法,直到碰撞接觸被解除時,OnCollisionExit被觸發一次。這是一個完整的碰撞接觸過程,這三個方法都有一個Collision類型的參數,用於保存碰撞信息。 

  如果我們想要在當前腳本中去操作被立方體碰撞到的對象(面板),那么我們可以通過這三個方法的參數collision來獲得被碰撞的游戲物體的碰撞器組件對象(collider)。然后通過collider對象可以得到碰撞器組件掛載的游戲物體的信息。

1     // 碰撞開始
2     void OnCollisionEnter(Collision collision) {
3         var name = collision.collider.name;
4 
5         Debug.Log("Name is " + name);
6     }

  這樣子就可以得到被碰撞的游戲物體的名稱。 

  如果我們有很多游戲物體,名稱各不相同,如果要檢測某一類型的,我們可以通過給游戲對象設置Tag值來進行區分。我們給面板對象設置一個Tag值: 

  然后修改代碼為獲取Tag值:

1     // 碰撞開始
2     void OnCollisionEnter(Collision collision) {
3         var tag = collision.collider.tag;
4 
5         Debug.Log("Tag is " + tag);
6     }

  重新運行游戲: 

  除了碰撞之外,Unity還支持接觸檢測。因為使用碰撞檢測,發生碰撞的游戲物體之間會有碰撞模擬,比如撞到東西會反彈或者停頓一下之類的。有時候我們只是想要檢測物體與物體之間是否發生接觸,但是不要產生碰撞的效果,這時候我們可以使用觸發器來進行接觸檢測。 

  首先,我們把立方體Cube的碰撞器設置為觸發類型:

  像這樣,我們在Cube的檢查視圖中找到碰撞器組件,將該組件的IsTrigger屬性勾選上,這樣在游戲物體發生接觸的時候就不會有碰撞的效果了,而是會直接穿過去。Unity的碰撞器有很多類型,Cube的碰撞器類型是盒子碰撞器(BoxCollider),另外還有球形碰撞器、膠囊體碰撞器等。

  然后,我們在CubeCollision腳本組件里面重載以下三個方法:

 1     // 開始接觸
 2     void OnTriggerEnter(Collider collider) {
 3         Debug.Log("開始接觸");
 4     }
 5 
 6     // 接觸結束
 7     void OnTriggerExit(Collider collider) {
 8         Debug.Log("接觸結束");
 9     }
10 
11     // 接觸持續中
12     void OnTriggerStay(Collider collider) {
13         Debug.Log("接觸持續中");
14     }

  MonoBehaviour類的OnTriggerEnter、OnTriggerExit和OnTriggerStay是觸發檢測的三個回調方法,OnTriggerEnter在游戲物體發生接觸時調用一次,OnTriggerExit在游戲物體完全分離時調用一次,而OnTriggerStay在游戲物體接觸過程中持續調用。 

  【值得注意的是,觸發器回調的這三個方法的參數都是Collider類型,表示的就是被碰撞的游戲物體的觸發器組件對象。】

  重新運行游戲,我們可以在控制台看到調試信息: 

  這時候Cube會直接從Plane中穿下去,不會停在面板上。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM