Rigidbody类的功能是用来模拟GameObject对象在现实世界中的物理特性,包括重力、阻力、质量、速度等。对RIgidbody对象属性的赋值代码通常放在脚本的OnFixedUpdate()方法中。本博客主要介绍Rigidbody类的一些实例属性和实例方法,最后对Rigidbody类中功能相近、关联性较强的API之间的关系进行了注解。
一、Rigidbody类实例属性
在Rigidbody类中,涉及的实例属性有collisionDectionMode、drag、inertiaTensor、mass和velocity,下面介绍这些属性。
1、collisionDectionMode属性:碰撞检测模式
(1)基本语法
public CollisionDetectionMode collisionDetectionMode {
get ; set; }
(2)功能说明
此属性用于设置刚体的碰撞检测。刚体的碰撞检测模式有3中,即枚举类型collisionDetectionMode的三个值。
Discrete:静态离散检测模式,为系统的默认设置。在此模式下,只有在某一帧中一个刚体的上方,而下一帧移动到了另一个刚体的下方,这样就会发生穿越现象。
Continuous:静态连续检测模式,一般用在高速运动刚体的目标碰撞体上,防止被穿越,检测强度比Discrete强
ContinuousDyamic:最强的连续动态检测模式,一般用在两个高速运动的物体上,防止互相穿越。其计算消耗最大,一般情况下慎用
总之,无论那种检测模式都有可能被穿越,为了防止穿越现象的发生,除了设置其碰撞检测模式外,还要适当增加两物体碰撞器的厚度,一般不要小鱼0.1,同时尽量降低两物体碰撞时的相对速度。
(3)代码实现
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CollisionDectionMode_test : MonoBehaviour
{
public Rigidbody A, B;
Vector3 v1, v2;
void Start()
{
A.useGravity = false;
B.useGravity = false;
v1 = A.position;
v2 = B.position;
}
void OnGUI()
{
if(GUI.Button(new Rect(10.0f,10.0f,200.0f,45.0f),"Discrete模式不被穿越"))
{
inists();
A.collisionDetectionMode = CollisionDetectionMode.Discrete;
B.collisionDetectionMode = CollisionDetectionMode.Discrete;
A.velocity = new Vector3(0.0f, -10.0f, 0.0f);
}
if (GUI.Button(new Rect(10.0f, 60.0f, 200.0f, 45.0f), "Discrete模式被穿越"))
{
inists();
A.collisionDetectionMode = CollisionDetectionMode.Discrete;
B.collisionDetectionMode = CollisionDetectionMode.Discrete;
A.velocity = new Vector3(0.0f, -40.0f, 0.0f);
}
if (GUI.Button(new Rect(10.0f, 110.0f, 200.0f, 45.0f), "Continuous模式不被穿越"))
{
inists();
A.collisionDetectionMode = CollisionDetectionMode.Continuous;
B.collisionDetectionMode = CollisionDetectionMode.Continuous;
A.velocity = new Vector3(0.0f, -20.0f, 0.0f);
}
if (GUI.Button(new Rect(10.0f, 160.0f, 200.0f, 45.0f), "Continuous模式被穿越"))
{
inists();
A.collisionDetectionMode = CollisionDetectionMode.Continuous;
B.collisionDetectionMode = CollisionDetectionMode.Continuous;
A.velocity = new Vector3(0.0f, -15.0f, 0.0f);
B.velocity = new Vector3(0.0f, 15.0f, 0.0f);
}
if (GUI.Button(new Rect(10.0f, 210.0f, 200.0f, 45.0f), "ContinuousDynamic模式"))
{
inists();
A.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic;
B.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic;
A.velocity = new Vector3(0.0f, -200.0f, 0.0f);
B.velocity = new Vector3(0.0f, 200.0f, 0.0f);
}
if (GUI.Button(new Rect(10.0f, 260.0f, 200.0f, 45.0f), "重置"))
{
inists();
}
}
//初始化A、B
void inists()
{
A.position = v1;
A.rotation = Quaternion.identity;
A.velocity = Vector3.zero;
A.angularVelocity = Vector3.zero;
B.position = v2;
B.rotation = Quaternion.identity;
B.velocity = Vector3.zero;
B.angularVelocity = Vector3.zero;
}
}
在这段代码中,首先声明了两个Rigidbody变量A、B和两个Vector3变量v1、v2,然后再Start方法中设置A、B的useGiavity属性为false,并将A、B的Position赋值给v1和v2,然后再OnGUI方法中定义了多个Button,用来演示Discrete、Continuous和ContinuousDynamic的功能。最后顶一个一个inists方法,用于重置变量A、B对应刚体的状态。
①新建一个Cube立方体,将C#脚本挂载在立方体上
②新建一个子立方体,选择添加一个组件,单击physics;弹出新的窗口,单击rigidbody(刚体)
③将变量A、B指定为Cube2、Cube3
④查看像真实的物体一样接受摩擦力和重力,还可以与其他物体发生相互碰撞效果