注意:碰撞和触发响应函数 属于 特殊的生命周期函数 也是用过反射调用
物理碰撞检测响应函数
碰撞触发接触时 自动执行这个函数
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通过反射帮助我们自动调用