Unity3d中參與碰撞的物體分2種類型: c#
1、發起碰撞的物體。 ide
2、接收碰撞的物體。 函數
1. 參與發起碰撞物體:Rigodbody, CharacterController 角色碰撞器。 測試
2. 參與接收碰撞的物體:全部Collider . this
工做的原理爲:發生碰撞的物體中必需要有「發起碰撞」的物體。不然,碰撞不響應。 spa
好比:兩面牆都只用BoxCollider ,因此牆與牆之間無反應。 3d
好比:一個帶有Rigidbody屬性的箱子,能落到帶有MeshCollider屬性的地面上。 code
好比:一個帶有Rigidbody屬性的箱子,能夠被一個帶有CharacterController 屬性的人推着跑。 orm
在全部Collider上有一個Is Trigger 的boolean型參數。 對象
(If enabled, this Collider is used for triggering events, and is ignored by the physics engine.)
當發生碰撞反應的時候,會先檢查此屬性是否爲true。
當激活此選項時,會調用碰撞雙方的腳本 OnTrigger, 反之,腳本方面沒有任何反應。
當激活is trigger = true,不會發生後續物理的反應。反之,發生後續的物理反應。
總結:Is Trigger 比如是一個物理功能的開關, 是要「物理功能」仍是要「OnTrigger腳本」。
在Rigodbody 上有一個Use Gravity 的boolean型參數.
(Controls whether gravity affects this rigidbody.)
Unity 物理引擎,處理的一個細節:
當一個CharacterController不發生位置變化,一個Collier發生位置變化後,產生碰撞。將不會調用任何碰撞函數,也就是沒有碰撞反應的。
物理引擎視爲CharacterController無碰撞.
--------------------分隔線----------------------
如今就來考慮如何讓GameObject(魔法球)主動碰撞到CC(人物), 碰撞到人物後,顯示受擊效果.
解決方案, 由上面的可知, 作出以下設置:
1:魔法球: Collider(合適的類型), Rigidbody(Use Gravity能夠去掉)
2:人物: CC.
腳本:
在魔法球上添加腳本
void OnCollisionEnter (Collision collision) { Debug.Log ("**** collision.gameObject.name***:" + collision.gameObject.name); if(collision.gameObject.name == "Player") { // 發送攻擊消息 SendAttackMsg(); // 銷燬魔法球 Destroy (gameObject); } }
具體的一些,能夠看 unity3d的 manual refrernce的東西,有幾個表格在後面能夠參考:
幾個類型碰撞器:
1. 靜態碰撞器: 就是隻有碰撞器,但沒有剛體的
2.剛體碰撞器: 帶Rigidbody的碰撞器,這個是最基本的碰撞器
3.運動學剛體碰撞器: 帶Rigidbody, 並且Rigidbody的IsKinematic打勾的,注意這個碰撞器是不能加力的,只能修改他的transform才能移動
Triggers 觸發器
僅須要選中Inspector中的IsTrigger屬性選擇框。觸發器不受物理引擎控制,當和一個觸發器發生碰撞時會發出三個獨特的觸發信息,爲了使兩個觸發器碰撞時發出碰撞事件,其中一個必須包含剛體.
今天遇到的一個狀況是:若是剛體碰撞器不動,靜態碰撞器去碰撞,則不會觸發任何信息,而若是靜態碰撞器不動,剛體碰撞器(包括運動學剛體碰撞器)去碰撞靜態碰撞器,則會觸發碰撞,若是是觸發器,則會觸發事件。因此下面的表格提供了觸發的條件,但主動性你們也還須要注意,否則要糾結一段時間的。
Static Collider |
Rigidbody Collider |
Kinematic |
Static |
Rigidbody |
Kinematic Rigidbody |
|
Static Collider 靜態碰撞器 |
Y |
|||||
Rigidbody Collider 剛體碰撞器 |
Y |
Y |
Y |
|||
Kinematic Rigidbody Collider |
Y |
|||||
Static Trigger Collider |
||||||
Rigidbody Trigger Collider |
||||||
Kinematic Rigidbody Trigger Collider |
Static Collider |
Rigidbody Collider |
Kinematic |
Static |
Rigidbody |
Kinematic Rigidbody |
|
Static Collider 靜態碰撞器 |
Y |
Y |
||||
Rigidbody Collider 剛體碰撞器 |
Y |
Y |
Y |
|||
Kinematic Rigidbody Collider |
Y |
Y |
Y |
|||
Static Trigger Collider 靜態觸發碰撞器 |
Y |
Y |
Y |
Y |
||
Rigidbody Trigger Collider |
Y |
Y |
Y |
Y |
Y |
Y |
Kinematic Rigidbody Trigger Collider |
Y |
Y |
Y |
Y |
Y |
Y |
下面就是我作的測試狀況,都是A物體去撞B物體。
1、A(碰撞體),B(沒有碰撞體,不管有沒有剛體),沒有觸發事件。
2、A(碰撞體),B(碰撞體),沒有觸發事件。
2、A(碰撞體和剛體,開啓IsTrigger),B(碰撞體,關閉IsTrigger),雙方都能收到觸發事件。
3、A(碰撞體和剛體,關閉IsTrigger),B(碰撞體,開啓IsTrigger),雙方都能收到觸發事件。
4、A (碰撞體,關閉IsTrigger),B(碰撞體和剛體,開啓IsTrigger),沒有觸發事件。
5、A (碰撞體,開啓IsTrigger),B(碰撞體和剛體,關閉IsTrigger),沒有觸發事件。
額外實驗:
6、A(碰撞體和剛體,開啓IsTrigger)自由下落,B(碰撞體)撞擊A,雙方都能收到觸發事件。
根據上面的實驗得出,若是要收到觸發事件,必須知足以下三個條件:
一、必須都要有碰撞器組件(Collider),其實上面的碰撞事件一樣也須要這個前提條件。
二、必須有一個物體帶剛體組件,而且處於運動狀體中(包括主動運動去撞擊別人和在運動過程當中被別人撞擊)。
三、兩個碰撞器中至少有一個開啓了IsTrigger。
此外還有兩點:
1、產生觸發事件的兩個物體會相互穿越,準確的說是由於開啓IsTrigger那個物體會被物理引擎鎖忽略掉,因此會產生兩個物體穿越的狀況。
2、兩個對象要麼都收到碰撞事件,要麼都收到觸發事件,不會出現一個收到觸發事件,一個收到碰撞事件的狀況。
還有一個經驗點就是,在控制一個物體A去撞另外一個物體B時,不要直接去修改物體A的Transform的position屬性,由於你會發現若是即便二者發生了碰撞也仍是會穿越的,緣由就在於咱們是直接設置的座標,若是物體A有剛體組件的話,應該用AddForce,給物體添加一個力,而後讓物理引擎去讓物體動,此時若是發生了碰撞的話,就不會穿越了。
好吧,下午折騰了半天以後,我就一直在想那個IsTrigger有啥用,後來在網上搜了一下,說是能夠作門的自動打開,就讓我想起了Unity3d 4自帶的哪一個AngryBots例子,貌似當控制主角走到一個門前時,那個門會自動打開。