Rigidbody
刚体
通过物理模拟控制一个物体的位置。
Rigidbody组件控制物体的位置 - 它使物体在重力影响下下落,并可计算物体将怎样响应碰撞。
当操作刚体参数的时候,你应该在FixedUpdate函数中使用它,物理模拟以离散的时间步执行。FixedUpdate函数在每一步之前被立即调用。
使用刚体需要注意的事:
如果你的模拟看起来像慢动作并且不真实: 这是缩放的问题。如果你的游戏世界非常大,所以的东西将显示移动非常慢,确保你所有的模型为真实世界大小。例如,一个汽车应该有4米长,一个角色约2米高。物体以相同的加速度下落,不论大或小,重或轻。如果你的游戏世界有较大的缩放,物体仍以相同的加速度下落,但是因为所有的物体都比较大,物体的下落显得就比较慢。
Variables | 变量 |
---|---|
velocity | 刚体的速度向量 |
angularVelocity | 刚体的角速度向量 |
drag | 物体的阻力 |
angularDrag | 物体的角阻力 |
mass | 刚体的质量 |
useGravity | 控制重力是否影响整个刚体 |
isKinematic | 控制物理学是否够影响这个刚体 |
freezeRotation | 控制物理是否改变物体的旋转 |
collisionDetectionMode | 刚体的碰撞检测模式 |
centerOfMass | 相对于变换原点的质量中心 |
worldCenterOfMass | 在世界坐标空间的刚体的质量中心。(只读) |
inertiaTensorRotation | 惯性张量的旋转 |
inertiaTensor | 相对于重心的质量的惯性张量对角线 |
detectCollisions | 碰撞检测应否启用?(默认总是启用的) |
useConeFriction | 用于该刚体的锥形摩擦力 |
position | 该刚体的位置 |
rotation | 该刚体的旋转 |
interpolation | 插值允许你以固定的帧率平滑物理运行效果 |
solverIterationCount | 允许你覆盖每个刚体的求解迭代次数 |
sleepVelocity | 线性速度,低于该值的物体将开始休眠。(默认0.14)范围{0, infinity} |
sleepAngularVelocity | 角速度,低于该值的物体将开始休眠。(默认0.14)范围{0, infinity} |
maxAngularVelocity | 刚体的最大角速度,(默认7)范围{0, infinity} |
Functions | 函数 |
---|---|
SetDensity | 基于附加的碰撞器假设一个固定的密度设置质量 |
AddForce | 添加一个力到刚体。作为结果刚体将开始移动 |
AddRelativeForce | 添加一个力到刚体。相对于它的系统坐标 |
AddTorque | 添加一个力矩到刚体 |
AddRelativeTorque | 添加一个力矩到刚体,相对于刚体自身的坐标系统 |
AddForceAtPosition | 在position位置应用force力。作为结果这个将在这个物体上应用一个力矩和力 |
AddExplosionForce | 应用一个力到刚体来模拟爆炸效果。爆炸力将随着到刚体的距离线形衰减 |
ClosestPointOnBounds | 到附加的碰撞器边界框上的最近点 |
GetRelativePointVelocity | 相对于刚体在relativePoint点的速度 |
GetPointVelocity | 刚体在世界坐标空间中worldPoint点的速度 |
MovePosition | 移动刚体到position |
MoveRotation | 旋转刚体到rot |
Sleep | 强制一个刚体休眠至少一帧 |
IsSleeping | 刚体在休眠么? |
WakeUp | 强制唤醒一个刚体 |
SweepTest | 如果一个刚体碰到任何东西触发测试,如果它是穿过场景 |
SweepTestAll | 像Rigidbody.SweepTest,但是返回所有碰撞点 |
Messages Sent | 发送消息 |
---|---|
OnCollisionEnter | 当这个collider/rigidbody已经开始接触另一个rigidbody/collider时,OnCollisionEnter被调用 |
OnCollisionExit | 当这个collider/rigidbody停止接触另一个rigidbody/collider时,OnCollisionExit被调用 |
OnCollisionStay | 对于每个collider/rigidbody接触另一个rigidbody/collider时,OnCollisionStay每帧被调用一次 |
Rigidbody.position
这个类似设置transform.position,然而position只在物理步结束应用到变换。 如果你想连续移动一个刚体或运动学刚体,使用MovePosition和MoveRotation代替。
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void Start() {
rigidbody.position = Vector3.zero;
}
}
Rigidbody.MovePosition
移动刚体到position。
对于运动学刚体,它基于刚体的运动应用摩擦力。这个让你模拟刚体位于移动平台之上的情况。如果你想其他的刚体与运动学刚体交互,你需要在FixedUpdate函数中移动它。
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
private Vector3 speed = new Vector3(3, 0, 0);
void FixedUpdate() {
rigidbody.MovePosition(rigidbody.position + speed * Time.deltaTime);
}
}
Rigidbody.rotation
该刚体的旋转。
这个类似设置transform.rotation,然而rotation只在物理步结束应用到变换。 如果你想连续移动一个刚体或运动学刚体,使用MovePosition和MoveRotation代替。
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void Start() {
rigidbody.rotation = Quaternion.identity;
}
}
Rigidbody.MoveRotation
旋转刚体到rot
对于运动学刚体,它基于刚体的运动应用摩擦力。这个让你模拟刚体位于移动/旋转平台之上的情况。如果你想其他的刚体与运动学刚体交互,你需要在FixedUpdate函数中移动它。
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public Vector3 eulerAngleVelocity = new Vector3(0, 100, 0);
void FixedUpdate() {
Quaternion deltaRotation = Quaternion.Euler(eulerAngleVelocity * Time.deltaTime);
rigidbody.MoveRotation(rigidbody.rotation * deltaRotation);
}
}
Rigidbody.AddForce
添加一个力到刚体。作为结果刚体将开始移动。
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void FixedUpdate() {
rigidbody.AddForce(Vector3.up * 10);
}
}
添加一个力到刚体。作为结果刚体将开始移动。
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void FixedUpdate() {
rigidbody.AddForce(0, 10, 0);
}
}
如果你想在多帧中应用力,你应该在FixedUpdate中而不是Update使用使用它。