1. 程式人生 > >Unity學習筆記(二) 碰撞檢測與觸發檢測

Unity學習筆記(二) 碰撞檢測與觸發檢測

  • 正好看到了Roll a ball這個遊戲,於是就溫故一下碰撞檢測和觸發檢測

1.前期準備

中間省去建造一些基礎的物體的過程,最後呈現如下圖 我們的主角就是中間的球體 其GameObject名為player,我們在其身上添上剛體元件(Rigidbody)使其可以進行物理移動

其次,我們再建立一個Move指令碼用來控制球體的移動

private Rigidbody rgd;
public float speed = 5;

void Start () {
     rgd = GetComponent<Rigidbody>(); //獲取球體上的剛體元件
}

void
Update () { float h = Input.GetAxis("Horizontal");//水平方向 對應← → float v = Input.GetAxis("Vertical"); //垂直方向 對應↑ ↓ rgd.AddForce(new Vector3(h, 0, v) * speed);//給剛體施加一個力就可以運動了,新增一個方向即可 }

最後,我們還要給要給那些Cube附上標籤以便我們訪問它們

2.碰撞檢測

  • 關於碰撞檢測,我們主要用到以下三個函式(Unity自帶)

OnCollisionEnter、OnCollisionExit、OnCollisionStay 其解釋我們參考官網API

我們這邊主要用到OnCollisionEnter 將以下程式碼加入到Move指令碼中

private void OnCollisionEnter(Collision collision)
    {
        if(collision.collider.tag=="pick up")
        {
            Destroy(collision.collider.gameObject);
        }
    }

這邊很容易理解,collision.collider可以獲取球體碰撞到的物體碰撞元件,只要其標籤和我們之前設定的”pick up”一樣即為我們所要碰撞檢測的,當我們碰到後就消失物體

結果如下圖: 不難看出,當我們球體撞到Cube上時雖然Cube消失了,但是還是有物理碰撞減速的影子,這就是碰撞機的缺點,無法使物理效果刪除,所以為了更好的實現,我們接下來使用觸發檢測去完美解決

3.觸發檢測

  • 觸發檢測和碰撞檢測類似有三個功能函式

OnTriggerEnter、OnTriggerExit、OnTriggerStay 其定義和Collider類似 我們在使用觸發檢測的時候,需要將需要被觸發檢測的物體上勾選上Is Trigger,這裡就是Cube物體 我們此時可以先執行一下看一下觸發器效果 可以很明顯看到球體直接穿過Cube物體了,此時不會引起物理碰撞,然後我們再新增如下程式碼即可彌補之前的一點瑕疵

private void OnTriggerEnter(Collider other)
    {
        if(other.tag=="pick up")
        {
            Destroy(other.gameObject);
        }
    }

我們將其執行可以得到如下圖 是不是一點生硬的感覺都沒有了!

4.總結

個人認為觸發檢測更多的是用來觸發類似機關這類時使用,不需要物理碰撞,比如某個人走到一扇門前面此時就可以用觸發檢測來觸發某些事件。而碰撞檢測Emmmmm感覺實用性不是特別大吧…有什麼其他問題歡迎評論和我討論,新手初學,一起進步!