Rigidbody類,這個常用類是用于Unity模擬物理碰撞的,經常使用,比較重要所有,下面詳細的描述Rigidbody的組件,以及該類的屬性和方法!
一.Rigidbody Compents:
Mass: 用于設置游戲對象中的質量,單位為千克,默認為1kg
Drag:? 游戲對象受力運動時所受到的空氣的阻力,當為0時,表示沒有空氣助力。
? ? ? ? ? ?設置的值越大,空氣阻力越大,當值大到一個臨界值,物體將停止運動
Angular Drag: 游戲對象受扭矩力旋轉時受到的控制阻力。當為0時,代表沒有空氣阻力
? ? ? ? ? ? ? ? ? ? ? ?阻力極大時游戲對象會立即停止旋轉。
Use Gravity:? 是否使用重力,勾選后該物體將會受到重力影響
Is Kinematic: 如果勾選,則該游戲對象不會受物理引擎的游戲,只能通過Transform組件進行操作
? ? ? ? ? ? ? ? ? ? ?這對于移動平臺或者如果要為附加了HingeJoint(鉸鏈關節)的Rigidbody設置動畫非常有用
Interpolate: 該選項是一個枚舉類型,作用是插值,
? ? ? ? ? ? ? ? ? ?None: 不使用插值? ? ? ? ?
? ? ? ? ? ? ? ? ? ?Interpolate:根據上一幀的Transform進行平滑插值
? ? ? ? ? ? ? ? ? ?Extrapolate:根據估算的下一幀的Transform進行平滑插值
Collision Detection:? 該屬性用于防止快速移動的對象在沒有檢測到碰撞下穿過其他對象而未發生碰撞。
? ? ? ? ? ? ? ? ?Discrete:離散碰撞檢測,默認值,會對場景中所有的碰撞器使用離散碰撞檢測
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 但是在離散式的碰撞檢測中,當物體高速連續的運動時,該選項便
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 檢測到物體碰撞,因為速度太快,采用的是離散碰撞檢測,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 一般用于檢測低速移動或者靜態物體的碰撞,較銷毀性能
? ? ? ? ? ? ? ?Continuous:?連續碰撞檢測,該模式用于動態碰撞器(帶有Rigidbody)使用連續碰撞模式
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?來檢測與帶有Collidr的物體進行碰撞,如果其他剛體設置為了ContinuousDynamic,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?會使用連續檢測和這個剛體進行碰撞檢測,該選項用于需要采用連續
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?碰撞檢測快速運動的物體,該模式很銷毀性能,
? ? ? ? ? ? ? ? Continuous Dynamic: 連續動態碰撞檢測,該模式采用了連續且動態的碰撞模式,如果與之碰撞的游戲物體
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?是Continuous或者Continuous Dynamic模式,與這個物體碰撞則會和這個剛體進行
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?連續碰撞檢測,當然也會和靜態的Collider使用連續檢測,但是對于其他的Collider
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 例如模式為(Discrete的剛體)就會采用離散檢測。一般用于檢測快速動態的游戲物體
? ? ? ? ? ? ? ?Continuous Speculative: 使用推測式連續碰撞檢測,這是唯一的CDD模式,CDD模式能夠確保快速的移動
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?的物體與物體進行碰撞,而不是穿過這樣物體,Unity提供了兩種CCD方法。?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?具體的CDD模式本節不具體的闡述,留著下一節專門討論一下這個CDD模式
Constraints:? 剛體運動的約束,包括位置約束和旋轉約束,勾選表示在該坐標上不允許進行此類操作
? ? ? ? ? ? ? ? ? ? ? ?Freeze Position: 停止剛體在X軸、Y軸和Z軸上的運動
? ? ? ? ?? ? ? ? ? ? ? Freeze Rotation:停止剛體繞局部X軸、Y軸和Z軸選擇性旋轉。
二.Rigidbody Properities:
inertiaTensor:??此屬性用于設置剛體的慣性張量,在距離重心同等的條件下,剛體會向張量值小的一邊切斜
? ? ? ? ? ? ? ? ? ? ? ? ?例如m_Rigidbody.inertiaTensor = new Vector3(15.0f,10.0f,1.0f);
? ? ? ? ? ? ? ? ? ? ? ? ?則剛體會向y軸傾斜,反之亦然,當張量相同的時候,那就是隨機在各軸方向傾斜
public class RigidbodyInertiaTensor : MonoBehaviour
{
? ? private Rigidbody m_Rigidbody;
? ? void Start()
? ? {
? ? ? ? m_Rigidbody = gameObject.GetComponent<Rigidbody>();
? ? }
? ? private void OnGUI()
? ? {
? ? ? ? if (GUI.Button(new Rect(10, 10, 200, 45), "y軸的慣性張量小于x軸"))
? ? ? ? {
? ? ? ? ? ? transform.position = new Vector3(0,4,0);
? ? ? ? ? ? //讓自身繞z軸旋轉45度
? ? ? ? ? ? transform.rotation = Quaternion.Euler(0,0,45);
? ? ? ? ? ? //設置Rigidbody的慣性張量
? ? ? ? ? ? m_Rigidbody.inertiaTensor = new Vector3(15.0f,10.0f,1.0f);
? ? ? ? }
? ? ? ? if (GUI.Button(new Rect(10, 60, 200, 45), "x軸的慣性張量小于y軸"))
? ? ? ? {
? ? ? ? ? ? transform.position = new Vector3(0,4,0);
? ? ? ? ? ? //讓自身繞z軸旋轉45度
? ? ? ? ? ? transform.rotation = Quaternion.Euler(0,0,45);
? ? ? ? ? ? //設置Rigidbody的慣性張量
? ? ? ? ? ? m_Rigidbody.inertiaTensor = new Vector3(5.0f,10.0f,1.0f);
? ? ? ? }
? ? ? ? if (GUI.Button(new Rect(10, 110, 200, 45), "y軸的慣性張量與x軸相同"))
? ? ? ? {
? ? ? ? ? ? transform.position = new Vector3(0,4,0);
? ? ? ? ? ? //讓自身繞z軸旋轉45度
? ? ? ? ? ? transform.rotation = Quaternion.Euler(0,0,45);
? ? ? ? ? ? //設置Rigidbody的慣性張量
? ? ? ? ? ? m_Rigidbody.inertiaTensor = new Vector3(10.0f,10.0f,1.0f);
? ? ? ? }
? ? }
}
mass:該屬性用于設置或者返回剛體的質量,一般情況下,剛體質量在0.1左右模擬最佳,最大最好不要超過10
? ? ? ? ?否則容易出現不穩定的情況,對于自由落體運動,物體的速度只與重力加速度和空氣阻力Drug有關
? ? ? ? 與質量無關,mass的主要作用是在物體發生碰撞計算碰撞后物體的速度,當一個物體的分別去撞擊mass大和mass小的物體
? ? ? ??根據動量守恒定律,重的物體被撞擊后的速度要慢與較輕的物體,代碼示例如下:
public class RigidbodyMass : MonoBehaviour
{
? ? ? public Rigidbody r1,r2,r3,r4,r5;
? ? ? Vector3 v3 = Vector3.zero;
? ? void Start()
? ? {
? ? ? ? r1.mass = 0.1f;
? ? ? ? r2.mass = 5.0f;
? ? ? ? r3.mass = 2.0f;
? ? ? ? r4.mass = 0.1f;
? ? ? ? r5.mass = 4.0f;
? ? ? ? r3.useGravity = false;
? ? ? ? r4.useGravity = false;
? ? ? ? r5.useGravity = false;
? ? ? ? v3 = r3.position;
? ? }
? ? private void FixedUpdate()
? ? {
? ? ? ? Debug.Log(Time.time +" "+ "R1的速度=" + r1.velocity);
? ? ? ? Debug.Log(Time.time +" "+ "R2的速度=" + r2.velocity);
? ? ? ? Debug.Log(Time.time +" "+ "R3的速度=" + r3.velocity);
? ? ? ? Debug.Log(Time.time +" "+"R4的速度=" + r4.velocity);
? ? ? ? Debug.Log(Time.time +" "+ "R5的速度=" + r5.velocity);
? ? }
? ? private void OnGUI() {
? ? ? ? if(GUI.Button(new Rect(10,10,200,45),"用R3撞R4"))
? ? ? ? {
? ? ? ? ? ? r3.position = v3;
? ? ? ? ? ? r3.rotation = Quaternion.identity;
? ? ? ? ? ? r3.velocity = new Vector3(0,0,4);
? ? ? ? }
? ? ? ? ? if(GUI.Button(new Rect(10,60,200,45),"用R3撞R5"))
? ? ? ? {
? ? ? ? ? ? r3.position = v3;
? ? ? ? ? ? r3.rotation = Quaternion.identity;
? ? ? ? ? ? r3.velocity = new Vector3(0,0,4);
? ? ? ? }
? ? }
}
velocity: 該屬性用于返回或者設置剛體的速度 ,單位是米/每秒
? ? ? ? ? ? ? ? ?在腳本中無論是給剛體賦予一個Vector3類型的向量,還是獲取當前剛體的速度,都是相當世界坐標系
public class RigidbodyVelocity : MonoBehaviour
{
? public Rigidbody A,B;
? ? void Start()
? ? {
? ? ? ? A.velocity = new Vector3(0,0,-15.0f);
? ? ? ? B.velocity = new Vector3(0,0,10.0f);
? ? }
? ? private void OnGUI()
? ? {
? ? ? ? GUI.Label(new Rect(10, 10, 300, 45), "A物體當前的速度為:" + A.velocity);
? ? ? ? GUI.Label(new Rect(10, 60, 300, 45), "B物體當前的速度為:" + B.velocity);
? ? ? ? Debug.Log("A物體當前的速度為:" + A.velocity);
? ? ? ? Debug.Log("B物體當前的速度為:" + B.velocity);
? ? }
}