[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)和顶 ...
随机推荐
- document.querySelectorAll遍历(forEach小解)
document.querySelectorAll兼容性良好,在之前的项目中就其遍历方式出了错误,先做个小结: 1.for循环 传统遍历方法 for(var i= 0; i< document. ...
- VS2013使用技巧汇总
1. Peek View 在不新建TAB的情况下快速查看.编辑一个函数的代码. 以前要看一个函数的实现,需要在使用的地方点击F12跳转到该函数,实际上这是很浪费时间的.VS2013Peek View便 ...
- Debian 安装Nvidia显卡驱动
1.到nvidia官方网站下载自己显卡对应型号得驱动,如果不知道显卡型号,可以使用如下命令来查看 lspci | grep VGA 2.安装显卡驱动所必需得工具 apt-get install bui ...
- Android简单逐帧动画Frame的实现(三)
android之动画(三)通过AnimationDrawable控制逐帧动画 android与逐帧动画: 效果图: 当我们点击按钮时,该图片会不停的旋转,当再次点击按钮时,会停止在当前的状态. ...
- 为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接 口.实现这两者的目的是为了向更上一层提供硬件访问接口,即 ...
- 博弈论最简单例子TacTicToe
博弈论是人工智能中的一个分支.顾名思义就是下棋的算法.当然引申出来的应用可能不止用来下棋,也可以用来做游戏或者模拟战争策略等. 博弈的基本算法也是模拟人的思维,比如当自己下子时遍历所有可能寻求最有利步 ...
- AJAX(XMLHttpRequest)进行跨域请求方法详解(一)
注意:以下代码请在Firefox 3.5.Chrome 3.0.Safari 4之后的版本中进行测试.IE8的实现方法与其他浏览不同. 跨域请求,顾名思义,就是一个站点中的资源去访问另外一个不同域名站 ...
- Linux的环境变量
一.Linux的变量种类 按变量的生存周期来划分,Linux变量可分为两类: 1.永久的:需要修改配置文件,变量永久生效. 2.临时的:使用export命令声明即可,变量在关闭shell时失效. 二 ...
- Lorenzo Von Matterhorn
Lorenzo Von Matterhorn Barney lives in NYC. NYC has infinite number of intersections numbered with p ...
- 智力大冲浪(riddle)
智力大冲浪(riddle) 题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的?!接 ...