1.Transform组件的运动特点
使用Transform字段.Translate();
方法移动物体的位置,特点如下:
①移动的物体若没有刚体组件,则会 直接“穿透” 场景中其他的物体模型;
②移动的物体若没有刚体组件,则物体不会受重力影响(到达场景边缘外,不会下落)。
③移动的物体若有刚体组件,则物体会受重力影响,偶尔会发生不规则运动和碰撞, 大部分情况下会直接“穿透” 场景中其他的物体模型。
因为Translate则是直接的位置position赋值,会破坏刚体环境。
而刚体方法则会模拟物理状态来达到一些接近于现实世界的物理效果。
2.刚体组件简介
刚体简介
刚体:Rigidbody,属于物理类组件。
作用: 添加了刚体组件的游戏物体,就有了重力,就会做自由落体运动。也就意味着可以像现实中的物体一样运动。给物体添加刚体组件
先选中游戏物体-->菜单Component-->Physics-->Rigidbody刚体组件属性
Inspector 面板中
属性 | 详情 |
---|---|
Mass[质量] | 设置物体的质量,也就是重量。质量单位是KG。 |
Drag[阻力] | 空气阻力,0 表示无阻力,值很大时物体会停止运动。 |
Angular Drag[角阻力] | 旋转时受到扭曲力时的空气阻力,0 表示无阻力,值很大时物体会停止运动。 |
Use Gravity[使用重力] | 是否使用重力。 |
角阻力测试方法:
将两个物体放置在空中,并且设置刚体,然后下方物体设置空气阻力为5,让其下降慢些。然后分两次设置角阻力为 0 和 10。会发现角阻力越大,碰撞后的物体旋转的速度越来越慢。
2.刚体的几个相关方法
2.1.MovePosition()
-
相关方法
Rigidbody字段.MovePosition( Transform字段.position + Vector3);
:使用刚体方法移动物体的位置。
但是由于 MovePosition 也是直接修改位置。所以速度过快还是会发生穿模。
注意: 同时该变量也要先被赋值
Rigidbody字段 = gameObject.GetComponent<Rigidbody>();
其次
使用刚体移动物体,物体是只能根据世界坐标系的方向移动的。
使用刚体移动物体,物体会触发物理相关的事件。
-
参数
MovePosition 中的 参数 要使用 “当前position”+ Vector3 的方式。
所以要先用Transform字段 = gameObject.GetComponent<Transform>();
获取并储存组件信息,再使用Transform字段.position
——属性当前物体的位置。
其中MovePosition()方法也可以用 Translate() 方法改变运动速度的格式来改变速度——*几倍
,其中 几倍 也不能为 double 。
-
特点
使用Rigidbody变量.MovePosition( Transform变量.position + Vector3.方向);
移动物体,特点如下:
①速度慢时会与场景中的物体发生碰撞。速度太快时,会直接穿透物体。
②MovePosition直接改的是位置。 所以还是会发生穿模现象。
③会模拟物理状态来达到一些接近于现实世界的物理效果。
④物体是只能根据 世界坐标系 的方向移动的。
⑤刚体要配合碰撞器使用
移动方式最好用加力的方式——AddForce方法
2.2.AddForce()
作用
给 刚体 施加一个力,让刚体按 “世界坐标系” 进行运动。代码
Rigidbody字段.AddForce(Vector3,ForceMode);
Vector3:力的方向和大小,也可以通过 * 几倍
改变力的大小;
ForceMode:力的模式[enum 类型]:一个枚举类型
-
ForceMode 参数
类型为枚举类型,以什么样的方式添加力给刚体。
枚举值说明:
枚举值 | 说明 |
---|---|
Acceleration | (加速度) |
Force:(力) | 这种模式通常用于设置真实的物理 |
Impulse:(冲击力) | 这种模式通常用于瞬间发生的力 |
VelocityChange | (速度的变化) |
2.3.AddRelativeForce()
作用
给刚体添加一个力,让刚体按 “自身坐标系” 进行运动。代码
Rigidbody字段.AddRelativeForce(Vector3,ForceMode);
Vector3:力的方向和大小,也可以通过 * 几倍
改变力的大小;
ForceMode:力的模式[enum 类型]。
-
AddRelativeForce()实例演示
编写下面这个脚本给一个Sphere 物体,运行并切换Scene 视图选中该物体,观察它的坐标系。
void Update()
{
m_Rigdbody.AddRelativeForce(Vector3.forward , ForceMode.Force);
}
因为物体是滚动前进的,所以自身坐标系会不断变化,使它来回滚动,由于力很小只有一倍,所以到最后几乎停止。(注意看蓝色的轴向最后垂直指向地板)
2.4.FixedUpdate()固定更新方法。
-
所有和物理相关的操作 ,代码都要写在 FixedUpdate() 方法体内。
固定默认的更新时间间隔是0.02 秒,1 秒执行50 次。
可以在 Fixed Timestep 中 修改, 步骤如下:
Edit-->Project Settings-->Time 面板中的 Fixed Timestep 参数设置。
而Update() 方法是每帧执行一次。
画面每渲染完一次,就是一帧,而每帧的时间是不固定的,因为画面渲染的速度是不固定的。
其次,若在 Update() 方法中执行物理操作,会出现卡顿的情况。