物理碰撞检测相应的函数我们将通过print函数来举例说明:
在VS code中,我们可以通过输入OnCollisionEnter,然后按Tab键来补全该函数结构,其他的函数也相同。
private void OnCollisionEnter(Collision collision) {
}
复制代码
如果我们想要碰撞触发接触时会自动执行的函数:
private void OnCollisionEnter(Collision collision) {
}
复制代码
如果我们想要碰撞结束分离时会自动执行的函数:
private void OnCollisionExit(Collision collision) {
}
复制代码
如果我们想要两个物体相互接触摩擦时会不停的调用的函数(这里要注意的是相对运动摩擦时会调用,只是静止接触可能并不会调用):
private void OnCollisionStay(Collision collision){
}
复制代码
触发器检测响应函数
值得一提的是,该函数在使用时,需要将碰撞器的is Trigger选项勾选。
如果我们想要触发开始的函数,当第一次接触时会自动调用:
private void OnTriggerEnter(Collider other){
}
复制代码
如果我们想要触发结束的函数,当水乳交融的状态结束时,会调用一次:
private void OnTriggerExit(Collider other) {
}
复制代码
如果我们想要当两个对象一直接触触发时,在水乳交融的时候会不停调用:
private void OnTriggerStay(Collider other) {
}
复制代码
我们在使用函数的时候,要明确什么时候会响应函数
1.只要挂载的物体能和别的物体产生碰撞或触发,那么对应的函数就能够被响应。
2.每个函数应当根据需求进行书写。
3.如果是一个组合物体,刚体父对象上没有碰撞器,但其子物体上有碰撞器的时候,在子物体上添加相关的脚本函数不会被触发,对其父对象添加脚本才会被触发。
4.要明确物理碰撞和触发器响应的区别。
我们一般会把想要重写的,碰撞和触发的函数都写成保护类型的,没有必要写成public类型,因为我们不会去自己手动调用,而是Unity通过反射帮助我们自动调用。
碰撞和触发器函数都可以写成虚函数在子类中被重写
举个例子:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson16 : MonoBehaviour
{
//注意:访问修饰符需要写成 protected,没必要写成public,因为不需要自己手动调用
protected virtual void OnTriggerEnter(Collider other)
{
print(this.name + "被" + other.gameObject.name + "触发了");
}
}