unity物理系统——碰撞检测

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

物理碰撞检测响应函数

碰撞触发接触时 自动执行这个函数 

private void OnCollisionEnter(Collision collision)
{
    // Collision类型的 参数 包含了 碰到自己的对象的相关信息

    // 关键参数
    // 1. 碰到的对象的碰撞器的信息
    // collision.collider

    // 2.碰到的对象的依附对象(GameObject)
    // collision.gameObject

    // 3.碰撞对象的依附对象的位置信息
    // collision.transform

    // 4. 触碰点数相关
    // collision.contactCount
    // 接触点 具体坐标
    // ContactPoint[] pos = collision.contacts;

    // 只要得到了 碰撞到的对象的 任意一个信息 就可以得到它的所有信息

    print(name + "被" + collision.gameObject.name + "碰到了");
}

碰撞结束分离时 会自动执行的函数

private void OnCollisionExit(Collision collision)
{
    print(name + "和" + collision.gameObject.name + "分离了");
}

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

private void OnCollisionStay(Collision collision)
{
    print(name + "一直在被" + collision.gameObject.name + "接触");
}

触发器检测响应函数

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

private void OnTriggerEnter(Collider other)
{
    Debug.Log("Component Name: " + other.name); // 这将打印 Collider 组件的名称  
    print(name + "被" + other.name + "触发");
}

触发结束的函数 当水乳相融的状态结束时 会调用一次

private void OnTriggerExit(Collider other)
{
    print(name + "离开了" + other.name + "结束了触发");
}

当两个对象 水乳相融时 会不停的调用

private void OnTriggerStay(Collider other)
{
    print(name + "和" + other.name + "处于水乳相融的状态");
}

要明确什么时候会响应函数

1. 只要挂载的对象 能和别的物体产生碰撞或着触发 那么对应的这6个函数 就能被响应
2. 6个函数不是说 我都得写 我们一般是根据需求来进行选择书写
3. 如果是一个异性物体,刚体在父对象上,如果你想通过子对象上挂载脚本检测碰撞时不行的 必须挂载到这个物体父对象上才行
4. 要明确 物理碰撞和触发响应的区别 

碰撞的触发器函数都可以写成虚函数 在子类去重写逻辑

一般会把想要重写的 碰撞和触发函数 写成保护类型的 ,没必要写成public 因为不会自己手动调用 ,都是unity通过反射帮助我们自动调用
 

猜你喜欢

转载自blog.csdn.net/m0_73113333/article/details/142881167