BoxCollider2D不產生碰撞的解決方法

一般這個問題只有新手纔會遇到,我就是一個新手,經過百度了很多次才終於解決,解決之後,才發現真的很簡單。首先要理解一下碰撞的概念。在Unity3d中碰撞並不僅僅是真實世界中一個物體撞了一下另一下,產生物理的力的作用,而是還有一個“接觸”的概念,就是說兩個物體可能是慢慢靠近,最後挨着了,就像握了一下手而已。“碰撞”和“接觸”這兩種狀態反應到代碼中,就是會觸發兩個方法:

   //在需要物理作用的情況下,會觸發這個方法 
   private void OnCollisionEnter2D(Collision2D collision)
    {
            Debug.Log("碰到");
            ChangeMoveDirection(false);
        
    }
   //不需要力的作用的情況下,會觸發這個方法
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if(collision.gameObject.GetComponent<FishMove>() != null)
        {
            return;
        }
        bool flag = collision.gameObject.name.Equals("RightCollider");
        ChangeMoveDirection(flag);
    }

那麼,什麼 情況下需要力的作用,什麼情況下不需要力的作用呢?比如在憤怒的小鳥遊戲中,子彈打到木塊時,子彈會被彈回,木塊會被撞遠,這就是產生了力的作用,而像快跑遊戲中,碰到金幣時,吃掉金幣,就不需要力的作用,只是讓代碼知道接觸到了而已。很明顯,不需要力的情況下性能更高,因爲不需要大量的物理計算 了。

那麼,在Unity3d中怎麼控制需要力和不需要力呢?這個就是在BoxCollider2D中設置的,它有個bool參數:IsTrigger,如果選中了,則是不需要力,只是"接觸",而不選中,則表示需要有力的作用,在unity 2019.2的版本中默認是不選中的。

下面以例子說明一下使用BoxCollider2D和Rigidbody2D實現“碰撞”和“接觸”,分別調用OnCollisionEnter2D和OnTriggerEnter2D方法,其它的OnTrigger*和OnCollision方法調用和這個是一樣的。

如果是需要力的作用,被碰撞的物體必須有剛體Rigidbody2D纔可以。比如下面所示,子彈上面有剛體,而金幣上面沒有,當子彈移動碰到金幣時,不會觸發OnCollisionEnter2D方法調用,而金幣移動碰撞到子彈時,會觸發方法調用。
在金幣添加的腳本如下:

public class Gold : MonoBehaviour
{
    private void OnTriggerEnter2D(Collider2D collision)
    {
        Debug.Log("觸發:OnTriggerEnter2D");
        Destroy(this.gameObject);
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        Debug.Log("觸發:OnCollisionEnter2D");
        Destroy(this.gameObject);
    }
}

有力作用

(GIF圖片有點大,可能加載慢一點,加載不出來可以多試幾次)可以從上圖中看到,BoxCollider2D的Is Trigger屬性沒有鉤選。

而如果僅僅是爲了實現兩個物體“接觸”的事件,那麼就不需要力的作用了。在這種情況下,兩個物體中,只要有一個物體上有剛體Rigidbody2D組件,就可以觸發OnTrigger** 系列方法。下面把BoxCollider2D的Is Trigger屬性鉤選。爲了方便演示,修改一下代碼,不讓物體消失了,只打印日誌。
沒有力的作用,只接觸
(GIF圖片有點大,可能加載慢一點,加載不出來可以多試幾次)
另外,在開發2D遊戲的時候,還有一個重要的一點,這個問題困繞了我很長時間。就是注意BoxCollider2D大小的問題,它的大小表示的是碰撞檢測的範圍,默認是(1,1),這就是一個點,如果兩個物體都是(1,1)只有這兩個點碰撞時才觸發方法的調用。所以最好是調它,讓它包裹住物體或給一個合理的碰撞範圍:
調整碰撞檢測範圍

歡迎關注

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章