茫茫網海中的冷日 - 對這文章發表回應
茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1674968 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_00049.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

對這文章發表回應

發表限制: 非會員 可以發表

發表者: 冷日 發表時間: 2015/1/10 7:59:28

剛體(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 )  當逗留碰撞器


下面是一張關於觸發的關係圖,如下(註:同樣是來自網上,我目前還沒在官網上找著哈)



下面就是我做的測試情況,都是A物體去撞B物體。

一、A( 碰撞體),B(沒有碰撞體,無論有沒有剛體),沒有觸發事件。

二、A(碰撞體),B(碰撞體),沒有觸發事件。

二、A(碰撞體和剛體,開啟IsTrigger),B(碰撞體,關閉 IsTrigger),雙方都能收到觸發事件。

三、A(碰撞體和剛體,關閉 IsTrigger),B(碰撞體,開啟 IsTrigger),雙方都能收到觸發事件。

四、A ( 碰撞體,關閉 IsTrigger),B( 碰撞體和剛體,開啟 IsTrigger),沒有觸發事件。

五、A ( 碰撞體,開啟 IsTrigger ),B( 碰撞體和剛體,關閉 IsTrigger),沒有觸發事件。

額外實驗:

六、A( 碰撞體和剛體,開啟IsTrigger)自由下落,B(碰撞體)撞擊A,雙方都能收到觸發事件。

根據上面的實驗得出,如果要收到觸發事件,必須滿足如下三個條件:

1、必須都要有碰撞器組件(Collider),其實上面的碰撞事件同樣也需要這個前提條件。

2、必須有一個物體帶剛體組件,並且處於運動狀體中(包括主動運動去撞擊別人和在運動過程中被別人撞擊)。

3、兩個碰撞器中至少有一個開啟了IsTrigger。

此外還有兩點:

一、產生觸發事件的兩個物體會相互穿越,準確的說是因為開啟IsTrigger那個物體會被物理引擎鎖忽略掉,所以會產生兩個物體穿越的情況。

二、兩個對像要麼都收到碰撞事件,要麼都收到觸發事件,不會出現一個收到觸發事件,一個收到碰撞事件的情況。


還有一個經驗點就是,在控制一個物體A去撞另一個物體B時,不要直接去修改物體A的Transform的position屬性,因為你會發現如果即使兩者發生了碰撞也還是會穿越的,原因就在於我們是直接設置的坐標,如果物體A有剛體組件的話,應該用AddForce,給物體添加一個力,然後讓物理引擎去讓物體動,此時如果發生了碰撞的話,就不會穿越了。

好吧,下午折騰了半天之後,我就一直在想那個IsTrigger有啥用,後來在網上搜了一下,說是可以做門的自動打開,就讓我想起了Unity3d 4自帶的哪個AngryBots例子,貌似當控制主角走到一個門前時,那個門會自動打開。

於是就打開那個例子工程,去看,發現果然是這樣的,大概原理就是在門前面放了一個設置了IsTrigger的透明碰撞體,用於專門監聽碰撞,當主角進入這個區域時,就通過 OnTriggerEnter事件把門預先打開。

如圖:



原文出處: unity3d 理解刚体(Rigidbody)和碰撞体(Collider)以及触发器(Is Trigger),边学边更新 - monzart的专栏 - 博客频道 - CSDN.NET
內容圖示
url email imgsrc image code quote
樣本
bold italic underline linethrough   












 [詳情...]
validation picture

注意事項:
預覽不需輸入認證碼,僅真正發送文章時才會檢查驗證碼。
認證碼有效期10分鐘,若輸入資料超過10分鐘,請您備份內容後,重新整理本頁並貼回您的內容,再輸入驗證碼送出。

選項

Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|