[Rigidbody 2D](https://docs.unity3d.com/Manual/class-Rigidbody2D.html):
允许你的游戏对象在物理引擎下运动
刚体允许你的游戏对象在物理引擎下运动。在现实途径下刚体可以接受力和力矩使物体移动。任何游戏对象必须包含刚体受重力作用下的附加力,通过脚本,或与其他物体通过NVIDIA PhysX物理引擎。 添加2D刚体后可基于脚本API施力
通常, Transform变换组件定义游戏对象(及其子游戏对象)在场景中的定位、旋转和缩放方式。更改变换组件将更新其他组件,这样可以更新渲染对象的位置或碰撞体所在位置之类的属性。**2D物理引擎能够移动碰撞体并使这些碰撞体彼此交互**,因此物理引擎需要一种方法**将碰撞体的此移动状态传回变换组件**。此移动以及与碰撞体的连接便是2D刚体组件的**用途**。
2D刚体组件会**覆盖变换组件**,并将其更新为2D刚体定义的**位置或旋转**。请注意,虽然仍然可以通过自行修改变换组件来覆盖2D刚体(因为Unity会公开所有组件上的所有属性) ,但是这样会导致各种问题,例如游戏对象相互穿过或嵌入等问题以及不可预测的移动。
添加到同一游戏对象或子游戏对象的任何2D碰撞体组件都隐式附加到该2D刚体。2D碰撞体附加到2D刚体时,两者一起移动。<span style="color:red">严禁使用</span>变换组件或任何碰撞体偏移来直接移动2D碰撞体;而应移动2D刚体。这样将提供最佳性能并确保正确的碰撞检测。连接到同-2D刚体的多个2D碰撞体不会相互碰撞。这意味着可以创建一组碰撞体来有效充当单一复合碰撞体,使所有碰撞体都与2D刚体同步移动和旋转。
设计场景时,可自由使用默认的2D刚体并开始附加碰撞体。这些碰撞体可让连接到不同2D刚体的所有其他碰撞体相互碰撞
**Body Type选项1(默认)**
![](https://img.kancloud.cn/eb/57/eb57867e986e874e3382d670a3383eb7_947x501.png)
**Body Type选项2**
![](https://img.kancloud.cn/21/52/21524577f904aa63337ea53c531c70cc_944x428.png)
**Body Type选项3**
![](https://img.kancloud.cn/80/ab/80ab99142ba60883e4d0434ded279d3b_946x303.png)
选项:
* **<span style="color:#F2711C">Body Type</span>:** 此设置中选择的选项会影响组件上可用的其他设置。附加到2D刚体的2D碰撞体将继承2D刚体的Body Type
* **Dynamic**
Dynamic类型的2D刚体设计为在模拟条件下移动。这种刚体类型具有可用的全套属性(例如有限质量和阻力) ,并受重力和作用力的影响。 Dynamic刚体类型将与每个其他刚体类型碰撞,是最具互动性的刚体类型。这是需要移动的对象的最常见刚体类型,因此是2D刚体的默认刚体类型。此外,由于具有动态性并与周围所有对象互动,因此也是性能成本最高的刚体类型。选择此刚体类型时,所有2D刚体属性均可用。
请勿使用变换组件来设置Dynamic类型的2D刚体的位置或旋转。模拟系统会根据Dynamic 2D刚体的速度对该刚体重新定位;可以通过脚本施加于刚体的力来直接更改此值,也可以通过碰撞和重力来间接更改此值。
* **kinematic**
Kinematic类型的2D刚体设计为在模拟条件下移动,但是仅在非常明确的用户控制下进行。虽然Dynamic 2D刚体受重力和作用力的影响,但Kinematic 2D刚体并不会受此影响。因此, Kinematic 2D刚体的速度很快,与Dynamic 2D刚体相比,对系统资源的需求更低。Kinematic 2D刚体按设计应通过`Bigidbody2D.MovePosition`或`Bigidbody2D.MoveRotation`进行显式重定位。应使用物理查询来检测碰撞,并通过脚本确定2D刚体应该移动的位置和方式。
Kinematic 2D刚体仍然通过速度移动,但是此速度不受作用力和重力的影响。Kinematic 2D刚体不会与其他Kinematic 2D刚体和 Static 2D刚体碰撞,只会与Dynamic 2D刚体碰撞。与Static 2D刚体(见下文)相似, Kinematic 2D刚体在碰撞期间的行为类似于不可移动的对象(就像具有无限质量) 。选择此刚体类型时,与质量相关的属性将不可用。
* **static**
2D刚体设计为在模拟条件下**完全不动**;如果任何对象与Static 2D刚体碰撞,此类型刚体的行为类似于不可移动的对象(就像具有无限质量) 。此刚体类型也是使用资源最少的刚体类型。Static刚体只能与Dynamic 2D刚体碰撞。不支持两个Static 2D刚体进行碰撞因为这种刚体不是为了移动而设计的。:
* **<span style="color:#F2711C">Material</span>:**
使用此属性可为连接到特定父2D刚体的所有2D碰撞体指定公共材质。注意: 2D碰撞体使用自己的Material属性(如果已设置) 。如果此处或在2D碰撞体中未指定材质,则默认选项为 None (Physics Material 2D),这种情况下使用可在Physics 2D Settings窗口中(菜单: Edit > Project Settings > Physics 2D)设置的默认材质。2D碰撞体使用以下优先级顺序来确定要使用的Material设置: 1.在2D碰撞体上指定的2D物理材质。2.在附加的2D刚体上指定的2D物理材质。在 hysics 2D Settings中指定的2D物理材质默认材质。提示:使用此设置确保附加到同-Static Body Type 2D刚体的所有 2D碰撞体都可使用同一材质。
* **<span style="color:#F2711C">simulated</span>:**
如果希望2D刚体以及所有附加的2D碰撞体和2D关节在运行时与物理模拟系统交互,请启用Simulated (选中复选框) 。如果禁用此功能(取消选中复选框) ,这些组件不会与模拟系统进行交互。默认情况下会选中此框。与启用或禁用单个2D碰撞体和2D关节组件相比,对此属性进行更改将在内存和处理方面具有更高的效率。
**注意**:取消选中2D刚体的Simulated选项时,附加的所有2D碰撞体都会有效“隐形”,即:无法被任何物理查询(例如Physics.Raycast)检测到。****
* **Mass**(质量):对象的质量(默认1) 值的范围是【0.0001~1000000】0表示无限大的质量,但是这里最小值为0.0001;由此可知,不想让某个物体有重力,就不要给他加刚体,给他一个碰撞器
* **Use Auto Mass:**
如果希望2D刚体从其2D碰撞体中自动检测游戏对象的质量,请选中此框,选中则**Mass**选项不可用(默认没有选中此框)。
此项可将2D刚体的质量自动设置为与2D碰撞体质量相同的值。与2D浮力效应(Buoyancy Effector 2D)结合时,此设置尤其有用,
* **Linear Drag(线性阻尼)**
一种会影响位置移动的阻力系数(默认0),0意味着没有阻力。
* **Angular Drag(摩擦角)**:一种会影响旋转移动的阻力系数,0意味着没有阻尼。注意,你不能把物体的角阻力设置为无穷大,即设置此值不能使物体停止旋转。 (默认0.05)
* **Gravity Scale**
定义游戏对象受重力影响的程度。(默认1)
* **Collision Detection(碰撞检测):** 用于防止快速移动的物体不经过碰撞而通过其他物体。
* **Discrete**(离散):具有2D刚体和 2D碰撞体的游戏对象在物理更新期间可以重叠或穿过彼此(如果移动得足够快) 。仅会在新位置生成碰撞触点。(默认此项就好,当某个刚体检测时穿透其他刚体再选择第二项Continuous)
* **Continuous**(连续):具有2D刚体和 2D碰撞体的游戏对象在更新期间不会穿过彼此。相反, Unity会计算2D碰撞体的第一个影响点,并将游戏对象移动到该点。请注意,此设置比Discrete耗费更多CPU时间(如果[快速]移动的对象碰撞没有问题,请使用Discrete而不使用它)。
* **Sleeping Mode:** 定义游戏对象如何在处于静止状态时“睡眠”以节省处理时间。
* **Never Sleep:** 禁用睡眠(应尽可能避免此设置,否则会影响系统资源)
* **Start Awake:** 游戏对象最初处于唤醒状态。
* **Start Asleep:** 游戏对象最初处于睡眠状态,但可以被碰撞唤醒。(默认)
* **Interpolate(插值):** 尝试一个选项只有当你看到你的刚体运动的跳跃。
* None(没有插值):不应用移动平滑。
* Interpolate(插值):基于前一帧的变换平滑变换 即根据游戏对象在先前帧中的位置来平滑移动。
* Extrapolate(推算):基于下一帧的估计变换平滑变换。即根据游戏对象在下一帧中的估计位置来平滑移动。
* **Constraints(约束):** 刚体运动的限制
* Freeze Position(冻结位置 ):选择性停止2D刚体沿世界X和Y轴的移动。
* Freeze Rotation(禁止转向 ):选择性停止2D刚体围绕Z轴的旋转。
kinematic选项特有:
* **Use Full Kinematic Contacts:** (默认未勾选)如果希望Kinematic 2D刚体与所有2D刚体类型碰撞,请启用此设置(选中复选框) 。这种情况下类似于Dynamic 2D刚体不同之处在于Kinematic 2D刚体在接触另一个2D刚体组件时不会被物理引擎移动,而会充当一个具有无限质量的不可移动对象 。
禁用(取消选中)此设置时, Kinematic 2D刚体仅与Dynamic 2D刚体碰撞,不会与其他Kinematic 2D刚体或Static 2D刚体碰撞(请注意触发碰撞体是此规则的例外情况) 。这意味着不会发生碰撞脚本回调(OnCollisionEnter, OnCollisionStay, OnCollisionExit)
使用物理查询(例如Physics.Raycast)来检测2D刚体应该移动的位置和方式时,以及需要多个Kinematic 2D刚体相互交互时,这可能会很不方便。启用Use Full Kinematic Contacts即可让Kinematic 2D刚体组件以此方式交互。
Use Full Kinematic Contacts允许显式控制Kinematic 2D刚体的位置和旋转,但是仍然允许完全碰撞回调。在需要显式控制所有2D刚体的设置中,使用Kinematic 2D刚体来代替Dynamic 2D刚体可保留对完全碰撞回调的支持。
## **细节:**
>[danger]* 刚体允许你的游戏对象在物理引擎控制下运动。这就为真实碰撞,大量的关节和其他非常酷的行为敞开了大门。通过添加外力操纵你的游戏对象来产生一个非常不一样的感觉和观感,绝对比使用Transform组件更直接。通常来说,一个对象只能存在rigibody和Transform的其中一个。
>* Transform和刚体最大的不同就是刚体通过力来驱动。刚体能够接收力和扭矩的作用,但是Transforn不能。Transform只能单纯地移动和旋转,没有任何物理作用。你自己尝试一下就会注意到直观的不一样。添加外力或者扭矩的刚体会准确地改变对象Transform的位置和面向。这就是为什么你只能在刚体和Transform中选一个。在使用物理作用会导致碰撞和其他计算的问题因此改变Transform。
>* 刚体必须在被物理引擎影响前明确添加在你的游戏对象中。你能通过菜单的Component->Physics->Rigibody添加一个刚体组件在你的对象上。现在你的对象已经准备好了。它会在重力的作用下自然下落同时还能通过脚本接收外力,但你需要加一个Collider组件或者关节来获得你希望它的行为。
**相关**
父级:
当一个对象在物理控制下,它会跟随着父级移动。
编辑脚本:
用来控制你的刚体,你主要使用脚本去添加外力或扭矩。通过使用AddForce()和AddTorque()。记得你不能直接改变物件的Transform当你在使用物理效果时。
碰撞体:
碰撞体是另外一些必须添加在刚体上的组件为了允许当两个刚体碰撞时不会穿进对方身体,这个物理引擎不能计算碰撞体除非两个对象都有碰撞体,缺少碰撞体会穿过其他对象。
>[danger]可通过两种方法将2D刚体标记为Static:
1、对于具有2D碰撞体组件的游戏对象,不附加任何2D刚体组件。所有此类2D碰撞体在内部均视为已附加到单个隐藏的Static 2D刚体组件。
2、对于需要附加2D刚体的游戏对象,将此2D刚体设置为Static.
方法1:是创建Static 2D碰撞体的快速方法。创建大量Static 2D碰撞体时,不为具有2D碰撞体的每个游戏对象添加2D刚体是比较容易实现的。
方法2:用于提高性能。如果需要在运行时移动或重新配置Static 2D碰撞体,该碰撞体具有自己的2D刚体时完成这些操作会更快。如果需要在运行时移动或重新配置一组2D碰撞体,则将这些碰撞体全部设为一个标记为Static的父2D刚体的子代会比单独移动每个游戏对象更快注意:如上所述, Static 2D刚体设计为不移动,因此不会考虑相交的两个Static 2D刚体对象之间的碰撞。然而,如果Static 2D刚体和 Kinematic 2D刚体的其中一个2D碰撞体设置为触发,两者就会交互作用。此外,还有一个功能可改变Kinematic刚体的交互对象(请参阅下文的Use Full Kkinematic Contacts)
- C#
- 基础 System
- 命名规范
- 变量
- 数据类型
- 值类型
- 简单类型
- 整数类型
- 字符类型
- 浮点类型
- 布尔类型
- 枚举类型
- 结构体类型
- 引用类型
- 类类型
- 对象(Object)类型
- 字符串(String)类型
- 方法属性
- 动态(Dynamic)类型
- 数组类型
- 接口Interface
- 委托类型delegate
- 装箱和拆箱
- 指针类型
- 值类型与引用类型的区别
- Var类型
- 类型转换
- 隐式转换
- 显式转换
- 常量
- 常用函数
- 流程控制
- 循环
- 跳转语句
- 数组
- 数组查找
- 添加组元素
- 复制与克隆数组
- 删除数组元素
- 数组排序与反转
- 数组排序
- 冒泡排序
- 直接插入排序
- 选择排序法
- 数组对象
- 哈希表
- 其他
- 递归
- 属性与方法及方法重载
- 结构与类
- 类
- 构造函数与析构函数
- 继承
- 多态
- 泛型
- demo
- 汉字字符(串)比较
- 创建指定大小文件与读取大文件
- 小截屏软件功能
- 子窗体返回主窗体
- 判断是否为数字
- 获得字符串实际长度(包括中文字符)
- unity
- script脚本
- 脚本的生命周期
- 调试
- Unity Manual5.4
- Unity手册
- Working In Unity
- Unity 2D
- Graphics(图形)
- Physics(物理系统)
- Scripting(脚本)
- Multiplayer and Networking(多玩家和联网)
- Audio(音频)
- Animation(动画)
- UI
- Navigation and Pathfinding(导航和寻路)
- Unity Services(Unity服务)
- Virtual Reality(虚拟现实VR)
- Open-source repositories(开源代码库)
- Platform-specific(特定于平台的信息)
- Legacy Topics(旧版主题)
- Expert Guides(专家指南)
- 重要的类
- Object
- GameObject(重要)
- Component
- Transform(重要)
- Rigidbody
- ParticleSystem
- Behaviour
- Camera
- Animator
- AudioSource
- Animation
- AudioListener
- Light
- MonoBehaviour事件行为(重要)
- Terrain
- Collider
- Renderer
- Texture
- Mesh
- material
- Time
- Prefab预制件
- 功能demo
- 层级未知查找子物体
- 查找hp最小的敌人
- 查找最近的敌人
- 小项目之英雄无敌
- 界面操作
- Scene窗口
- Game窗口
- project窗口
- Hierarchy窗口
- 动画
- Animation重要API
- 2D
- Sprite(creator) Sprite Renderer
- Sprite Editor
- Sprite Packer(遗留功能)
- 排序组组件
- 切片精灵
- 精灵遮罩
- 精灵图集
- Tilemap
- 2D物理系统
- 全局设置(Project setting)
- 2D刚体(Rigidbody 2D)
- 碰撞(事件)消息
- 2D碰撞体(Collider 2D)
- 2D圆形碰撞体(Circle Collider 2D)
- 2D盒型碰撞体(BoxCollider 2D)
- 2D多边形碰撞体( Polygon Collider 2D)
- 2D边界碰撞体(EdgeCollider 2D)
- 2D胶囊碰撞体(CapsuleCollider 2D)
- 2D复合碰撞体(Composite Collider 2D)
- 2D物理材质(摩擦和弹性)(Physics Material 2D)
- 2D关节
- 2D距离关节(Distance Joint 2D)
- 2D固定关节(Fixed Joint 2D)
- 2D摩擦关节(Friction Joint 2D)
- 2D铰链关节(Hinge Joint 2D)
- 2D相对关节(Relative Joint 2D)
- 2D滑动关节(Slider Joint 2D)
- 2D弹簧关节(Spring Joint 2D)
- 2D目标关节(Target Joint 2D)
- 2D车轮关节(Wheel Joint 2D)
- 2D恒定力(Constant Force 2D)
- 2D 效应
- 2D区域效应(AreaEffector 2D)
- 2D浮力效应(BuoyancyEffector 2D)
- 2D点效应(PointEffector 2D)
- 2D平台效应(PlatformEffector 2D)
- 2D表面效应(SurfaceEffector 2D)
- 精灵动画
- 2D动画事件
- 重要类
- rigidbody2d
- 小窍门
- Unity中如何查找脚本挂载在哪个物体上