Rigidbody類峰伙,這個常用類是用于Unity模擬物理碰撞的浸卦,經(jīng)常使用,比較重要所有如失,下面詳細的描述Rigidbody的組件绊诲,以及該類的屬性和方法!
一.Rigidbody Compents:
Mass: 用于設(shè)置游戲?qū)ο笾械馁|(zhì)量褪贵,單位為千克掂之,默認為1kg
Drag:? 游戲?qū)ο笫芰\動時所受到的空氣的阻力,當為0時,表示沒有空氣助力板惑。
? ? ? ? ? ?設(shè)置的值越大橄镜,空氣阻力越大偎快,當值大到一個臨界值冯乘,物體將停止運動
Angular Drag: 游戲?qū)ο笫芘ぞ亓πD(zhuǎn)時受到的控制阻力猫缭。當為0時濒蒋,代表沒有空氣阻力
? ? ? ? ? ? ? ? ? ? ? ?阻力極大時游戲?qū)ο髸⒓赐V剐D(zhuǎn)。
Use Gravity:? 是否使用重力凡桥,勾選后該物體將會受到重力影響
Is Kinematic: 如果勾選丐怯,則該游戲?qū)ο蟛粫芪锢硪娴挠螒蚺绾茫荒芡ㄟ^Transform組件進行操作
? ? ? ? ? ? ? ? ? ? ?這對于移動平臺或者如果要為附加了HingeJoint(鉸鏈關(guān)節(jié))的Rigidbody設(shè)置動畫非常有用
Interpolate: 該選項是一個枚舉類型,作用是插值,
? ? ? ? ? ? ? ? ? ?None: 不使用插值? ? ? ? ?
? ? ? ? ? ? ? ? ? ?Interpolate:根據(jù)上一幀的Transform進行平滑插值
? ? ? ? ? ? ? ? ? ?Extrapolate:根據(jù)估算的下一幀的Transform進行平滑插值
Collision Detection:? 該屬性用于防止快速移動的對象在沒有檢測到碰撞下穿過其他對象而未發(fā)生碰撞读跷。
? ? ? ? ? ? ? ? ?Discrete:離散碰撞檢測梗搅,默認值,會對場景中所有的碰撞器使用離散碰撞檢測
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 但是在離散式的碰撞檢測中效览,當物體高速連續(xù)的運動時无切,該選項便
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 檢測到物體碰撞,因為速度太快丐枉,采用的是離散碰撞檢測哆键,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 一般用于檢測低速移動或者靜態(tài)物體的碰撞,較銷毀性能
? ? ? ? ? ? ? ?Continuous:?連續(xù)碰撞檢測瘦锹,該模式用于動態(tài)碰撞器(帶有Rigidbody)使用連續(xù)碰撞模式
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?來檢測與帶有Collidr的物體進行碰撞籍嘹,如果其他剛體設(shè)置為了ContinuousDynamic,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?會使用連續(xù)檢測和這個剛體進行碰撞檢測弯院,該選項用于需要采用連續(xù)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?碰撞檢測快速運動的物體辱士,該模式很銷毀性能,
? ? ? ? ? ? ? ? Continuous Dynamic: 連續(xù)動態(tài)碰撞檢測,該模式采用了連續(xù)且動態(tài)的碰撞模式听绳,如果與之碰撞的游戲物體
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?是Continuous或者Continuous Dynamic模式颂碘,與這個物體碰撞則會和這個剛體進行
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?連續(xù)碰撞檢測,當然也會和靜態(tài)的Collider使用連續(xù)檢測辫红,但是對于其他的Collider
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 例如模式為(Discrete的剛體)就會采用離散檢測凭涂。一般用于檢測快速動態(tài)的游戲物體
? ? ? ? ? ? ? ?Continuous Speculative: 使用推測式連續(xù)碰撞檢測,這是唯一的CDD模式贴妻,CDD模式能夠確鼻杏停快速的移動
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?的物體與物體進行碰撞,而不是穿過這樣物體名惩,Unity提供了兩種CCD方法澎胡。?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?具體的CDD模式本節(jié)不具體的闡述,留著下一節(jié)專門討論一下這個CDD模式
Constraints:? 剛體運動的約束,包括位置約束和旋轉(zhuǎn)約束攻谁,勾選表示在該坐標上不允許進行此類操作
? ? ? ? ? ? ? ? ? ? ? ?Freeze Position: 停止剛體在X軸稚伍、Y軸和Z軸上的運動
? ? ? ? ?? ? ? ? ? ? ? Freeze Rotation:停止剛體繞局部X軸、Y軸和Z軸選擇性旋轉(zhuǎn)戚宦。
二.Rigidbody Properities:
inertiaTensor:??此屬性用于設(shè)置剛體的慣性張量个曙,在距離重心同等的條件下,剛體會向張量值小的一邊切斜
? ? ? ? ? ? ? ? ? ? ? ? ?例如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軸旋轉(zhuǎn)45度
? ? ? ? ? ? transform.rotation = Quaternion.Euler(0,0,45);
? ? ? ? ? ? //設(shè)置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軸旋轉(zhuǎn)45度
? ? ? ? ? ? transform.rotation = Quaternion.Euler(0,0,45);
? ? ? ? ? ? //設(shè)置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軸旋轉(zhuǎn)45度
? ? ? ? ? ? transform.rotation = Quaternion.Euler(0,0,45);
? ? ? ? ? ? //設(shè)置Rigidbody的慣性張量
? ? ? ? ? ? m_Rigidbody.inertiaTensor = new Vector3(10.0f,10.0f,1.0f);
? ? ? ? }
? ? }
}
mass:該屬性用于設(shè)置或者返回剛體的質(zhì)量,一般情況下艳汽,剛體質(zhì)量在0.1左右模擬最佳猴贰,最大最好不要超過10
? ? ? ? ?否則容易出現(xiàn)不穩(wěn)定的情況,對于自由落體運動河狐,物體的速度只與重力加速度和空氣阻力Drug有關(guān)
? ? ? ? 與質(zhì)量無關(guān)米绕,mass的主要作用是在物體發(fā)生碰撞計算碰撞后物體的速度,當一個物體的分別去撞擊mass大和mass小的物體
? ? ? ??根據(jù)動量守恒定律馋艺,重的物體被撞擊后的速度要慢與較輕的物體栅干,代碼示例如下:
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: 該屬性用于返回或者設(shè)置剛體的速度 ,單位是米/每秒
? ? ? ? ? ? ? ? ?在腳本中無論是給剛體賦予一個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);
? ? }
}