分类:Unity、C#、VS2015

创建日期:2016-05-02

一、简介

Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可接受外力与扭矩力,使游戏对象像在真实世界中那样进行运动。

任何游戏对象,只有对其添加了刚体组件,该对象才能受重力的影响。

通过脚本为游戏对象添加的作用力,以及通过NVIDlA物理引擎与其他的游戏对象发生互动的运算,都需要为游戏对象添加刚体组件。

二、如何为对象添加刚体

在Unity 5.x中为某个游戏对象添加刚体组件的办法是:选中要添加刚体的游戏对象-->【Component】-->【Physics】-->【Rigidbody】,这样就为该对象添加了刚体。

添加刚体和碰撞体后,选择该对象,就会看到其周围被一层绿色的框线包围:

添加刚体和碰撞体的目的主要用于将该对象和其他对象之间进行碰撞检测。碰撞体既可以用胶囊体来实现,也可以用其他碰撞体组件来实现。

三、相关属性

与刚体相关的属性如下。

1、Mass (质量)

对象的质量(任意单位)。不应使质量比其他刚体 (Rigidbody) 的质量大或小100 倍。

2、Drag (阻力)

在由于施加力而移动时空气阻力对对象的影响程度。0 表示无空气阻力,空气阻力为无穷大将会使对象立即停止移动。

3、Angular Drag (角阻力)

对某个对象施加扭矩而导致该对象旋转时,空气阻力对该对象的影响程度。0 表示无空气阻力。注意:不能仅仅通过将其“角阻力”(Angular Drag) 设置为无穷大使对象停止旋转。

4、Use Gravity (是否使用重力)

如果启用,则对象将受重力影响。

5、Is Kinematic (是否开启运动学)

如果启用,则该对象不会由物理引擎驱动,而是只能通过对其施加变换 (Transform)进行处理。对于手机等移动平台,或者对附加了铰链关节 (HingeJoint) 的刚体 (Rigidbody) 进行动画处理时,为对象开启运动学十分有用。

6、Interpolate (插值处理)

该项用于控制刚体运动的抖动情况。仅当在刚体 (Rigidbody) 移动中发现不平稳时,才尝试下面这些选项之一:

None:不应用插值。

Interpolate:内插。变换(Transform) 基于上一帧的变换 (Transform) 进行平滑处理。

Extrapolate:外插。变换 (Transform) 基于下一帧的估计变换 (Transform) 进行平滑处理。

7、Collision Detection (碰撞检测)

该属性用于控制避免高速运动的游戏对象穿过其他的对象而未发生碰撞。选项有:

(1)Discrete(离散)

对场景中的所有其他碰撞体 (Collider) 全部使用离散 (Discreet) 碰撞检测。该项为默认值。

(2)Continuous (连续)

对刚体 (Rigidbody) 进行碰撞测试时,对带有刚体的动态碰撞体 (Collider) 使用离散 (Discreet) 碰撞检测;对不带刚体的静态网格碰撞体 (static Mesh Collider)使用连续 (Continuous) 碰撞检测。

(3)Continuous Dynamic (连续动态)

该选项可用于快速移动的对象。

对设置为“连续”(Continuous) 和“连续动态”(Continuous Dynamic) 碰撞的对象使用连续 (Continuous) 碰撞检测。它对不带刚体的静态网格碰撞体也使用连续 (Continuous) 碰撞检测。对于所有其他碰撞体 (Collider),使用离散 (Discreet) 碰撞检测。

注意:连续动态(Continuous Dynamic) 检测需要与之碰撞的对象对物理性能的影响非常大,如果对快速对象的碰撞没有问题,应该将其设置为“离散”(Discreet)而不是连续动态。

8、Constraints (约束)

对刚体 (Rigidbody) 运动的限制。

(1)Freeze Position (冻结位置)

选择性地在世界坐标 X、Y 和 Z 轴上停止刚体 (Rigidbody) 移动。即:刚体对象在世界坐标系中的X、Y、4由方向上(勾选状态)的移动将无效。

(2)Freeze Rotation (冻结旋转)

选择性地停止刚体 (Rigidbody) 围绕世界坐标 X、Y 和 Z 轴的旋转。即:刚体对象在世界坐标系中的X、Y、4由方向上(勾选状态)的旋转将无效。

三、注意事项

1、Rigidbody和Transform只能二选一

刚体(Rigidbody)会使游戏对象在物理引擎的控制下运动,例如可以以真实的碰撞形式来开门或计算其他的行为。通过在刚体上添加作用力来操作游戏对象,这与直接调整Transform组件相比在视觉及感受上都有很大的不同。通常情况下,没有必要在操作—个对象刚体的同时也操作其Transform,只需要二选其一即可。

操作游戏对象的Rigidbody与操作该对象的Transform最大的不同就是刚体有作用力,而且刚体可以接受外力和扭矩,但是Transform无法达到该效果。Transform可以移动和旋转游戏对象,这与使用物理的方式并不相同。

对—个刚体添加外力或扭矩实际上也会改变该对象Transform组件的移动和旋转,这也就是这两者只需要选其一的原因。使用物理方式操作对象的同时又改变它的Transform会导致碰撞及其他相关的计算出现问题。

刚体在受物理引擎作用之前必须要明确地将其添加给一个游戏对象,之后该对象就会受到重力和通过脚本添加的作用力的影响,但根据实际情况可能还需要为其添加碰撞体或关节等以便达到预期的行为效果。

2、父子化 (Parenting)

当对象处于物理控制之下时,其移动方式与其变换父级的移动方式半独立。如果移动任何父级,则会随它们一起拉动刚体 (Rigidbody) 的子级。但是,刚体 (Rigidbody) 仍会由于重力的作用而下落并对碰撞事件作出反应。

