前言
本篇笔记用于记录唐老狮视频课程的学习心得。
刚体
碰撞产生的必要条件,两个物体都有碰撞器,至少一个物体有刚体。
RigidBody组件信息
参数 | 含义 |
Mass | 质量、惯性 |
Drag | 空气阻力,影响移动 |
Angular Drag | 扭矩阻力,影响旋转 |
Use Gravity | 是否受重力影响 |
is Kinematic | 如果启用,就不会受到力的作用, 只通过Transform移动 |
Interpolate | 差值运算,让移动更加平滑 |
Collision Detection | 碰撞检测模式,为了放置快速移动的物体穿过其他对象不被检测 |
Constrains | 约束对刚体运动的限制 |
碰撞器
3D碰撞器种类
碰撞器 | 性能 |
盒装 | 较好 |
球状 | 较好 |
胶囊 | 较好 |
网格 | 较差 |
轮胎 | 较差 |
地形 | 较差 |
共同参数
参数 | 含义 |
Edit Collider | 用于编辑碰撞器大小 |
Is Trigger | 触发器,启用后将忽略碰撞, 只用于触发事件 |
Material | 物理材质 |
Center | 中心点位置 |
异形物体使用多种碰撞器组合
刚体对象的子对象碰撞器信息参与碰撞检测
物理材质
创建物理材质
点击+号/右键Assets后Create->Physical Material
物理材质参数
参数 | 意义 |
Dynamic Friction | 已在移动时使用的摩擦力 |
Static Friction | 静止时在表面的摩擦力 |
Bounciness | 表面弹性 |
Friction Combine | 两个对象的摩擦力组合方式 |
unce Combine | 两个对象的弹性组合方式 |
碰撞检测函数
碰撞响应相关的函数也是在一个特殊的生命周期函数里面触发的,他是在FixUpdate之后,Update之前执行的。
Collision关键参数
参数 | 含义 |
collision.collider | 碰撞到的对象碰撞器信息 |
collision.gameObject | 碰撞对象的依附对象 |
collision.transform | 碰撞对象的依附对象的位置信息 |
collision.contactCount | 接触点的具体坐标 |
物理碰撞检测响应函数
函数名和参数是不可以修改的,但是参数名可以修改。
当两个物体碰撞时触发下面的函数。
private void OnCollisionEnter(Collision collision){
//逻辑
}
当两个物体离开时会触发下面的函数。
private void OnCollisionExit(Collision collision){
//逻辑
}
当两个物体持续摩擦式会触发下面的函数。
private void OnCollisionStay(Collision collision){
//逻辑
}
我们可以直接把碰撞的GameObject的信息点出来获得。
触发器检测函数
触发器和碰撞检测同理。
触发开始执行的函数。
private void OnTriggerEnter(Collider collider){
//逻辑
}
触发结束执行的函数。
private void OnTriggerExit(Collider collider){
//逻辑
}
触发保持时执行的函数。
private void OnTriggerStay(Collider collider){
//逻辑
}
刚体加力
我们可以直接通过点的方式来获取刚体,但是现在已经过时了,所以现在一般用获取脚本的 方法来获取刚体。
Rigidbody rigidbody;
rigidbody = GetComponent<Rigidbody>();
为刚体添加力
这个方向是相对于世界坐标系的方向的。
rigidbody.AddForce(Vector3.up);
这个方向是相对于本地坐标系的方向的。其实上面那个代码用transform.出来的方向也是本地坐标系的方向。
rigidbody.AddRelativeForce(Vector3.up);
添加扭矩力
这是相对于世界坐标系的方法的。
rigidbody.AddTorque(Vector3.up);
这是相对于本地坐标系的方向的。
rigidbody.AddRelativeTorque(Vector3.up);
直接改变速度
我们是修改velocity的值,这是一个Vector3的值,相对世界坐标系的值。
rigidbody.velocity = Vector3.forward;
模拟爆炸效果
我们通过AddExplosionForce函数来模拟爆炸效果。注意,他并不影响全局,只影响调用了这个方法的对象。
rigidbody.AddExplosionForce(10,Vector3.up, 10);
//rigidbody.AddExplosionForce(产生的力,爆炸中心,爆炸半径);
力的几种模式
其实我们会发现添加力的函数方法里面还有重载,其中就有用到ForceMode这个枚举类,
主要区别是计算方式不同。
参数 | 意义 |
ForceMode.Acceleration |
给物体一个持续的加速度 |
ForceMode.Force |
给物体一个持续的力 |
ForceMode.Impulse |
给物体一个瞬间的力,时间默认为1 |
ForceMode.VelocityChange |
给物体一个瞬间的速度 |
力场脚本
Untiy提供了一个脚本,可以一直持续一个力。
总结
文章仅用于学习使用,如果有错误请指出,一起进步,谢谢!