要產生碰撞必須為游戲對象添加剛體(Rigidbody)和(各種類型的3D/2D)碰撞器(Collider),剛體可以讓物體在物理影響下運動.下面先講3D情況下:
兩個物體都必須帶有碰撞器(Collider),運動的物體還必須帶有Rigidbody剛體夺溢。
在unity3d中是己,能檢測碰撞發(fā)生的方式有兩種跺撼,一種是利用碰撞器租谈,另一種則是利用觸發(fā)器.
碰撞器:一群組件撮执,它包含了很多種類孵奶,比如:Box Collider(盒碰撞體)司忱,Mesh Collider(網格碰撞體)等,這些碰撞器應用的場合不同锄蹂,但都必須加到GameObjecet身上氓仲。
觸發(fā)器,只需要在檢視面板中的碰撞器組件中勾選IsTrigger屬性選擇框得糜。
觸發(fā)信息檢測:當Is Trigger=true時敬扛,碰撞器被物理引擎所忽略,沒有碰撞效果朝抖,可以調用OnTriggerEnter/Stay/Exit函數啥箭。
1.MonoBehaviour.OnTriggerEnter(Collider collider)當進入觸發(fā)器
2.MonoBehaviour.OnTriggerExit(Collider collider)當退出觸發(fā)器
3.MonoBehaviour.OnTriggerStay(Collider collider)當逗留觸發(fā)器
碰撞信息檢測:當Is Trigger=false時,碰撞器根據物理引擎引發(fā)碰撞治宣,產生碰撞的效果急侥,可以調用OnCollisionEnter/Stay/Exit函數砌滞;
1.MonoBehaviour.OnCollisionEnter(Collision collision) 當進入碰撞器
2.MonoBehaviour.OnCollisionExit(Collision collision) 當退出碰撞器
3.MonoBehaviour.OnCollisionStay(Collision collision)? 當逗留碰撞器
collider的性能和效率大概的順序是:Sphere Collider > Capsule > Box Collider > Mesh Collider
碰撞器是另一種組件,它和剛體一起坏怪,來使碰撞發(fā)生贝润。如果兩個剛體撞在一起,物理引擎將不會計算碰撞除非它們包含一個碰撞器組件陕悬。沒有碰撞器的剛體,會在物理模擬中相互穿透按傅。碰撞器必須獨立于剛體加在對象上捉超。碰撞器并不一定需要附加剛體,但是要使移動物體具有碰撞效果必須附加剛體唯绍。為了使兩個觸發(fā)器碰撞時發(fā)出碰撞事件拼岳,其中一個必須包含剛體。
網格碰撞器之間通常不相互碰撞况芒,但如果一個網格碰撞器被標記為凸起的(Convex )惜纸,那么它就可以與其他網格碰撞器碰撞,對移動的對象使用基本/組合碰撞器,而對靜態(tài)環(huán)境對象使用網格碰撞器绝骚。碰撞網格使用背面剔除(或譯背面揀選耐版,指正面多邊形擋住了在它后面的背面多邊形,Direct3D將通過揀選(即刪除多余的處理過程)背面多邊形來提高效率的過程。)如果一個對象和被背面剔除的網格碰撞压汪,那也不會在物理上碰撞粪牲。
Unity組件文中將碰撞體分為3個類型:
1:Static Collider 靜態(tài)碰撞器
指的是沒有附加剛體而附加了碰撞器的游戲對象。這類對象會保持靜止或者很輕微的移動止剖。對于環(huán)境模型十分好用腺阳,當和剛體碰撞時而不會移動。
2:Rigidbody Collider 剛體碰撞器
指的是同時附加了剛體和碰撞器的游戲對象穿香。通過腳本的力量和碰撞完全受物理引擎的影響亭引。可以和只包含碰撞器的游戲對象碰撞皮获。將會成為你游戲中使用物理效果的基本類型碰撞器焙蚓。
3:Kinematic Rigidbody Collider 運動學剛體碰撞器
指的是同時包含碰撞器和剛體,并且激活IsKinematic的一類游戲對象洒宝,要移動這類游戲對象主届,要修改它的Transform組件(指的是position和rotation這類屬性),而不是用力待德。它們很像靜態(tài)碰撞器君丁,不過如果你想要不停地到處移動碰撞器,它們會更好用将宪。這類游戲對象還有許多其他的獨特使用情景绘闷。
運動學剛體碰撞器是個非常懶惰和霸道的家伙橡庞,它碰到其他碰撞器完全沒有反應(其實還是有點反應,會觸發(fā)一些碰撞函數的印蔗,后面有解釋)扒最。它不受力、重力或扭矩的影響华嘹“扇ぃ可以通過設置Transform 的position和rotation來準確的操作它們或者讓它們動起來,但是耙厚,它們可以和其他的非運動學剛體互相作用强挫。對于放在運動學剛體碰撞器上面的剛體,會受到運動學剛體施加的摩擦力薛躬。
4:Character Controllers 角色控制器
如果想制作一個類似人的角色那就使用角色控制器俯渤。這可以是第三人稱平臺游戲、第一人稱射擊游戲的主要角色或任何敵對角色型宝。
這類控制器不遵循物理規(guī)則因此它感覺上不對勁(在Doom中八匠,你跑到了90英里每小時,然后馬上停下而且可以極快的轉身)趴酣。不過梨树,角色控制器執(zhí)行碰撞檢測以保證你的角色可以沿著墻滑動,上下臺階等等岖寞。
角色控制器不受力影響(但是重力效果還是有的)但是可以被由代碼施加的力推動劝萤。通常,所有類似人的角色都用角色控制器來執(zhí)行慎璧。
角色控制器本身不具物理特性床嫌,因此如果想應用真正的物理作用——在繩上搖擺,被大石頭推動——到你的角色胸私,必須用剛體厌处,這會允許你把鉸鏈或力用到你的角色上。角色控制器永遠沿Y軸對齊岁疼,因此阔涉,如果你的角色需要在空間中改變方向那也必須用到剛體(比如在變化的引力控制下)。但是捷绒,要意識到調整一個剛體在角色上表現自然是很難的瑰排,因為游戲角色自身的非物理特性總想表現出來。另一個困難是暖侨,角色控制器可以從特定高度的臺階上平滑地滑下椭住,而剛體不會。
控制器不會對加在它自身上的力做出反應字逗,也不會自動推開其他剛體京郑。(這里我沒有明白宅广,因為我實驗過在一個剛體內部實例化一個控制器,剛體是會被彈開的些举。如果有人懂請告訴我跟狱,不勝感激!)
如果想讓角色控制器推開其他剛體或者對象户魏,你可以在對象附加的腳本中添加OnControllerColliderHit()函數驶臊,這樣對它們施加力就能夠產生碰撞。
也就是說叼丑,角色控制器可以使用物理效果影響其他對象关翎,前提是你自己寫了腳本。
而角色控制器不能通過物理效果被其他對象影響幢码。因此笤休,如果你想讓你的游戲角色被物理效果影響尖飞,那就最好使用剛體而不是角色控制器症副。
角色控制器和運動學剛體有點像,因為它們都不受力的作用(運動學剛體更像是一個剛體政基,只是不會受到其他任何外力的影響贞铣,就像是古代的國王,雖然和普通平民一樣都是人沮明,但是只能他欺負別人辕坝,別人無法欺負他;而角色控制器本身就不具有物理特性荐健,不可以推開別人(除非寫了自己的腳本)酱畅,也不會被別人影響,只是它可以執(zhí)行碰撞檢測)江场。但是也有幾點不同的地方纺酸。首先,運動學剛體是無法通過代碼施加力的作用來推動址否,但是角色控制器是可以的餐蔬。第二,運動學剛體不會受到重力的作用佑附,而角色控制器是有重力效果的樊诺。其次,角色控制器只能沿Y軸旋轉音同,也就是人永遠都是直立狀態(tài)词爬,不會因為受到力的作用就趴下啦,而剛體是可以的权均。第三缸夹,角色控制器可以從特定高度臺階上平滑地滑下痪寻,而剛體不會。
剛體休眠:靜止的剛體會進入休眠虽惭。例如橡类,當一個正方體掉到地板上靜止后就會進入剛體休眠.剛體休眠完全自動發(fā)生,只要剛體的速度低于sleepAngularVelocity和sleepVelocity,該剛體就會開始休眠.其空閑一些幀后芽唇,就會被設置成休眠狀態(tài),處于休眠狀態(tài)中的物體顾画,不會再對其進行碰撞檢測和模擬。這會節(jié)約大量的CPU開銷匆笤。移動的靜態(tài)碰撞器無法喚醒它.運動學剛體由于會對剛體產生力的作用而可以喚醒休眠中的剛體.
實例:都是A物體去撞B物體
一研侣、A(碰撞體),B(沒有碰撞體炮捧,無論有沒有剛體)庶诡,沒有觸發(fā)事件。
二咆课、A(碰撞體)末誓,B(碰撞體),沒有觸發(fā)事件书蚪。
二喇澡、A(碰撞體和剛體,開啟IsTrigger)殊校,B(碰撞體晴玖,關閉IsTrigger),雙方都能收到觸發(fā)事件为流。
三呕屎、A(碰撞體和剛體,關閉IsTrigger)敬察,B(碰撞體秀睛,開啟IsTrigger),雙方都能收到觸發(fā)事件静汤。
四琅催、A (碰撞體,關閉IsTrigger)虫给,B(碰撞體和剛體藤抡,開啟IsTrigger),沒有觸發(fā)事件抹估。
五缠黍、A (碰撞體,開啟IsTrigger)药蜻,B(碰撞體和剛體瓷式,關閉IsTrigger)替饿,沒有觸發(fā)事件。
只要A有帶有碰撞體和剛體,正在運動,B帶有碰撞體,不管是A撞B還是B撞A,A和B至少一個開啟了IsTrigger,都會觸發(fā)事件.
結論:產生觸發(fā)事件的兩個物體會相互穿越贸典,準確的說是因為開啟IsTrigger那個物體會被物理引擎鎖忽略掉视卢,所以會產生兩個物體穿越的情況。兩個對象要么都收到碰撞事件廊驼,要么都收到觸發(fā)事件据过,不會出現一個收到觸發(fā)事件,一個收到碰撞事件的情況妒挎。要使用AddForce/AddTorque利用物理引擎去操作,如果直接設置坐標,2個物體產生碰撞,但是會穿越彼此.
關于各種Collider的效率高低排序為
sphere Collider> capsule collider> box Collider> mesh Collider
參考:http://www.ceeger.com/Manual/Physics.html? ?
https://docs.unity3d.com/Manual/PhysicsSection.html
http://www.cnblogs.com/slysky/p/4290803.html
pc:Physics.Raycast()方法中,源頭一般是攝像機,方向一般是從屏幕方向射向內部3D空間,用屏幕坐標轉向視口坐標Camera.main.ScreenToViewportPoint表示方向,RaycastHit hit信息,設置LayerMask.