Unity 碰撞檢測


在Unity里面,游戲物體的碰撞我們可以通過剛體組件(Rigidbody)和碰撞器組件(Collider)來進行檢測。首先在場景里面添加一個Plane面板作為地面,然后在Plane面板的上方一定高度處放一個Cube立方體。 
  然后給Cube立方體添加一個剛體組件(Rigidbody)。運行游戲,這時候我們可以看到立方體掉在了面板上面。 
  
  立方體和面板產生了碰撞,並且靜止在面板上,這時候我們可以可以通過腳本來進行檢測,比如立方體掉在面板上的時候我們可以將其銷毀。給立方體添加一個檢測碰撞的腳本組件CubeCollision,語言使用C#。代碼如下:

using UnityEngine;

using System.Collections;

public class CubeCollision : MonoBehaviour {

// Use this for initialization void Start () { }

// Update is called once per frame void Update () { }

// 碰撞開始 void OnCollisionEnter(Collision collision) {

// 銷毀當前游戲物體 Destroy(this.gameObject); }

// 碰撞結束 void OnCollisionExit(Collision collision) { }

// 碰撞持續中 void OnCollisionStay(Collision collision) { } }

  在MonoBehaviour類中,OnCollisionEnter、OnCollisionExit和OnCollisionStay是碰撞時的回調方法,我們可以在CubeCollision類中重載它們。當綁定了CubeCollision腳本組件的游戲物體發生碰撞時,OnCollisionEnter便會被觸發調用一次。然后,在整個碰撞過程中會持續調用OnCollisionStay方法,直到碰撞接觸被解除時,OnCollisionExit被觸發一次。這是一個完整的碰撞接觸過程,這三個方法都有一個Collision類型的參數,用於保存碰撞信息。 
  如果我們想要在當前腳本中去操作被立方體碰撞到的對象(面板),那么我們可以通過這三個方法的參數collision來獲得被碰撞的游戲物體的碰撞器組件對象(collider)。然后通過collider對象可以得到碰撞器組件掛載的游戲物體的信息。
// 碰撞開始 void OnCollisionEnter(Collision collision) { var name = collision.collider.name; Debug.Log("Name is " + name); }

 

  這樣子就可以得到被碰撞的游戲物體的名稱。 
  如果我們有很多游戲物體,名稱各不相同,如果要檢測某一類型的,我們可以通過給游戲對象設置Tag值來進行區分。我們給面板對象設置一個Tag值: 
  然后修改代碼為獲取Tag值:
 
// 碰撞開始 void OnCollisionEnter(Collision collision) { var tag = collision.collider.tag; Debug.Log("Tag is " + tag); }
 
  重新運行游戲: 
  除了碰撞之外,Unity還支持接觸檢測。因為使用碰撞檢測,發生碰撞的游戲物體之間會有碰撞模擬,比如撞到東西會反彈或者停頓一下之類的。有時候我們只是想要檢測物體與物體之間是否發生接觸,但是不要產生碰撞的效果,這時候我們可以使用觸發器來進行接觸檢測。 
  首先,我們把立方體Cube的碰撞器設置為觸發類型:
  像這樣,我們在Cube的檢查視圖中找到碰撞器組件,將該組件的IsTrigger屬性勾選上,這樣在游戲物體發生接觸的時候就不會有碰撞的效果了,而是會直接穿過去。Unity的碰撞器有很多類型,Cube的碰撞器類型是盒子碰撞器(BoxCollider),另外還有球形碰撞器、膠囊體碰撞器等。
  然后,我們在CubeCollision腳本組件里面重載以下三個方法:
 
// 開始接觸 void OnTriggerEnter(Collider collider) { Debug.Log("開始接觸"); } // 接觸結束 void OnTriggerExit(Collider collider) { Debug.Log("接觸結束"); } // 接觸持續中 void OnTriggerStay(Collider collider) { Debug.Log("接觸持續中"); }
 
  MonoBehaviour類的OnTriggerEnter、OnTriggerExit和OnTriggerStay是觸發檢測的三個回調方法,OnTriggerEnter在游戲物體發生接觸時調用一次,OnTriggerExit在游戲物體完全分離時調用一次,而OnTriggerStay在游戲物體接觸過程中持續調用。 
  【值得注意的是,觸發器回調的這三個方法的參數都是Collider類型,表示的就是被碰撞的游戲物體的觸發器組件對象。】
  重新運行游戲,我們可以在控制台看到調試信息: 
  這時候Cube會直接從Plane中穿下去,不會停在面板上。


免責聲明!

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



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