Untiy中物理系统之碰撞检测(笔记)

前言

        本篇笔记用于记录唐老狮视频课程的学习心得。

刚体

        碰撞产生的必要条件,两个物体都有碰撞器,至少一个物体有刚体。

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提供了一个脚本,可以一直持续一个力。

总结

        文章仅用于学习使用,如果有错误请指出,一起进步,谢谢!