碰撞检测——碰撞检测函数

物理碰撞检测相应的函数我们将通过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 + "触发了");
    }
}

猜你喜欢

转载自blog.csdn.net/qlxjs/article/details/127181958