Unity3d中的碰撞檢測


很多時候,當我們的主角與其他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);
        }
    }
}
player
using UnityEngine;
using System.Collections;

public class Pickup : MonoBehaviour {

    void Update () {
        //繞着y軸旋轉
        transform.Rotate(new Vector3(0,1,0));
    }
}
pickup
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;
    }
}
followtarget

 


免責聲明!

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



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