很多時候,當我們的主角與其他GameObject發生碰撞時, 我們需要做一些特殊的事情,比如:子彈擊中敵人,敵人就得執行一系列的動作。這時,我們就需要檢測到碰撞現象,即碰撞檢測。
要產生碰撞必須為游戲對象添加剛體(Rigidbody)和碰撞器,剛體可以讓物體在物理影響下運動。碰撞體是物理組件的一類,它要與剛體一起添加 到游戲對象上才能觸發碰撞。如果兩個剛體相互撞在一起,除非兩個對象有碰撞體時物理引擎才會計算碰撞,在物理模擬中,沒有碰撞體的剛體會彼此相互穿過。
物體發生碰撞的必要條件
兩個物體都必須帶有碰撞器(Collider),其中一個物體還必須帶有Rigidbody剛體。
在unity3d中,能檢測碰撞發生的方式有兩種,一種是利用碰撞器,另一種則是利用觸發器。
為了完整的了解這兩種方式,我們必須理解以下概念:
(一)碰撞器是一群組件,它包含了很多種類,比如:Box Collider,Capsule Collider等,這些碰撞器應用的場合不同,但都必須加到GameObjecet身上。
(二)所謂觸發器,只需要在檢視面板中的碰撞器組件中勾選IsTrigger屬性選擇框。
(三)在Unity3d中,主要有以下接口函數來處理這兩種碰撞檢測:
觸發信息檢測:
1.MonoBehaviour.OnTriggerEnter( Collider other )當進入觸發器
2.MonoBehaviour.OnTriggerExit( Collider other )當退出觸發器
3.MonoBehaviour.OnTriggerStay( Collider other )當逗留觸發器
碰撞信息檢測:
1.MonoBehaviour.OnCollisionEnter( Collision collisionInfo ) 當進入碰撞器
2.MonoBehaviour.OnCollisionExit( Collision collisionInfo ) 當退出碰撞器
3.MonoBehaviour.OnCollisionStay( Collision collisionInfo ) 當逗留碰撞器
以上這六個接口都是MonoBehaviour的函數,由於我們新建的腳本都繼承這個MonoBehaviour這個類。所以我們的腳本里面可以覆寫這六個函數。
下面來看一個例子。
移動小球吃掉黃色物體,利用觸發檢測。
先附一張效果圖:
再附一張設計圖:
附代碼:

using UnityEngine; using System.Collections; public class Player : MonoBehaviour { private Rigidbody rd; public int force; private int score = 0; public dfLabel lable; public dfLabel xianshi; void Start () { rd = GetComponent<Rigidbody>(); } void Update () { float h = Input.GetAxis("Horizontal"); float v = Input.GetAxis("Vertical"); rd.AddForce(new Vector3(h,0,v)*force); } void OnCollisionEnter(Collision collision)//碰撞檢測 { //collision.collider 獲取碰撞到的游戲物體身上Collider組件 string name = collision.collider.name; //獲取碰撞到的游戲物體的名字 print(name); if (collision.collider.tag == "PickUp") { Destroy(collision.collider.gameObject); } } void OnTriggerEnter(Collider collider)//觸發檢測 { if (collider.tag == "PickUp") { score++; lable.Text = "你的分數是 : " + score.ToString(); if(score == 10) { xianshi.IsVisible = true; } Destroy(collider.gameObject); } } }

using UnityEngine; using System.Collections; public class Pickup : MonoBehaviour { void Update () { //繞着y軸旋轉 transform.Rotate(new Vector3(0,1,0)); } }

using UnityEngine; using System.Collections; public class FollowTarget : MonoBehaviour {//固定相機的位置 public Transform playertransform; private Vector3 offset; // Use this for initialization void Start () { offset = transform.position - playertransform.position; } // Update is called once per frame void Update () { transform.position = playertransform.position + offset; } }