[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)和顶 ...
随机推荐
- Sql Server异常捕获 try catch
declare @num int begin try end try begin catch select ERROR_LINE() as 错误行数, ERROR_MESSAGE() as 错误消息 ...
- 视频 -> 帧 浅析
原创:转载请注明出处 关于帧率 首先以下几个概念必须弄清楚 1.一个帧就是一个画面 2.视频有无数个帧组成 3.表达时间的量 CMTime 的定义: typedef struct { CMTimeV ...
- 4D(DRG、DLG、DOM、DEM)数据 概念
抱歉原文链接未知 Technorati 标签: DRG,DLG,DOM,DEM 以下有不同的说法,但是意思都很相近. 一. DOM (数字正射影像图):利用数字高程模型对扫描处理的数字化的航空相片.遥 ...
- 利用Hierarchy Viewer优化布局
好久没更新博客了,趁着清明来写点什么. 今天来讲下如何使用android中提供的工具优化我们的布局.首先我们写一个最简单的框架布局. <?xml version="1.0" ...
- android xml文件中出现如下提醒:This tag and its children can be replaced by one <TextView/> and a compound drawable
第一个感叹号 是跟你说 让你把Imageview 和textview 结合起来 只用 textview textview有个属性叫 android:drawable...(top/bottom/.. ...
- PAT (Advanced Level) 1108. Finding Average (20)
简单模拟. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #i ...
- Html基础详解之(jquery)之二
on(events,[selector],[data],fn) 在选择元素上绑定一个或多个事件的事件处理函数.on()方法绑定时间处理程序到当前选定的jQuery对象中的元素.在jQuery 1.7中 ...
- JavaBean--实例:注册验证
通过JSP+JavaBean完成一个注册用户的验证功能: index.jsp: 注册信息填写页,同时对错误数据进行错误提示 check.jsp:将输入表单数据自动赋值给JavaBean,同时验证,失败 ...
- zf-关于注册码全部错误的解决方法
之所以错误,是因为这里的用户名称是石首市政务服务中心. 在数据库里把这个字段改成 上海卓繁 就可以了 一般都是在 SYS_INFO 这张表里面改
- 2016大连网络赛 Sparse Graph
Sparse Graph Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) P ...