3、脚本处理

要控制刚体 (Rigidbody),主要使用脚本添加力或扭矩。可通过对对象的刚体 (Rigidbody) 调用 AddForce() 和 AddTorque() 来实现此目的。

记住:不应在使用物理时直接改变对象的变换 (Transform)。

4、动画

有些情况下,如需要创建布娃娃效果的时候,需要在动画和物理系统间切换对象的控制权。因此当刚体被标记为动力学(isKinematic)模式时,就不会受到如碰撞、作用力或其他物理效果的影响,这就意味着需要直接操作该对象的Transform组件属性来控制该对象了。动力学刚体(Kinematic Rigidbody)会影响其他的对象,但其自身并不受到物理系统的影响。例如,那些绑定到动力学(Kinematic)对象上的关节(Joint)会约束其他绑定到该对象上的刚体(Rigidbody),动力学刚体(Kinematic Rigidbody)在碰撞时会影晌其他的刚体。

【Unity】11.2 刚体(Rigidbody)的更多相关文章

  1. 关于Unity中的刚体和碰撞器的相关用法(二)

    在关于Unity中的刚体和碰撞器的相关用法(一)的基础上 有一个plane平面,一个ball球体,都挂了碰撞器,ball挂了刚体Rigidbody,写了一个脚本ball挂载在球体上,球体从空中落下装机 ...

  2. Unity3d刚体Rigidbody与碰撞检测Collider

    做了一个碰撞的小Demo,用一个球去撞击一堵墙,结果在球和墙都设置了刚体和碰撞体的情况下,球穿过了墙.移动球的位置,球有时能穿过墙,有时会被墙阻挡. 对于球穿过了墙,这个问题,在网上找了一下答案,基本 ...

  3. unity3d中 刚体(Rigidbody) 碰撞体(Collider) 触发器(Is Trigger)

      刚体(Rigidbody)的官方(摘自Unity3d的官方指导书<Unity4.x从入门到精通>)解释如下: Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可 ...

  4. 关于Unity中使用刚体制作简单跑酷案例

    一.步骤 1.创建一个Canvas 2.对Canvas进行初始化,记得把Game视图的分辨率调成和Canvas里面设置的一样的分辨率960X640 3.创建一个Image的UI节点作为Canvas的子 ...

  5. component及刚体rigidbody用法

    关于getcomponent函数,rigidbody(2d)的嵌套关系及用法 1.getcomponent函数 在unity中脚本可以看成是可定义的组件,我们经常要访问同一对象或不同对象中的脚本,可以 ...

  6. 关于Unity中的刚体和碰撞器的相关用法(一)

    1.创建一个3D工程 2.构造项目文件目录 3.保存场景为game_scene到文件夹scenes中 4.创建一个Plane平面类型的GameObject节点和一个Sphere球体类型的GameObj ...

  7. 为什么带网格(mesh)的模型添加了刚体Rigidbody和MeshCollider,还是会从地板穿过去?

    两个Gameobject 放置在空中, 一个是Cube,一个是茄子模型 Cube的Collider 是Box Collider , 茄汁的Collider 是mesh collider, 他们都添加了 ...

  8. unity, 不要试图用rigidbody.Sleep()停止rigidbody

    如果想让rigidbody pause,用rigidbody.Sleep()是完全错误的办法.因为有很多情况都可能使一个处在sleep的rigidbody唤醒,所以调用rigidbody.Sleep( ...

  9. 【Unity】11.6 恒定力 (Constant Force)

    分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 恒定力 (Constant Force) 是用于向刚体 (Rigidbody) 添加恒定力的快速实用工具,适用于类似火箭 ...

随机推荐

  1. java如何实现不固定个数传参

      CreateTime--2017年9月15日14:42:40 Author:Marydon java如何实现不固定个数传参(定义实参个数可变的方法) 参考链接:原文链接 传统方法:为这个方法定义一 ...

  2. CentOS7 通过代理上网

    1.修改/etc/profile,增加以下内容: http_proxy=http://[代理地址]:[代理地址的端口]/ https_proxy=http://[代理地址]:[代理地址的端口]/ ex ...

  3. quartz.net 的配置文件资料

    java版本的文档比较全 http://www.quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigPlugins.ht ...

  4. URI -URL-URN区别

    URI -URL-URN区别 URI (uniform resource identifier)   统一资源标识符,用来唯一的标识一个资源URL(uniform resource locator)  ...

  5. Android 代码画角标 offcutView

      效果如下:          代码: <com.andye.OffcutView android:layout_width="30dp" android:layout_h ...

  6. iOS 获取摄像头当前方向

    在做二维码扫描和直播获取视频流的过程中,可能会用到 AVCaptureDevice AVCaptureVideoPreviewLayer AVCaptureSession 这几个参数,其中 1.定义显 ...

  7. JavaScript Window Screen 用户屏幕的信息

    window.screen 对象包含有关用户屏幕的信息. Window Screen window.screen 对象在编写时可以不使用 window 这个前缀. 一些属性: screen.avail ...

  8. JavaScript 函数入门略解

    1.JavaScript 函数语法函数就是包裹在花括号中的代码块,前面使用了关键词 function: function functionname() { 这里是要执行的代码 } 当调用该函数时,会执 ...

  9. PCRE函数简介和使用示例【转】

    PCRE函数简介和使用示例 标签: 正则表达式listbuffercompilationnullperl 原文地址:http://blog.csdn.net/sulliy/article/detail ...

  10. 【Linux】进程优先级、进程nice值和%nice

    用top或者ps命令会输出PRI/PR.NI.%ni/%nice这三种指标值,这些到底是什么东西?先给出大概的解释如下: PRI :进程优先权,代表这个进程可被执行的优先级,其值越小,优先级就越高,越 ...