Unity3D中的碰撞器
如果游戲?qū)ο笮枰袘?yīng)碰撞,那么必須給其添加碰撞器。默認(rèn)情況下,創(chuàng)建游戲?qū)ο髸r(shí),會(huì)自動(dòng)將碰撞器組件添加至其中,而碰撞器組件決定了模型碰撞的方式。Unity一共為對(duì)象提供了5中碰撞器,分別是:
Box Collider :盒子膨脹器。
Sphere Collider: 球體碰撞器。
Capsult Collider:膠囊碰撞器。
Mesh Collider:網(wǎng)格碰撞器。
Wheel Collider:車(chē)輪碰撞器
其中,Box Collider適用于立方體對(duì)象之間的碰撞,Sphere Collider適用于球體之間的碰撞,Capsule Collider適用于膠囊體對(duì)象之間的碰撞,Mesh Collider比較特殊,它的碰撞方式由自定義模型的自身網(wǎng)格決定,適用于自定義網(wǎng)格的碰撞,Wheel Collider 適用于車(chē)輪與地面或其他對(duì)象之間的碰撞。
在碰撞器之間可以添加物理材質(zhì),用于設(shè)定物理碰撞后的效果。物理材質(zhì)與碰撞器之間的關(guān)系非常緊密,比如兩個(gè)立方體相撞之后。按照物理引擎的效果,它們將開(kāi)始相互反彈,那么反彈的力度就是物理材質(zhì)決定的。
添加碰撞器的方法:
在Unity菜單欄中選擇“Compoent”-》“Physics”菜單項(xiàng),然后從中選擇碰撞器的種類(lèi)。
標(biāo)準(zhǔn)材質(zhì)庫(kù):
(Bouncy)彈性材質(zhì)
(Ice)冰材質(zhì)
(Metal)金屬材質(zhì)
(Rubber)橡膠材質(zhì)
(Wood)木頭材質(zhì)
物理材質(zhì)相關(guān)屬性的意思
Dynamic Friction:動(dòng)態(tài)摩擦,取值在0到1之間。0表示最小動(dòng)態(tài)摩擦,1表示最大動(dòng)態(tài)摩擦。
Static Friction:靜態(tài)摩擦,取值在0到1之間。0表示最小靜態(tài)摩擦,1表示最大靜態(tài)摩擦。
Bounciness:碰撞反彈系數(shù),取值在0到1之間。0表示碰撞無(wú)反彈,1表示碰撞最大反彈。
Friction Combine:普通碰撞后的摩擦模式。
Bounce Combine:反彈碰撞后的摩擦模式。
Friction Direction 2:摩擦方向,方向分為x軸、y軸和z軸。
Dynamic Friction 2:動(dòng)摩擦系數(shù),它的摩擦方向根據(jù)Friction Direction 2 設(shè)定。
Static Friction 2: 靜摩擦系數(shù),它的摩擦方向根據(jù)Friction Direction 2 設(shè)定。
Unity引擎觸發(fā)器
碰撞觸發(fā)器意思就是檢測(cè)到兩個(gè)物體碰撞的時(shí)候,觸發(fā)執(zhí)行腳本相關(guān)的邏輯。比如在游戲中實(shí)現(xiàn)兩個(gè)物體相撞的時(shí)候產(chǎn)生爆炸的效果,那么就需要通過(guò)觸發(fā)器來(lái)檢測(cè)到兩個(gè)物體相撞的時(shí)候,然后播放預(yù)設(shè)好的爆炸的粒子效果。
Unity引擎觸發(fā)器系統(tǒng)有三個(gè)屬性:Box Collider、Is Trigger、Rigibody
Box Collider:Unity3D的GameObject提供的基本模型才具有這個(gè)屬性,表示該物體是否會(huì)和別的物體發(fā)生碰撞。
Is Trigger:BoxCollider的子選項(xiàng),表示該物件是否為一個(gè)觸發(fā)器。
Rigibody:選中物件,才能在菜單“Component”里,給物件添加Rigibody組件。
兩Collider相碰,至少要有一個(gè)物體具有Rigibody剛體才會(huì)觸發(fā)Trigger函數(shù)。當(dāng)物體進(jìn)來(lái),OnTriggerEnter當(dāng)然會(huì)觸發(fā)。出去時(shí),OnTriggerExit也當(dāng)然觸發(fā)。那么物體在進(jìn)來(lái)后Destory后會(huì)如何?經(jīng)過(guò)測(cè)試是:不會(huì)調(diào)用OnTriggerExit。
基本規(guī)則:腳本(含有觸發(fā)判斷的 OnTriggerEnter() 判斷函數(shù))和Rigibody同為一個(gè)物件的組件,Box Collider必須選中。此時(shí)兩個(gè)物件的Box Collider必須為選中。而 Is Trigger選項(xiàng)必須“至少”有一個(gè)物件為選中(可以按邏輯來(lái)判斷哪個(gè)為觸發(fā)器)。 腳本中的OnTriggerEnter()可以有兩種判斷出發(fā)方式,此函數(shù)參數(shù)的數(shù)據(jù)類(lèi)型為 Collider。 OnTriggerEnter( gameObj : Collider ),一旦觸發(fā)器和Collider發(fā)生碰撞,便會(huì)觸發(fā)此函數(shù),其參數(shù)便是不包含腳本的物件的gameObject。可以通過(guò)判斷其成員 name(物體在Hierarchy面板中的名字) 或 tag(物件在Inspector面板的Tag選項(xiàng)中的名字) 的字符串,來(lái)判定是哪個(gè)物件。
關(guān)于Unity里面的觸發(fā)器的應(yīng)用不僅僅可以解決物體之間的碰撞問(wèn)題,常常還會(huì)用來(lái)實(shí)現(xiàn)游戲邊界的檢測(cè)輔助實(shí)現(xiàn)一些游戲邏輯。
1、使用Empty GameObject來(lái)實(shí)現(xiàn)地面或者頂部邊緣的檢測(cè),比如在實(shí)現(xiàn)游戲主角從上面掉下來(lái)就會(huì)死掉,那么就可以在底部做一個(gè)Empty GameObject來(lái)通過(guò)觸發(fā)器檢測(cè)游戲主角是否掉下來(lái)。
2、游戲背景或者物體的動(dòng)態(tài)生成,比如要實(shí)現(xiàn)一個(gè)打飛機(jī)游戲,敵人和背景都是從上往下移動(dòng),在游戲的實(shí)現(xiàn)邏輯里面,當(dāng)上面的敵人和背景向下移動(dòng)到底部的時(shí)候,你需要再生成一批敵人和背景從上面繼續(xù)移動(dòng),而當(dāng)這一批敵人和背景離開(kāi)屏幕的時(shí)候,你還需要銷(xiāo)毀掉它們。實(shí)現(xiàn)這樣的一個(gè)邏輯也可以依靠觸發(fā)器來(lái)輔助實(shí)現(xiàn)。原理如下圖所示:?
? ? ?
觸發(fā)器的示例代碼:
using UnityEngine;
using System.Collections;
// 邊緣觸發(fā)器,當(dāng)移動(dòng)的物體碰撞到之后將產(chǎn)生新的
public class LevelEdge : MonoBehaviour
{
// 碰到邊緣 重新生成背景的物體 這里才是判斷是否生成新的游戲物體的前提
void OnTriggerEnter(Collider other)
{
// 碰撞到新增觸發(fā)器,將新增一套新的物體
if (other.name == “SpawnTriggerer”)
{
switch (other.tag)
{
case “SecondLayer”:
LevelGenerator.Instance.GenerateSecondLayer(0);
break;
case “ThirdLayer”:
LevelGenerator.Instance.GenerateThirdLayer(0);
break;
case “FourthLayer”:
LevelGenerator.Instance.GenerateFourthLayer(0);
break;
case “Obstacles”:
LevelGenerator.Instance.GenerateObstacles();
break;
}
}
// 碰撞到重設(shè)觸發(fā)器,將銷(xiāo)毀當(dāng)前的物體
else if (other.name == “ResetTriggerer”)
{
switch (other.tag)
{
case “SecondLayer”:
case “ThirdLayer”:
case “FourthLayer”:
LevelGenerator.Instance.SleepGameObject(other.transform.parent.gameObject);
break;
case “Obstacles”:
other.transform.parent.GetComponent《Obstacles》().DeactivateChild();
LevelGenerator.Instance.SleepGameObject(other.transform.parent.gameObject);
break;
}
}
// 碰撞到武器
else if (other.tag == “PowerUps”)
{
other.GetComponent《PowerUp》().ResetThis();
}
//If a torpedo is collided with this
// 碰撞到炮彈
else if (other.name == “Torpedo”)
{
other.transform.parent.gameObject.GetComponent《Torpedo》().ResetThis();
}
}
}
unity3d 碰撞器和觸發(fā)器的區(qū)別
碰撞器:Box Collider 盒碰撞器、Capsule Collider 膠囊碰撞器、Mesh Collider 網(wǎng)格碰撞器、Sphere Collider 球碰撞器 等等這一類(lèi)組件。
觸發(fā)器:以上這些碰撞器在檢視面板中勾選IsTrigger屬性就變成了觸發(fā)器
區(qū)別:
(1)碰撞器有碰撞效果
(2)IsTrigger=false
(3)碰撞信息檢測(cè)
MonoBehaviour.OnCollisionEnter(Collision collision)
MonoBehaviour.OnCollisionExit(Collision collision)
MonoBehaviour.OnCollisionStay(Collision collision)
(1)觸發(fā)器沒(méi)有碰撞效果
(2)IsTrigger=true;
(3)觸發(fā)信息檢測(cè):
MonoBehaviour.OnTriggerEnter(Collider collider)
MonoBehaviour.OnTriggerExit(Collider collider)
MonoBehaviour.OnTriggerStay(Collider collider)
要明白什么時(shí)候才會(huì)產(chǎn)生碰撞?或者說(shuō)怎樣才能觸發(fā)以上那些函數(shù)?
剛體(Rigidbody)
剛體使物體能在物理控制下運(yùn)動(dòng)。剛體可通過(guò)接受力與扭矩,使物體像現(xiàn)實(shí)方式一樣運(yùn)動(dòng)。任何物體想要受重力影響,受腳本施加的力的作用,或通過(guò)NVIDIA PhysX物理引擎來(lái)與其他物體交互,都必須包含一個(gè)剛體組件。
碰撞器(那些Collider,例如BoxCollider)和剛體(Rigidbody)要一起使用才會(huì)產(chǎn)生碰撞,才會(huì)觸發(fā)以上那些函數(shù),只是不同的組合方式觸發(fā)的函數(shù)不同,例如是否勾選IsTrigger。
一些專(zhuān)業(yè)術(shù)語(yǔ)需要了解
1、Static Collider 靜態(tài)碰撞器
指的是沒(méi)有附加剛體而附加了碰撞器的游戲?qū)ο?。這類(lèi)對(duì)象會(huì)保持靜止或者很輕微的移動(dòng)。對(duì)于環(huán)境模型十分好用,當(dāng)和剛體碰撞時(shí)而不會(huì)移動(dòng)。
2、Rigidbody Collider 剛體碰撞器
指的是同時(shí)附加了剛體和碰撞器的游戲?qū)ο?。通過(guò)腳本的力量和碰撞完全受物理引擎的影響??梢院椭话鲎财鞯挠螒?qū)ο笈鲎病?huì)成為你游戲中使用物理效果的基本類(lèi)型碰撞器。
3、Kinematic Rigidbody Collider 運(yùn)動(dòng)學(xué)剛體碰撞器
指的是同時(shí)包含碰撞器和剛體,并且激活I(lǐng)sKinematic的一類(lèi)游戲?qū)ο?,要移?dòng)這類(lèi)游戲?qū)ο?,要修改它的Transform組件,而不是用力。它們很像靜態(tài)碰撞器不過(guò)對(duì)于想要不停地到處移動(dòng)的碰撞器很好用。
如果有剛體有時(shí)候變得靜止不動(dòng)了,那么它們就是進(jìn)入休眠了。意味著它們將不受物理變化影響,也就不會(huì)移動(dòng)。如果你把一個(gè)運(yùn)動(dòng)學(xué)剛體從一個(gè)休眠的普通剛體下邊移走,那休眠的剛體就會(huì)被喚醒并重新被物理變化時(shí)時(shí)影響。
舉例:兩個(gè)方塊,Cube1和Cube2 ,移動(dòng)一個(gè)方塊去碰撞另外一個(gè)方塊。
(1)如果這兩個(gè)方塊都只掛著碰撞器(例如BoxCollider)沒(méi)有掛剛體(Rigidbody),不會(huì)觸發(fā)消息
(2)兩個(gè)方塊都掛著碰撞器(例如BoxCollider)和 剛體(Rigidbody),IsTrigger=false的情況下響應(yīng)碰撞檢測(cè)函數(shù),IsTrigger=true的情況下響應(yīng)觸發(fā)檢測(cè)函數(shù)
僅提供以上兩個(gè)思路,大家可以試著嘗試各種組合,查看觸發(fā)哪些函數(shù)。
評(píng)論
查看更多