Unity常用类—Rigidbody类

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);

    }

}


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容