無(wú)論是碰撞檢測(cè)還是觸發(fā)檢測(cè)峡捡,他們都基于Collider組件。兩個(gè)游戲?qū)ο蟀l(fā)生碰撞時(shí),碰撞器可以產(chǎn)生系統(tǒng)默認(rèn)的碰撞產(chǎn)生的物理效果慨亲;觸發(fā)器可以讓用戶自定義碰撞后產(chǎn)生的物理效果,如爆炸宝鼓、消失等刑棵。
在Unity中,用來(lái)檢測(cè)碰撞的方法有三種:碰撞檢測(cè)愚铡、觸發(fā)檢測(cè)蛉签、射線檢測(cè)。在這里我們只講解碰撞檢測(cè)和觸發(fā)檢測(cè)沥寥。
一碍舍、碰撞檢測(cè)
首先在Unity里面,碰撞器是一種組件邑雅,有很多種類片橡,大致分為兩類:基本碰撞器和非基本碰撞器;其中基本碰撞器包括Box Collider(Cube游戲物體自帶的碰撞器)淮野、Sphere Collider(Sphere自帶的碰撞器)捧书、Capsule Collider(Capsule自帶)等吹泡,而非基本碰撞器包括Wheel Collider(車輪碰撞器)、Mesh Collider(網(wǎng)格碰撞器经瓷,Plane自帶)等爆哑。
基本碰撞器的屬性基本都一樣,只是因?yàn)樾螤畈灰粯佣袛?shù)值上的差異了嚎,而非基本碰撞器比較特殊泪漂,每一個(gè)都可以拿出來(lái)單獨(dú)介紹。這里我們?cè)敿?xì)講解一下基本碰撞器歪泳,而非基本碰撞器我們后續(xù)章節(jié)再做詳細(xì)介紹萝勤。
如圖1.1和1.2分別是Cube和Sphere自帶的碰撞器:
對(duì)比兩張圖片我們可以看出它們都擁有Edit Collider、Is Trigger呐伞、Material敌卓、Center屬性,因?yàn)樾螤畹牟煌艜?huì)有了Size和Radius的差別伶氢。
1趟径、Edit Collider
單擊選中一個(gè)游戲?qū)ο蟮腅dit Collider選項(xiàng)后,游戲?qū)ο笊砩蠒?huì)出現(xiàn)包裹全身的網(wǎng)格癣防,上面還有光點(diǎn)蜗巧,如圖1.3:
點(diǎn)擊鼠標(biāo)左鍵拖動(dòng)光點(diǎn),就可以改變Size或者Radius等的大小蕾盯,也就是改變了碰撞器的大小幕屹。
2、Is Trigger
這個(gè)屬性就是碰撞器和觸發(fā)器的區(qū)別级遭,勾選這個(gè)屬性就是觸發(fā)器望拖,不勾選就是碰撞器。這里我們先不勾選挫鸽。
3说敏、Material-材質(zhì)
默認(rèn)是None,可以添加其它物理材質(zhì)(Physic Material)丢郊,用來(lái)設(shè)置彈性系數(shù)和摩擦系數(shù)盔沫,上一章有介紹。
4枫匾、Center
用來(lái)調(diào)整Collider的位置迅诬,如圖1.4:
由圖可以看出Collider的位置和游戲?qū)ο笪恢貌⒉粵_突,兩方都是獨(dú)立的婿牍,一個(gè)游戲?qū)ο蟮哪J(rèn)碰撞器的位置和游戲?qū)ο蟊旧淼奈恢靡恢隆?/p>
5侈贷、Unity中碰撞器有三個(gè)自帶的方法,當(dāng)游戲?qū)ο蟀l(fā)生碰撞時(shí)調(diào)用,他們分別是OnCollisionEnter俏蛮、OnCollisionStay撑蚌、OnCollisionExit,這就是所謂的碰撞檢測(cè)方法搏屑。
OnCollisionEnter:兩個(gè)碰撞游戲?qū)ο蟮呐鲎财鲃偨佑|時(shí)(注意争涌,不是游戲?qū)ο蠼佑|,是游戲?qū)ο笊系呐鲎财?Collider組件接觸)調(diào)用一次辣恋。
OnCollisionStay:兩個(gè)游戲?qū)ο蟮呐鲎财鹘佑|時(shí)調(diào)用亮垫,只要兩個(gè)碰撞器一直在接觸,就會(huì)一直調(diào)用該方法伟骨。
OnCollisionExit:兩個(gè)游戲?qū)ο蟮呐鲎财飨嗷シ蛛x時(shí)調(diào)用一次饮潦。
下面用幾個(gè)情形來(lái)說(shuō)明一下什么條件(兩個(gè)游戲?qū)ο笫欠駧в袆傮w和碰撞器)下會(huì)調(diào)用上述三種碰撞檢測(cè)方法。
情形一:兩個(gè)游戲?qū)ο蠖季哂袆傮w和碰撞器時(shí)
我們先給兩個(gè)游戲?qū)ο螅–ube和Sphere)分別添加剛體携狭,這兩個(gè)游戲?qū)ο蠖甲詭в信鲎财?Collider继蜡,這里我們不要改變Collider的Center的值,讓Collider和物體位置一致逛腿;然后我們給兩個(gè)物體都添加一個(gè)腳本稀并,腳本的內(nèi)容就是利用上述三種方法在控制臺(tái)打印出相應(yīng)的調(diào)用方法的名字。
小球的腳本代碼:
<code>
private Rigidbody rb;
// Use this for initialization
void Start () {
rb=GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown(0))
{
// this.transform.Translate(new Vector3(1,0,0));//小球沒(méi)有剛體時(shí)讓其移動(dòng)的方法
rb.AddForce(new Vector3(1, 0, 0));//小球擁有剛體時(shí)讓其移動(dòng)的方法
//兩種方法根據(jù)情形不同選擇其中一個(gè)
}
}
void OnCollisionEnter()
{
print("小球調(diào)用了OnCollisionEnter方法");
}
void OnCollisionStay()
{
print("小球調(diào)用了OnCollisionStay方法");
}
void OnCollisionExit()
{
print("小球調(diào)用了OnCollisionExit方法");
}
</code>
方塊的腳本代碼:
<code>
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnCollisionEnter()
{
print("方塊調(diào)用了OnCollisionEnter方法");
}
void OnCollisionStay()
{
print("方塊調(diào)用了OnCollisionStay方法");
}
void OnCollisionExit()
{
print("方塊調(diào)用了OnCollisionExit方法");
}
</code>
把寫好的腳本分別加入相應(yīng)的游戲?qū)ο笾械ツ缓笪覀兙蛦螕暨\(yùn)行按鈕碘举,查看Console視圖的打印內(nèi)容,如圖情形一:
圖情形一.1可以看出小球和方塊都調(diào)用了OnCollisionEnter和OnCollisionStay方法搁廓,其中OnCollisionEnter都只調(diào)用了一次(Plane自帶的有Mesh Collider)引颈,OnCollisionStay方法一直在調(diào)用;至于方法調(diào)用的先后順序是:OnCollisionEnter>OnCollisionStay>OnCollisionExit,而之所以先調(diào)用了方塊的方法是因?yàn)榉綁K先落的地枚抵。
有上面兩個(gè)圖我們可以得出:當(dāng)兩個(gè)游戲?qū)ο蠖紦碛袆傮w和碰撞器時(shí),他們?cè)谂鲎矔r(shí)都會(huì)打印碰撞器的三種方法明场。
情形二:小球有剛體和碰撞器汽摹,方塊只有碰撞器時(shí)
如圖情形二:
得出:當(dāng)兩個(gè)游戲?qū)ο笠环綋碛袆傮w和碰撞器,另一方只擁有碰撞器時(shí)苦锨,只要兩方發(fā)生碰撞逼泣,就會(huì)調(diào)用碰撞方法。
情形三:小球和方塊都只有碰撞器舟舒,沒(méi)有剛體
此時(shí)小球沒(méi)有了剛體拉庶,我們讓它移動(dòng)要利用另外一種方法,上面代碼有寫秃励,這里直接用就行了氏仗。
如圖情形三:
得出:當(dāng)兩個(gè)游戲?qū)ο笾粨碛信鲎财鳎鼈兓ハ嗯鲎步佑|時(shí)不會(huì)調(diào)用碰撞方法夺鲜。
情形四:一方(小球)帶有剛體和碰撞器皆尔,另一方(方塊)只帶有剛體呐舔,沒(méi)有碰撞器。
如圖情形四:
首先我們要把方塊的碰撞器組件-Box Collider取消勾選慷蠕,如圖情形四.1:
為了驗(yàn)證小球和方塊的碰撞珊拼,我們把小球放到了方塊的正下方,這樣方塊落下時(shí)就會(huì)和小球碰撞接觸了流炕,如圖情形四.3澎现。
得出:當(dāng)一方有剛體和碰撞器,另一方只有剛體每辟,兩方相互碰撞接觸時(shí)剑辫,都不會(huì)調(diào)用碰撞方法。
由此得出結(jié)論:
兩個(gè)物體碰撞調(diào)用碰撞方法的前提是必須兩個(gè)物體都擁有碰撞器—Collider影兽,而且其中一方必須帶有剛體組件揭斧。
二、觸發(fā)檢測(cè)
觸發(fā)檢測(cè)就要用到觸發(fā)器峻堰,而觸發(fā)器可以說(shuō)就是一種特殊的碰撞器讹开,因?yàn)橹灰雅鲎财鹘M件中的Is Trigger屬性勾選上,就變成了觸發(fā)器捐名。
和碰撞檢測(cè)類似旦万,觸發(fā)檢測(cè)也有三種方法,分別是OnTriggerEnter镶蹋、OnTriggerStay成艘、OnTriggerExit。
觸發(fā)檢測(cè)的驗(yàn)證也有很多情形贺归,根據(jù)兩個(gè)游戲?qū)ο蟮臈l件(是否帶有剛體和觸發(fā)器)的不同大致分為:雙方都帶有剛體和觸發(fā)器淆两、一方帶有剛體和觸發(fā)器,另一方只有剛體拂酣、一方帶有剛體和觸發(fā)器秋冰,另一方只有觸發(fā)器、雙方都只有剛體婶熬、雙方都只有觸發(fā)器剑勾。
這里就介紹一個(gè)情形下(一方帶有剛體和觸發(fā)器,另一方只有剛體)的觸發(fā)檢測(cè)方法的調(diào)用情況赵颅,其它情形自行操作虽另。
當(dāng)選中Is Trigger后,碰撞器就變成了觸發(fā)器饺谬,如果此時(shí)我們?cè)俳o游戲?qū)ο筇砑右粋€(gè)剛體捂刺,那么游戲?qū)ο缶蜁?huì)一直墜落,因?yàn)闆](méi)有了碰撞器,所以我們要想讓游戲?qū)ο笥袆傮w而又不墜落叠萍,我們就要選中剛體組件中的Is Kinematic屬性芝发,如圖1.5:
選中后,我們讓小球帶有剛體和觸發(fā)器苛谷,讓方塊只帶有剛體辅鲸。此時(shí)改一下小球和方塊的代碼,把觸發(fā)檢測(cè)的三個(gè)方法寫進(jìn)去腹殿,然后我們運(yùn)行項(xiàng)目独悴,操作小球移動(dòng),觀察打印結(jié)果锣尉,如圖1.6:
后面幾種情形自行實(shí)驗(yàn)過(guò)后我們就得出了一個(gè)結(jié)論:
只要有一方游戲?qū)ο髱в袆傮w和觸發(fā)器刻炒,另一方不管是否帶有剛體和觸發(fā)器,兩個(gè)游戲?qū)ο蠖紩?huì)調(diào)用觸發(fā)檢測(cè)方法自沧。
三坟奥、碰撞檢測(cè)和觸發(fā)檢測(cè)的異同
相同點(diǎn):
1、兩種檢測(cè)的基礎(chǔ)都是Collider組件拇厢;
2爱谁、兩種檢測(cè)的三種方法類似;
不同點(diǎn):
1孝偎、碰撞檢測(cè)必須兩個(gè)Collider組件都不勾選Is Trigger访敌,只要勾選了,就會(huì)進(jìn)入觸發(fā)檢測(cè)衣盾;
2寺旺、觸發(fā)檢測(cè)和碰撞檢測(cè)有沖突,不能同時(shí)存在势决,只能存在一個(gè)阻塑;