Unity物理组件之刚体Rigidbody

Posted @夜魅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
		

	
  

UNITY物理系统简介

UNITY_物理系统简单介绍

要有说服力的物理行为,游戏中的物体必须正确地加速,受到碰撞,引力和其他力量的影响。
Unity中实际上有两个独立的物理引擎:一个用于3D物理,另一个用于2D物理。两个引擎的主要概念是相同的(除了3D中的额外维度),但是它们是使用不同的组件实现的。例如,Rigidbody和Rigidbody2D。
笔者推荐阅读UNITY官方手册

物理概述

Rigidbody(刚体)

概述

在使用Unity中如果想要GO拥有重力,可以发生碰撞反馈等,那就必不可少需要添加一个组件Rigidbody。由于该组件代替了它本身的运动,所有不应该通过Transform来改变位置,旋转;相反应该使用forces来推动GO并让物理引擎计算结果。
Rigidbody组件拥有一个Is Kinematic的属性,该属性可以将其从引擎的控制中移除,从而可以用脚本控制GO的运动。注意:尽量不要使用脚本控制该属性的开关。

Sleeping

当刚体的速度远低于一个设定的最小线性速度时,物理引擎就会认为它陷入睡眠状态。此时,GO不会再次移动,直到它收到一个讯号。这种模式意味着处理器不会花费时间更新刚体状态。
可以使用WakeUp函数来唤醒GameObject。

Colliders(碰撞器)

Colliders组件为物理碰撞定义了一个物体的形状。它不需要完全符合GO的网格形状;事实上,大致相似在游戏中更加有效率。
UNITY中最简单的几种碰撞器: Box Collider, Sphere Collider 和Capsule Collider;2D碰撞器:Collider 2D 和 Circle Collider 2D。
有时候需要以组合的形式附加到物体上,这种形式可以保持较低的处理器开销,也增加一定的灵活性;但它们应该只有一个Rigidbody组件在父物体上。
那组合的碰撞器也不能满足我们的需求,这就需要 Mesh Collider;它可以精确的匹配对象的网格形状。但不要经常使用,它对性能的要求挺高。需要碰撞检测的时候可以把它设置为Convex,它一般被使用在几何图形上。
物体可以被单独添加一个碰撞器(可以没有刚体),不过一般这个物体是静态的。

Physics materials(物理材质)

物体之间相互碰撞的时候,物体表面会模拟它身上材质的属性,比如冰块,篮球等;物体的摩擦系数,弹性系数可以用物理材质来配置。

Triggers(触发器)

通过脚本可以通过OnCollisionEnter启动检测什么时候发生的碰撞,也可以通过修改碰撞器上Is Trigger,来启动是否需要碰撞检测。启动之后会允许碰撞物体穿过,穿过的时候将调用物体脚本的OnTriggerEnter函数。

碰撞函数

Is Trigger = false
OnCollisionEnter  //碰撞第一次调用  
OnCollisionStay   //保持碰撞中调用  
OnColliosionExit  //退出碰撞时调用

Is Trigger = true
OnTriggerEnter  //进入触发器
OnTriggerStay   //停留触发器
OnTriggerExit   //离开触发器

碰撞相互作用

静态碰撞(没有刚体)

静态的物体且拥有碰撞器,没有刚体;不要轻易在游戏的过程中使用它们,会给你带来意想不到的效果(占用额外性能)。

刚体碰撞

有碰撞器和刚体的物体,可以对来自脚本的添加力做出反应;最常见。

运动学刚体碰撞

有碰撞器和刚体组件的物体,开启了IsKinematic;可以通过Transform来变换。它应该用于偶尔使用的物体,比如滑动门。
也可以实时切换IsKinematic属性在正常和运动行为之间切换;比如人物,一般使用动画来控制它,这时是要使用运动学的;而发生爆炸的时候,被炸碎的四肢,可以切换为非运动学来模拟出更好的效果。

Joints

可以使用各种Joint组件将两个物体进行链接,比如一个物体围绕另一个静态物体旋转。还可以做类似弹簧,绳子的效果。
特殊效果:
当施加的力大于这个值的时,可以设置一个关节断开。
关节之间可以产生驱动力,使其自动运动。

Character Controllers(角色控制器)

为第一人称或第三人称游戏中的角色做基于碰撞的物理特性。不能穿过静态碰撞物体;可以利用它设置物体的速度和方向等。

Physics Debug Visualization(可视化物理调试工具)

可视化物理调试允许您快速检查场景中的碰撞几何,并分析常见的物理场景。它提供了哪些GameObjects应该和不应该相互碰撞的可视化。当场景中有许多Colliders,或者Render和Collision Meshes不同步时,这是特别有用的。

