剛體(Rigidbody)的官方(摘自Unity3d的官方指導書《Unity4.x從入門到精通》)解釋如下:
Rigidbody(剛體)組件可使游戲對象在物理系統的控制下來運動,剛體可接受外力與扭矩力用來保證游戲對象像在真實世界中那樣進行運動。任何游戲對象只有添加了剛體組件才能受到重力的影響,通過腳本為游戲對象添加的作用力以及通過NVIDIA物理引擎與其他的游戲對象發生互動的運算都需要游戲對象添加了剛體組件。
個人理解就是剛體是用來模擬物體受到一個力作用時候的表現,這個從剛體中的參數就可以看出:
全是關於物體受到力之后,怎么運動的參數,比如Mass質量,Drag阻力。
碰撞體的官方(摘自Unity3d的官方指導書《Unity4.x從入門到精通》)解釋如下:
碰撞體是物理組件的一類,它要與剛體一起添加到游戲對象上才能觸發碰撞。如果兩個剛體相互撞在一起,除非兩個對象有碰撞體時物理引擎才會計算碰撞,在物理模擬中,沒有碰撞體的剛體會彼此相互穿過。
個人是這樣理解的,為什么要判斷碰撞,判斷碰撞就是需要計算力,無論是阻力也好,動力也好,如果此時物體有剛體組件,那么物體就會在力的作用下運動。如果這個物體沒有剛體,那么碰撞產生的力就沒有任何意義了,那計算碰撞也就沒有任何意義了。
所以,我們可以推斷出,如果兩個碰撞體都沒有剛體組件,那么這兩個物體即使相互發生了碰撞,那么也不會有碰撞事件的。
官網上的碰撞的圖如下(注:據說是官網的圖,我在網上很多地方看到了,但我目前為止還沒找到在官網的哪個位置哈):
從上面的圖中我們看出來碰撞的雙方中一定要有一個Rigidbody存在,並且碰撞雙方必須都要有碰撞體組件。
但做實驗的時候發現了一個很詭異的事情,就是發生碰撞的主體一定是要帶剛體的,即只有帶剛體的碰撞體去撞其他碰撞體時,雙方才會收到碰撞事件,以下是我做的實驗:
一、控制A(剛體加碰撞體)撞擊 靜止的B(只有碰撞體),雙方能收到碰撞事件。
二、控制B(只有碰撞體)撞擊 靜止的A(剛體加碰撞體),雙方收不到碰撞事件。
三、讓A(剛體加碰撞體)自由下落,然后控制B(只有碰撞體)去撞擊A,雙方能受到碰撞事件。
得出的結論似乎是如果碰撞雙方只有一個有剛體,那么那個剛體一定要處於運動的狀態下才會有碰撞事件發生。
接下來就是IsTrigger選項了,上面的情況都沒有觸發信息,先列舉一下觸發事件和碰撞事件,如下:
觸發信息檢測: 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 ) 當逗留碰撞器
觸發器觸發條件:
1、必須都要有碰撞器組件(Collider),其實上面的碰撞事件同樣也需要這個前提條件。
2、必須有一個物體帶剛體組件,並且處於運動狀體中(包括主動運動去撞擊別人和在運動過程中被別人撞擊)。
3、兩個碰撞器中至少有一個開啟了IsTrigger。
此外還有兩點:
一、產生觸發事件的兩個物體會相互穿越,准確的說是因為開啟IsTrigger那個物體會被物理引擎鎖忽略掉,所以會產生兩個物體穿越的情況。
二、兩個對象要么都收到碰撞事件,要么都收到觸發事件,不會出現一個收到觸發事件,一個收到碰撞事件的情況。
還有一個經驗點就是,在控制一個物體A去撞另一個物體B時,不要直接去修改物體A的Transform的position屬性,因為你會發現如果即使兩者發生了碰撞也還是會穿越的,原因就在於我們是直接設置的坐標,如果物體A有剛體組件的話,應該用AddForce,給物體添加一個力,然后讓物理引擎去讓物體動,此時如果發生了碰撞的話,就不會穿越了。