U1L13-4——物理系统之碰撞检测函数

碰撞检测函数

碰撞检测涉及到RigidBody​、Collider​、Physic Material,

  1. 如何让两个游戏物体之间产生碰撞(至少一个刚体 和 两个碰撞器)
  2. 如何让两个物体之间碰撞时表现出不同效果(物理材质)
  3. 触发器的作用是 让两个物体碰撞没有物理效果,只进行碰撞处理

请先掌握这些内容的必要知识

  1. 能够让两个游戏物体之间产生碰撞
  2. 能够让两个物体碰撞时表现出不同效果
  3. 能够通过代码检测到碰撞产生的不同阶段
  4. 能够使用触发器让两个物体相互穿透
  5. 能够通过代码检测到触发产生的不同阶段

注意:碰撞和触发响应函数 属于 特殊的生命周期函数 ** 也是通过反射调用**

本章代码关键字

1
2
3
4
5
6
7
8
9
10
11
void OnCollisionEnter(Collision collision) { }    //碰撞触发接触时会自动执行这个函数(函数名,函数参数的类型不可以改动)
collision.collider //碰撞到的对象碰撞器的信息
collision.gameObject //碰撞对象的依附对象(GameObject)
collision.transform //碰撞对象的依附对象的位置信息
collision.contactCount //触碰点数相关
ContactPoint[] pos = collision.contacts //接触点 具体的坐标
void OnCollisionStay(Collision collision) { } //碰撞结束分离时会自动执行这个函数(函数名,函数参数的类型不可以改动)
void OnCollisionExit(Collision collision) { } //两个物体相互接触摩擦时 会不停调用该函数
void OnTriggerEnter(Collider other) { } //触发开始的函数 当第一次接触时 会自动调用
void OnTriggerExit(Collider other) { } //触发结束的函数 当接触的状态结束时 会调用一次
void OnTriggerStay(Collider other) { } //持续触发的函数 当两个对象持续触发(结合)时 会一直调用

物理碰撞检测相应函数

Collision

当一个对象碰撞到一个对象,该对象就会在碰撞检测函数里作为传入参数,在函数里对其进行操作
只要得到了 碰撞到的对象的 任意一个信息 就可以得到它的所有信息

关键参数

  1. 碰撞到的对象碰撞器的信息:collision.collider
  2. 碰撞对象的依附对象(GameObject):collision.gameObject
  3. 碰撞对象的依附对象的位置信息:collision.transform
  4. 触碰点数相关:collision.contactCount
  5. 接触点 具体的坐标:ContactPoint[] pos = collision.contacts;

碰撞接触触发函数

碰撞触发接触时会自动执行这个函数(函数名,函数参数的类型不可以改动)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void OnCollisionEnter(Collision collision)
{
//Collision类型的参数包含了碰到自己对象的相关信息

//关键参数
//1、碰撞到的对象碰撞器的信息
//collision.collider
//2、碰撞对象的依附对象(GameObject)
//collision.gameObject
//3、碰撞对象的依附对象的位置信息
//collision.transform
//4、触碰点数相关
//collision.contactCount
//5、接触点 具体的坐标
//ContactPoint[] pos = collision.contacts;
//只要得到了 碰撞到的对象的 任意一个信息 就可以得到它的所有信息
print(this.name + "被" + collision.gameObject.name + "撞到了");
}

碰撞结束分离触发函数

碰撞结束分离时会自动执行这个函数(函数名,函数参数的类型不可以改动)

1
2
3
4
5
6
//碰撞结束分离时会自动执行这个函数(函数名,函数参数的类型不可以改动)
private void OnCollisionExit(Collision collision)
{
print(this.name + "与" + collision.gameObject.name + "结束碰撞了");
}

相互接触摩擦时一直触发函数

两个物体相互接触摩擦时 会不停调用该函数

1
2
3
4
5
//两个物体相互接触摩擦时 会不停调用该函数
private void OnCollisionStay(Collision collision)
{
print(this.name + "在和" + collision.gameObject.name + "接触摩擦");
}

触发器检测相应函数

Collider

当一个触发器碰撞到一个对象,该触发器就会在碰撞检测函数里作为传入参数,在函数里对其进行操作
只要得到了 碰撞到的对象的 任意一个信息 就可以得到它的所有信息
Collider​在碰撞检测函数里关键参数和Collision​差不多

触发开始的函数

触发开始的函数 当第一次接触时 会自动调用

1
2
3
4
private void OnTriggerEnter(Collider other)
{
print(this.name + "被" + other.gameObject.name + "触发了");
}

触发结束的函数

触发结束的函数 当接触的状态结束时 会调用一次

1
2
3
4
private void OnTriggerExit(Collider other)
{
print(this.name + "和" + other.gameObject.name + "分离了");
}

持续触发的函数

持续触发的函数 当两个对象持续触发(结合)时 会一直调用

1
2
3
4
private void OnTriggerStay(Collider other)
{
print(this.name + "和" + other.gameObject.name + "触发中");
}