打开方式:
Windows -->  Physics Visualization

属性 功能
Reset 单击此按钮将“物理调试”窗口重置为默认设置。
Hide Layers 使用下拉菜单确定是否从所选图层显示Colliders
Hide Static Colliders 选中此复选框以从可视化文件中移除静态碰撞图(不带有刚体组件的碰撞图)。
Hide Triggers 选中此复选框以从可视化文件中删除也是触发器的Colliders。
Hide Rigidbodies 选中此复选框以从可视化文件中移除Rigidbody组件。
Hide Kinematic Bodies 选中此复选框可从可视化文件中删除具有运动学刚体组件(不受物理引擎控制)的碰撞体。
Hide Sleeping Bodies 选中此复选框可从可视化文件中删除带有Sleeping Rigidbody组件(目前不与物理引擎相关)的Colliders 。
Collider Types 使用这些选项从物理可视化中移除特定的碰撞器类型。
Hide BoxColliders 选中此复选框可从可视化文件中删除Box Colliders。
Hide SphereColliders 选中此复选框可从可视化中删除“ Sphere Colliders ”。
Hide CapsuleColliders 选中此复选框可从可视化文件中移除Capsule Colliders。
Hide MeshColliders (convex) 选中此复选框可从可视化中删除凸面 网格碰撞器。
Hide MeshColliders (concave) 选中此复选框可从可视化中删除凹面 网格碰撞体。
Hide TerrainColliders 选中此复选框可从可视化文件中删除Terrain Colliders。
Hide None 单击隐藏无清除所有过滤标准并显示可视化中的所有对撞机类型。
Hide All 点击全部隐藏以启用所有过滤器,并从可视化文件中删除所有的碰撞器类型。
Colors 使用这些设置来定义Unity如何在可视化中显示物理组件。
Static Colliders 使用此颜色选择器可以定义哪种颜色指示可视化中的静态碰撞体(不带刚体组分的碰撞体)。
Triggers 使用此颜色选择器可以定义哪种颜色表示可视化中的“Trigger”的“Collision”。
Rigidbodies 使用此颜色选择器来定义哪种颜色表示可视化中的Rigidbody组件
Kinematic Bodies 使用此颜色选择器来定义哪种颜色表示可视化中的运动学刚体组件(不受物理引擎控制)。
Sleeping Bodies 使用此颜色选择器来定义哪种颜色表示可视化中的Sleeping Rigidbody组件(目前不与物理引擎相关)。
Variation 使用滑块设置0到1之间的值。这将定义您选择的颜色与随机颜色的混合程度。使用它可以通过颜色在视觉上分离Colliders,并查看GameObjects的结构
Rendering 使用这些设置来定义Unity如何呈现和显示物理可视化。
Transparency 使用滑块将值设置为0和1.这将定义可视化中绘制的碰撞几何的透明度。
Force Overdraw 普通的渲染几何图形有时可以遮挡Colliders(例如,地板下面的Mesh Collider平面)。选中Force Overdraw复选框,使可视化渲染器在渲染几何图形上绘制Collider几何图形。
View Distance 使用此设置可视化的视图距离。
Terrain Tiles Max 使用此设置可视化中最大的地形图块数量

属性 功能
Collision Geometry 选中此复选框以启用碰撞几何可视化。
Mouse Select 选中此复选框以启用鼠标悬停突出显示和鼠标选择。如果在Scene中有大的GameObjects互相阻塞,这可能很有用。

总结

可视化物理调试工具主要用来分析和排除游戏中物理活动的故障。最推荐使用:

  • To see active Rigidbody components only:要仅查看处于活动状态并因此使用CPU / GPU资源的Rigidbody组件,请勾选隐藏静态碰撞物体并隐藏睡眠模式的物体。
  • To see non-convex Mesh Colliders only:非凸(基于三角形)的Mesh Collider在其附着的刚体组件非常接近与另一个刚体或碰撞物体碰撞时倾向于产生最多的接触。要只显示非凸网格物体碰撞体,将窗口设置为显示选定物体模式,点击Select None按钮,然后勾选Show MeshColliders(凹面)复选框。

知识共享许可协议
作品繁星陨辰采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。

以上是关于Unity物理组件之刚体Rigidbody的主要内容,如果未能解决你的问题,请参考以下文章

Unity 3D学习笔记三十六:物理引擎——刚体

unity物理引擎浅谈

Unity物理系统物理系统相关组件

Unity Rigidbody2D 手册

Unity 物理系列五 关节

2022-04-20 Unity入门7——物理系统之碰撞检测