Unity3D之Character Controller(CC)與GameObject的碰撞方法

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, 並且RigidbodyIsKinematic打勾的,注意這個碰撞器是不能加力的,只能修改他的transform才能移動

Triggers 觸發器

僅須要選中Inspector中的IsTrigger屬性選擇框。觸發器不受物理引擎控制,當和一個觸發器發生碰撞時會發出三個獨特的觸發信息,爲了使兩個觸發器碰撞時發出碰撞事件,其中一個必須包含剛體.

 

今天遇到的一個狀況是:若是剛體碰撞器不動,靜態碰撞器去碰撞,則不會觸發任何信息,而若是靜態碰撞器不動,剛體碰撞器(包括運動學剛體碰撞器)去碰撞靜態碰撞器,則會觸發碰撞,若是是觸發器,則會觸發事件。因此下面的表格提供了觸發的條件,但主動性你們也還須要注意,否則要糾結一段時間的。

 


Static Collider
靜態碰撞器

Rigidbody Collider
剛體碰撞器

Kinematic 
Rigidbody Collider
運動學剛體碰撞器

Static 
Trigger Collider
靜態觸發碰撞器

Rigidbody 
Trigger Collider
剛體觸發碰撞器

Kinematic Rigidbody 
Trigger Collider
運動學剛體觸發碰撞器

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 
Rigidbody Collider
運動學剛體碰撞器

Static 
Trigger Collider
靜態觸發碰撞器

Rigidbody 
Trigger Collider
剛體觸發碰撞器

Kinematic Rigidbody 
Trigger Collider
運動學剛體觸發碰撞器

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例子,貌似當控制主角走到一個門前時,那個門會自動打開。

相關文章
相關標籤/搜索