[Unity Physics]Physics - Rigidbody、Collider
什么是Collider
碰撞器组件在Unity引擎中触发物理碰撞的最基本的条件。
可以这样说,假如一个游戏中没有物理碰撞系统是不可能的。
什么是Rigidbody
通过物理模拟的控制对象的位置。
Rigidbody组件添加到一个对象将其运动的控制下统一的物理引擎。即使没有添加任何代码,Rigidbody对象将由重力向下拉,将反应与传入的对象如果正确的对撞机碰撞组件也存在。
Rigidbody也有脚本API,允许您力量应用于对象和物理现实的方式控制它。例如,一辆汽车的行为可以指定在力量方面应用的轮子。鉴于这种信息,物理引擎可以处理大多数汽车运动的其他方面,所以它将加速实际和正确应对冲突。
通常会在脚本的FixedUpdate函数中改变Rigidbody设置。原因是防止在更新时时间不配合帧更新的步骤。
FixedUpdate称为每个物理之前立即更新,所以任何更改将会有直接处理。
开始使用Rigidbody时常见的问题是,游戏中模拟的物理系统似乎在“慢运动”运行。这实际上是由于规模用于您的模型。默认的重力设置假设一个世界单元对应于一米的距离。与非现实的游戏,是没有多大的区别,如果您的模型都是100单位长但使用物理时,他们将被视为非常大的对象。如果大规模用于对象应该是小,他们似乎会非常缓慢——物理引擎认为他们非常大对象摔倒非常大的距离。考虑到这一点,一定要保持你的对象在现实生活中或多或少的规模(所以汽车应该大约4单位= 4米)。
Collider的用法
碰撞器常用的方法
- OnCollisionEnter
//当另一个游戏对象的刚体或者碰撞器,碰撞到本游戏对象的碰撞器组件时,会调用这个方法...
Collider.OnCollisionEnter(Collision)
例如:
void OnCollisionEnter(Collision collision) {
//遍历碰撞到该游戏对象的碰撞器组件的所有对象...
foreach (ContactPoint contact in collision.contacts) {
Debug.DrawRay(contact.point, contact.normal, Color.white);
}
}
- OnCollisionExit
//当另一个游戏对象已经离开当前游戏对象的刚体或者是碰撞器组建时会调用这个方法...
Collider.OnCollisionExit(Collision)
- OnCollisionStay
//当另一个游戏对象的碰撞器一直停留在当前游戏对象上的刚体或者碰撞器时,会调用这个方法...
Collider.OnCollisionStay(Collision)
注意:当把碰撞器Collisider组件的触发器属性设置为true时,在脚本中会调用如下三个方法
- OnTriggerEnter
//需要注意的是,触发器回调方法的参数是Collider类型
Collider.OnTriggerEnter(Collider)
- OnTriggerExit
Collider.OnTriggerExit(Collider)
- OnTriggerStay
Collider.OnTriggerEnter(Collider)
Rigidbody的用法
| 成员变量名称 | 成员变量的作用 |
| angularDrag | 游戏对象对应的角阻力 |
| angularVelocity | 游戏对象的角速度向量 |
| centerOfMass | 相对于游戏对象自身的坐标系统的重心位置 |
| collisionDetectionMode | 游戏对象刚体组件的碰撞检测模式 |
| constraints | 用来约束游戏对象在某些条件上是可以自由跟随Unity物理系统移动的 |
| detectCollisions | 是否启用游戏对象的碰撞检测功能。默认都是开启的。 |
| drag | 游戏对象在运动时的阻力 |
| freezeRotation | 用来约束游戏对象是否会被Unity物理系统影响自身的旋转 |
| isKinematic | 用来控制游戏对象的刚体是否会收到Unity物理系统的影响 |
| mass | 用来表示游戏对象刚体的质量 |
| maxAngularVelocity | 用来表示游戏对象的最大角速度 |
| position | 游戏对象刚体组件所处在的位置坐标 |
| rotation | 游戏对象刚体组件已经产生的坐标旋转 |
| sleepAngularVelocity | 用来表示当游戏对象的角速度小于临界值时就停止。默认值0.14 |
| sleepVelocity | 用来表示当游戏对象的运行速度小于临界值时就停止。默认值0.14 |
| useGravity | 用来表示当前游戏对象是否收到重力系统的影响 |
| velocity | 用来表示当前游戏对象的刚体的运行速度 |
| worldCenterOfMass | 相对于世界的坐标系统的重心位置 |
在Unity开发工具中使用到的组件接口面板

Rigidbody常用的方法
- AddForce
//为rigidbody添加一个方向力。因此,rigidbody将开始移动。
void AddForce(Vector3 force, ForceMode mode = ForceMode.Force);
例如:
//在FixedUpdate函数中,为rigidbody添加10个单位向上的方向力
void FixedUpdate() {
rigidbody.AddForce(Vector3.up * 10);
}
- AddForceAtPosition
//在一个位置为Rigidbody添加一个力.
void AddForceAtPosition(Vector3 force, Vector3 position, ForceMode mode = ForceMode.Force);
例如:
//ApplyForce函数是个自定义函数,用来对一个刚体对象施加一个方向力
void ApplyForce(Rigidbody body) {
//计算当前游戏对象和刚体参数游戏对象所处位置的方向
Vector3 direction = body.transform.position - transform.position;
//在当前游戏对象所处的位置,为body参数施加1个单位的方向力
body.AddForceAtPosition(direction.normalized, transform.position);
}
- AddTorque
//为刚体组件添加一个力矩,使该游戏对象产生旋转的速度...
void AddTorque(Vector3 torque, ForceMode mode = ForceMode.Force);
例如:
//为游戏对象添加一个10个单位的旋转力...
void FixedUpdate() {
rigidbody.AddTorque(Vector3.up * 10);
}
形成的效果如下

