一 概念介紹
剛體
Rigidbody(剛體)組件可使游戲對象在物理系統的控制下來運動,剛體可接受外力與扭矩力用來保證游戲對象像在真實世界中那樣進行運動。任何游戲對象只有添加了剛體組件才能受到重力的影響,通過腳本為游戲對象添加的作用力以及通過NVIDIA物理引擎與其他的游戲對象發生互動的運算都需要游戲對象添加了剛體組件。
碰撞體
碰撞體是物理組件的一類,它要與剛體一起添加到游戲對象上才能觸發碰撞。如果兩個剛體相互撞在一起,除非兩個對象有碰撞體時物理引擎才會計算碰撞,在物理模擬中,沒有碰撞體的剛體會彼此相互穿過。
二 屬性
剛體Rigidbody組件的屬性
Mass質量 該項用於設置游戲對象的質量(建議在同一個游戲場景中,游戲對象之間的質量差值不要大於100倍)。
Drag阻力 0表示沒有空氣阻力,阻力極大時游戲對象會立即停止運動。
Angular Drag角阻力 當游戲對象受扭矩力旋轉時受到的空氣阻力。0表示沒有空氣阻力,阻力極大時游戲對象會立即停止運動。
Use Gravity使用重力 開啟此項,游戲對象受重力影響。
Is Kinematic是否開啟動力學 開啟此項,游戲對象將不再受物理引擎的影響從而只能通過Transform(幾何變換組件)屬性來對其操作,該方式適用於模擬平台移動或帶有鉸鏈關節鏈接剛體的動畫。
Interpolate插值 該項用於控制剛體運動的抖動情況。有三項可以選擇:
- None沒有插值
- Interpolate內插值,基於前一幀的Transform來平滑此次的Transform。
- Extrapolate外插值,基於下一幀的Transform來平滑此次的Transform。
Collision Detection碰撞檢測 該屬性用於控制避免高速運動的游戲對象穿過其他對象而未發生碰撞,有三項可以選擇:
Discrete離散碰撞檢測 該模式與場景中其他的所有碰撞體進行碰撞檢測,是默認值。
- Continuous連續碰撞檢測 該模式用於檢測與動態碰撞體(帶有Rigidbody)的碰撞,使用連續碰撞檢測模式來檢測與網格碰撞體的(不帶Rigidbody)碰撞。其他的剛體采用離散碰撞模式。此模式適用於那些需要與采用連續動態碰撞檢測的對象相碰撞的對象:這對物理性能會有很大的影晌 ,如果不需要對快速運動的對象進行碰撞檢測,就使用離散碰撞檢測模式。
- Continuous Dynamic連續動態碰撞檢測模式 該模式用於檢測與采用連續碰撞模式或連續動態碰撞模式對象的碰撞 ,也可用於檢 測 沒 有Rigidbody的靜態網格碰撞體 。 對於與之碰撞的其他對象可采用離散碰撞檢測。 動態連續 碰撞檢測模式也可用於檢測快速運動的游戲對象。
Constraints約束 該項用於控制剛體運動的約束。
- Freeze Position:凍結位置。剛體對象在世界坐標系中xyz軸方向上(勾選狀態)的移動無效。
- Freeze Rotation:凍結旋轉。剛體對象在世界坐標系中xyz軸方向上(勾選狀態)的旋轉無效。
使用剛體
剛體在受物理引擎作用之前必須要明確地添加給一個游戲對象,之后該對象就會受到重力和通過腳本添加的作用力的影響。
舉個例子吧:比如讓一個小球碰撞一個立方體。
首先要給小球添加一個剛體組件Rigidbody,確定"Use Gravity"和"Is Kinematic"(是否動力學)為取消狀態,即不使用重力模擬和確保受到物理力學的影響。
由於創建一個球體時,Unity會默認添加了一個Sphere Collider,所以不需要再添加碰撞體。
現在為小球添加一個腳本(C#)用來控制小球的移動和碰撞檢測。
腳本代碼如下:
using UnityEngine; using System.Collections; public class OperateBall : MonoBehaviour { public float speed;//控制小球的移動速度 // Use this for initialization void Start() { } // Update is called once per frame void Update() { float moveHorizontal = Input.GetAxis("Horizontal"); float moveVertical = Input.GetAxis("Vertical"); Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical); rigidbody.AddForce(movement * speed * Time.deltaTime); } void OnTriggerEnter(Collider other) { if (other.gameObject.tag == "pickup") { other.gameObject.SetActive(false);//如果是立方體,碰撞后設為禁用,在Game中就不會顯示 } } }
接着來設置一下cube立方體的屬性,確保Box Collider中的"Is Trigger"選項被勾選上。
Is Trigger為選中狀態,表明cube是一個觸發器,當小球碰撞它是會觸發小球腳本(BallControl.cs)中OnTriggerEnter的事件,接下來cube就會被禁用,不會顯示在Game中。
如果不選中Is Trigger,那么則無法用腳本來控制小球的移動。
碰撞前:
碰撞后:
注意
觸發事件,必須滿足如下三個條件:
1、必須都要有碰撞器組件(Collider)。
2、必須有一個物體帶剛體組件,並且處於運動狀體中(包括主動運動去撞擊別人和在運動過程中被別人撞擊)。
3、兩個碰撞器中至少有一個開啟了IsTrigger。