分类: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. 转:Delta3D Editor编译成功

    下载:     官网 www.delta3d.org 有些地方访问不了(试试这个代理:133.1.74.163 3128),我在公司就访问不了,但是住的地方就可以.但是sourceforge是可以访问 ...

  2. Java用freemarker导出word

    概述 最近一个项目要导出word文档,折腾老半天,发现还是用freemarker的模板来搞比较方便省事,现总结一下关键步骤,供大家参考,这里是一个简单的试卷生成例子. 详细 代码下载:http://w ...

  3. 通过Parcelable协议传递数据出现系列错误

    07-14 00:42:37.414: E/AndroidRuntime(17687): FATAL EXCEPTION: main 07-14 00:42:37.414: E/AndroidRunt ...

  4. 用@resource注解方式完成属性装配

    注入依赖对象可以采用手工装配或自动装配,在实际应用中建议使用手工装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果. 1 需要修改xml文件的以下信息.    加入下列红色部分的4行 & ...

  5. spring 自动装配 default-autowire=&quot;byName/byType&quot;

    <PRE class=html name="code">spring 自动装配 default-autowire="byName/byType"   ...

  6. sql server @@ROWCOUNT 会被 if 给 清 0

    官方说 @@ROWCOUNT  会被以下几种语句清0 原文如下: Statements such as USE, SET <option>, DEALLOCATE CURSOR, CLOS ...

  7. java hibernate Criteria 删除数据 delete data 2种方法

    public String deleteByUserAccount(String account) { 方式一: Session session = this.getCurrentSession(); ...

  8. 树莓派进阶之路 (030) -Picustom.h(原创)

    写代码的时候敢接每次查wiringPi库函数挺麻烦的,自己wiringPi库封装了一下: #ifndef __PICUSTOM_H__ #define __PICUSTOM_H__ /******** ...

  9. SqlServer 2005 将已存在大量数据的表更改为分区表

    一.分区表简介: 使用分区表的主要目的,是为了改善大型表以及具有各种访问模式的表的可伸缩性和可管理性.分区一方面可以将数据分为更小.更易管理的部分,为提高性能起到一定的作用:另一方面,对于如果具有多个 ...

  10. 【ASP.NET】ASP.NET中权限验证使用OnAuthorization实现

    在项目开发中,通常我们都会涉及到用户登录才能访问的网页,比如购物网站,我们浏览商品,添加购物车(以前开发的时候在这里就需要登录用户,但是现在有了缓存的实现,这里可以将商品加入缓存,等到结账的时候再登录 ...