1、Rigidbody 刚体组件
- Rigidbody.position 位置
- Rigidbody.rotation 旋转
- Rigidbody.velocity 模拟物体以某个速度向某个方向移动
private Rigidbody rig;
void Start()
{
rig = GetComponent<Rigidbody>();
//为位置和旋转赋值
//rig.position = Vector3.zero;
//rig.rotation = Quaternion.identity;
}
void Update()
{
//控制物体的移动
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
rig.velocity = new Vector3(h, 0, v) * 2.5f;
}
- Rigidbody.AddExplosionForce 爆炸力
//实现炸弹爆炸效果
private Rigidbody rig;
private Collider[] cols;
//是否已经爆炸
private bool isTrue = false;
void Start()
{
rig = GetComponent<Rigidbody>();
}
private void OnCollisionEnter(Collision collision)
{
if (collision.transform.name == "Targer")
{
if (isTrue == false)
{
float explosionForce = 800;
Vector3 explosionPosition = transform.position;
float explosionRadius = 6.5f;
//返回以参数1为原点和参数2为半径的球体内“满足一定条件”的碰撞体集合
cols = Physics.OverlapSphere(explosionPosition, explosionRadius);
foreach (var item in cols)
{
//print(item.name);
if (item.GetComponent<Rigidbody>())
{
Rigidbody rigs = item.GetComponent<Rigidbody>();
//为指定范围内带有刚体组件的碰撞体添加爆炸力方法
rigs.AddExplosionForce(explosionForce, explosionPosition, explosionRadius);
}
}
Destroy(gameObject);
isTrue = true;
}
}
}
- Rigidbody.AddForce 恒定力 / Rigidbody.AddRelativeForce 相对恒定力
private Rigidbody rig;
void Start()
{
rig = GetComponent<Rigidbody>();
//添加恒定力
rig.AddForce(Vector3.up * 3);
//添加相对恒定力
rig.AddRelativeForce(Vector3.up * 3);
}
- Rigidbody.AddForce 扭矩力 / Rigidbody.AddRelativeForce 相对扭矩力
private Rigidbody rig;
void Start()
{
rig = GetComponent<Rigidbody>();
}
void Update()
{
//添加扭矩力
rig.AddTorque(Vector3.up * 3);
//添加相对扭矩力
rig.AddRelativeTorque(Vector3.up * 3);
}
- Rigidbody.AddForceAtPosition 在指定位置点上施加力
private Rigidbody rig;
void Start()
{
rig = GetComponent<Rigidbody>();
}
void Update()
{
rig.AddForceAtPosition(Vector3.up * 3, transform.position);
}
- Rigidbody.Sleep 刚体休眠 / Rigidbody.WakeUp 刚体唤醒
private Rigidbody rig;
// Start is called before the first frame update
void Start()
{
rig = GetComponent<Rigidbody>();
//强制当前刚体休眠
rig.Sleep();
}
// Update is called once per frame
void Update()
{
if (rig.IsSleeping() && Input.GetMouseButtonDown(0))
{
//强制唤醒当前刚体
rig.WakeUp();
}
}
2、Constant Force 恒定力组件
属性 | 功能 |
---|---|
力 (Force) | 在世界坐标空间中应用的力的向量。 |
相对力 (Relative Force) | 在对象局部坐标空间中应用的力的向量。 |
扭矩 (Torque) | 在世界坐标空间中应用的扭矩的向量。对象会围绕此向量开始旋转。此向量越长,旋转便越快。 |
相对扭矩 (Relative Torque) | 在局部坐标空间中应用的扭矩的向量。对象会围绕此向量开始旋转。此向量越长,旋转便越快。 |
3、碰撞和触发
3.1、碰撞器
-
碰撞的条件:
1)两者都要具有碰撞组件也就是Collider; 2)其中之一带有刚体组件,两者都有也可。
-
碰撞的三阶段:
1) 当进入碰撞时执行 void OnCollisionEnter(Collison collision); 2) 当碰撞体与刚体触发时每帧执行void OnCollisionStay(Collision collision); 3) 当停止碰撞时执行void OnCollisionExit(Collision collision)。
3.1、触发器
-
触发的条件:
1)两者具有碰撞组件Collider; 2)其中之一带有刚体组件,两者都有也可; 3)其中之一勾选Is Trigger,两者都有也可。
-
触发的三阶段:
1)当Collider碰撞体进入触发器时执行 void OnTriggerEnter(Collider collider ); 2) 当碰撞体与触发器接触时每帧执行 void OnTriggerStay(Collider collider ); 3)当停止触发时执行void OnTriggerExit(Collider collider )。
附加:作用力方式详解
ForceMode为枚举类型,用来控制力的作用方式,有4个枚举成员,在以下举例中均设刚体质量为m=2.0f,力向量为f=(10.0f,0.0f,0.0f)。 |
---|
(1)ForceMode.Force:默认方式,使用刚体的质量计算,以每帧间隔时间为单位计算动量。设FixedUpdate()的执行频率采用系统默认值(即0.02s),则由动量定理:f•t=m•v, |
可得:100.02=2v1,从而可得v1=0.1,即每帧刚体在X轴上值增加0.1米,从而可计算得刚体的每秒移动速度为v2=(1/0.02)*v1=5m/s。 |
(2)ForceMode.Acceleration:在此种作用方式下会忽略刚体的实际质量而采用默认值1.0f,时间间隔以系统帧频间隔计算(默认值为0.02s),即f•t=1.0•v |
即可得v1= f•t=10*0.02=0.2,即刚体每帧增加0.2米,从而可得刚体的每秒移动速度为v2=(1/0.02)*v1=10m/s。 |
(3)ForceMode.Impulse:此种方式采用瞬间力作用方式,即把t的值默认为1,不再采用系统的帧频间隔,即f•1.0=m•v |
即可得v1=f/m=10.0/2.0=5.0,即刚体每帧增加5.0米,从而可得刚体每秒的速度为v2=(1/0.02)*5.0=250m/s。 |
(4)ForceMode.VelocityChange:此种作用方式下将忽略刚体的实际质量,采用默认质量1.0,同时也忽略系统的实际帧频间隔,采用默认间隔1.0,即f•1.0=1.0•v |
即可得v1=f=10.0,即刚体每帧沿X轴移动距离为10米,从而可得刚体每秒的速度为v2=(1/0.02)*v1=500m/s。 |