- AddRelativeTorque
//添加一个扭矩rigidbody相对rigidbody自身的坐标系统
void AddRelativeTorque(Vector3 torque, ForceMode mode = ForceMode.Force);
例如:
//相对于游戏对象自身的坐标系统,添加10个单位沿着y轴正向旋转的力
void FixedUpdate()
{
rigidbody.AddRelativeTorque(Vector3.up * 10);
}

那么在Unity物理引擎系统里两个常用的组件,Collider和Rigidbody就到这里。
希望大家多多支持。
[Unity Physics]Physics - Rigidbody、Collider的更多相关文章
- 介绍用C#和VS2015开发基于Unity架构的2D、3D游戏的技术
[Unity]13.3 Realtime GI示例 摘要: 分类:Unity.C#.VS2015 创建日期:2016-04-19 一.简介 使用简单示例而不是使用实际示例的好处是能让你快速理解光照贴图 ...
- 关于Rigidbody,Collider和CharacterController三者之间的关系和用法的总结
Rigidbody:多用在“物体”上,因为“物体”都是“死”的,他们的运动一般都是靠物理系统.所以对于Rigidbody的移动,不要用Translate(),要用各种“力”, 比如:Rigidbody ...
- Rigidbody和Collider
Rigidbody: 常用属性: Mass:默认为1,单位并不是g或kg,而是相对的质量计量单位,只决定物体的惯性: Drag:空气阻力: Angular Drag:角阻力,旋转时受的阻力: Use ...
- [Unity Physics] Physics - Raycast
Class Variables类变量 gravity The gravity applied to all rigid bodies in the scene.场景中应用到所有刚性物体的重力. min ...
- 【Unity入门】场景、游戏物体和组件的概念
版权声明:本文为博主原创文章,转载请注明出处. 游戏和电影一样,是通过每一个镜头的串联来实现的,而这样的镜头我们称之为“场景”.一个游戏一般包含一个到多个场景,这些场景里面实现了不同的功能,把它们组合 ...
- unity中的update、Lateupdate和FixedUpdate。
MonoBehaviour.Update 更新 当MonoBehaviour启用时,其Update在每一帧被调用. MonoBehaviour.FixedUpdate 固定更新 当MonoBehavi ...
- Unity属性的封装、继承、方法隐藏
(一)Unity属性封装.继承.方法隐藏的学习和总结 一.属性的封装 1.属性封装的定义:通过对属性的读和写来保护类中的域. 2.格式例子: private string departname; // ...
- 【Unity Shader】三、漫反射Diffuse Shader例子
学习目标: 漫反射Diffuse Shader,逐顶点计算和逐像素计算. 半兰伯特(HalfLambert)光照模型. 结合材质自身的色彩(Material Color)及环境光(Ambient). ...
- 【Unity Shader】二、顶点函数(vertex)和片元函数(fragment)传递数据,及各阶段可使用的语义(semantic)
学习资料:http://www.sikiedu.com/course/37/task/433/show 本节学习目标: 学习Shader中结构体struct的使用. 学习在片元函数(vertex)和顶 ...
随机推荐
- TextureView+SurfaceTexture+OpenGL ES来播放视频(二)
引自:http://www.jianshu.com/p/b2d949ab1a1a 在使用OpenGL ES 绘制前,我先概括下接下来要做的工作:我先借用一个博主kiffa举的的一个栗子,我觉得说的恰到 ...
- AI 人工智能 探索 (三)
三类子弹的设计 using UnityEngine; using System.Collections; public class AI : AssembleModel { private Hasht ...
- GUI矩形、椭圆、线、框架
所有的Swing组件必须由时间调度线程(event dispatch thread)进行配置,线程将鼠标点击和键盘敲击控制转移到用户接口组件.下面的代码片段是事件调度线程中的执行代码: EventQu ...
- CDN(转载)
CDN是什么? 谈到CDN的作用,可以用8年买火车票的经历来形象比喻: 8年前,还没有火车票代售点一说,12306.cn更是无从说起.那时候火车票还只能在火车站的售票大厅购买,而我所住的小县城并不通火 ...
- ubuntu 12.04 安装snort acidbase相关注意事项
一.安装Snort 1.安装libpcap 1 apt-get install libpcap-dev 2.安装snort 1 2 apt-get install snort apt-get inst ...
- 业务零影响!如何在Online环境中巧用MySQL传统复制技术【转】
业务零影响!如何在Online环境中巧用MySQL传统复制技术 这篇文章我并不会介绍如何部署一个MySQL复制环境或keepalived+双主环境,因为此类安装搭建的文章已经很多,大家也很熟悉.在这篇 ...
- 剑指offer 连续子序列和
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class Solution { public: int FindGreatestSumOfSu ...
- zf-关于平台的用户名密码的设置
比如说安徽桐城的用户名密码在哪张表里设置 桐城市人民统一电子政务平台是http://localhost:8088/tc/ptzwfw.action 这个链接 在zwfw_tc 数据库的 PT_LOGI ...
- 2016沈阳网络赛 odd-even number
odd-even number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- HDU 1896 Stones(优先队列)
还是优先队列 #include<iostream> #include<cstdio> #include<cstring> #include<queue> ...