Unity物理组件之刚体Rigidbody

一、刚体组件简介

1、刚体简介

刚体:Rigidbody,属于物理类组件

作用:添加了刚体组件的游戏物体,可以在物体系统的控制下来运动,刚体可接受外力和扭矩力用来保证游戏对象像在真实世界中那样进行运动。任何游戏对象只有添加了刚体组件才能受到重力的影响,通过脚本为游戏对象添加的作用力以及通过NVIDIA物体引擎与其他的游戏对象发生互动的运算都需要游戏对象添加了刚体组件。没有刚体(RigidBody)组件,游戏对象之间可以相互穿透,不会产生碰撞。

2、给物体添加刚体组件

选中游戏物体-->菜单Component-->Physics-->Rigidbody

二、刚体组件属性

Mass: 质量

定义:该项用于设置游戏对象的质量,也就是重量。质量单位是KG(建议在同一个游戏场景中,游戏对象之间的质量差值不要大于100倍)

Drag: 阻力

定义:当对象受力运动时受到的空气阻力。0表示没有空气阻力,阻力极大时游戏对象会立即停止运动

Angular Drag: 角阻力

定义:当对象受扭矩力旋转时受到的空气阻力。0表示没有空气阻力,阻力极大时游戏对象会立即停止运动

Use Gravity: 使用重力

定义:若开启此项,游戏对象会受到重力的影响

Is Kinematic: 是否开启动力学

定义:若开启此项,游戏对象将不再受物体引擎的影响从而只能通过Transform(几何变换组件)属性来对其操作。该方式适用于模拟平台的移动或带有铰链关节链接刚体的动画

Interpolate: 插值

定义:该项用于控制刚体运动的抖动情况,有3项可供选择。

None:没有插值

Interpolate:内插值。基于前一帧的Transform来平滑此次的Transform

Extrapolate:外插值。基于下一帧的Transform来平滑此次的Transform

Collision Detection: 碰撞检测

定义:该属性用于控制避免高速运动的游戏对象穿过其他的对象而未发生碰撞,有3项可供选择。

Discrete: 离散碰撞检测。该模式与场景中其他的所有碰撞体进行碰撞检测。该项为默认值。

Continuous:连续碰撞检测。该模式用于检测与动态碰撞体(带有Rigidbody)的碰撞,使用连续碰撞检测模式来检测与网络碰撞体的(不带Rigidbody)碰撞。其他的刚体会采用离散碰撞模式。此模式适用于那些需要与采用连续动态碰撞检测的对象相碰撞的对象。这对物理性能会有很大的影响,如果不需要对快速运动的对象进行碰撞检测,就使用离散碰撞检测模式。

Continuous Dynamic:连续动态碰撞检测模式。该模式用于检测与采用连续碰撞模式或连续动态碰撞模式对象的碰撞,也可用于检测没有Rigidbody的静态网格碰撞体。对于与之碰撞的其他对象可采用离散碰撞检测,动态连续碰撞检测模式也可用于检测快速运动的游戏对象。

Constrains: 约束

定义:该项用于控制对于刚体运动的约束。

Freeze Position:冻结位置。刚体对象在世界坐标系中的X、Y、Z轴方向上(勾选状态)的移动将无效。

Freeze Rotation:冻结旋转。刚体对象在世界坐标系中的X、Y、Z轴方向上(勾选状态)的旋转将无效。

 三、使用刚体移动物体

1.相关方法

Rigidbody.MovePosition(Vector3):使用刚体移动物体的位置。

使用刚体移动物体,物体是根据世界坐标系的方向移动的。 使用刚体移动物体,物体会触发物理相关的事件。

2.参数

MovePosition 中的 Vector3 要使用“当前位置”+ 方向 的方式。

Transform.Position:属性 当前物体的位置。

3.特点

使用刚体移动物体,特点如下:

①会于场景中的模型物体发生碰撞;

②会受重力影响(到达场景边缘外,会下落)

四、应用

1)创建游戏对象

创建 Cube 和 Plane 游戏对象,如下:

2)给 Cube 游戏对象添加刚体组件

选中 Cube 游戏对象,点击 Add Component 按钮,搜索 Rigidbody,添加刚体组件。

3)添加 RigidbodyMove脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RigidbodyMove : MonoBehaviour
{
	private Rigidbody m_rigidbody;
	private Transform m_transform;

	//Use this for initialization
	void Start(){
		m_rigidbody = gameObject.GetComponent<Rigidbody>();
		m_transform = gameObject.GetComponent<Transform>();

	}
	
	//Update is called once per frame
	void Update()
	{
		if (Input.GetKey(KeyCode.W))
		{
			m_rigidbody.MovePosition(m_transform.position + Vector3.forward * 0.2f);
		}

		if (Input.GetKey(KeyCode.S))
		{
			m_rigidbody.MovePosition(m_transform.position + Vector3.back * 0.2f);
		}

		if (Input.GetKey(KeyCode.A))
		{
			m_rigidbody.MovePosition(m_transform.position + Vector3.left * 0.2f);
		}

		if (Input.GetKey(KeyCode.D))
		{
			m_rigidbody.MovePosition(m_transform.position + Vector3.right * 0.2f);
		}

	}
  
}

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码

)">
< <上一篇
下一篇>>