目录
一、碰撞器(Collider)与触发器(Trigger)
二、碰撞检测条件
三、碰撞事件与触发器事件,可以理解为特殊的生命周期函数。
四、讲讲如何选择
编辑
五、总结
一、碰撞/触发事件函数对照表
二、Collider 与 Collision 参数属性对照表
1. Collider 类参数(用于触发器事件)
2. Collision 类参数(用于碰撞事件)
三、结构体参数展开
1. ContactPoint(碰撞接触点)
2. Bounds(包围盒)
前面两篇文章中,我们详细的了解了,Rigidbody刚体,以及各种碰撞器相关的内容。同时我们也清楚了碰撞的条件:两个物体都必须有碰撞器,并且至少一个物体上面存在刚体。并回答了两个问题:如何让两个物体碰撞时产生不同的碰撞效果(设置他们的物理材质,两个物体身上的物理材质都要设置)触发器的作用是什么(让两个物体碰撞没有物理效果 只进行碰撞处理)
所以今天我们来看看有哪些和代码相关的内容以及前情回顾:
一、碰撞器(Collider)与触发器(Trigger)
 碰撞器
 作用:检测物体间的物理碰撞,并产生物理反馈(如反弹)。
 组件:Box Collider、Sphere Collider、Capsule Collider等。
 静态物体:无Rigidbody的碰撞器(如地面),用于阻挡动态物体。
触发器
 启用方式:勾选Collider组件的Is Trigger。
 行为:物体穿透时触发事件,无物理反馈(如收集金币)。
二、碰撞检测条件
 必要条件:
 两个物体均需附加Collider组件。
 至少一个物体附加Rigidbody组件(动态物体)。
 触发检测时,至少一个物体勾选Is Trigger。
三、碰撞事件与触发器事件,可以理解为特殊的生命周期函数。
碰撞事件(需关闭Is Trigger):
OnCollisionEnter(Collision other):碰撞开始时调用。
OnCollisionStay(Collision other):碰撞持续中每帧调用。
OnCollisionExit(Collision other):碰撞结束时调用。
相关参数Collision介绍:
Collision 类型参数存储了碰撞的详细信息,可通过其属性获取碰撞对象的关键数据:
other.gameObject
 作用:获取碰撞到的另一物体的 GameObject 引用。
 用途:用于判断碰撞对象身份(如标签、名称)、操作对方物体(如销毁、施加力)。
if (other.gameObject.CompareTag("Enemy")) {
    Destroy(other.gameObject); // 销毁敌人
}other.contactOffset
contactOffset 是一个 距离阈值,表示两个碰撞器之间生成接触点的最小间隔。
 默认值:0.01 米(在 Unity 的 Project Settings > Physics 中可全局修改)。
 单位:世界坐标系中的米(meters)。
当两个碰撞器的距离 小于等于 contactOffset 时,物理引擎会开始生成接触点(即触发碰撞事件)。
 若距离 大于 contactOffset,则不会触发碰撞事件。
other.contacts
 作用:获取碰撞接触点的数组(ContactPoint[])。这是一个结构体数组
 用途:计算碰撞位置或生成特效。 
Vector3 firstContactPoint = other.contacts[0].point; // 第一个接触点坐标
Instantiate(explosionEffect, firstContactPoint, Quaternion.identity);ContactPoint 结构体的核心属性
 point(坐标点)
 类型:Vector3
 作用:碰撞接触点的世界坐标系坐标。
 用途:在精确位置生成特效(如火花、弹痕)或计算受力点。
normal(法线方向)
 类型:Vector3
 作用:碰撞接触点的法线方向(垂直于碰撞表面的方向)。
 用途:计算反弹方向、滑动行为或伤害方向判定。
separation(分离距离)
 类型:float
 作用:两个碰撞器在接触点的分离距离(负数表示穿透深度)。
 用途:检测碰撞的剧烈程度(如穿透深度过大时触发特殊逻辑)。
thisCollider 与 otherCollider
 类型:Collider
 作用:
 thisCollider:当前脚本所在物体的碰撞器。
 otherCollider:对方物体的碰撞器。
 用途:区分碰撞器来源(如区分玩家身体的不同部位碰撞)。
other.impulse
 作用:获取碰撞的冲量(Vector3 类型)。
 用途:计算碰撞力度(如伤害值)。
float damage = other.impulse.magnitude * 0.1f;
health -= damage;other.collider
 存在替代方案:通过 other.gameObject.GetComponent<Collider>() 获取碰撞器。 
Collider collider = other.gameObject.GetComponent<Collider>();
if (collider != null) {
    collider.enabled = false; // 禁用对方碰撞器
}触发器事件(需启用Is Trigger):
 OnTriggerEnter(Collider other):进入触发器时调用。
 OnTriggerStay(Collider other):停留在触发器内时每帧调用。
 OnTriggerExit(Collider other):离开触发器时调用。
相关参数Collider的介绍
other.gameObject 和上面一样
 作用:获取触发器的所属 GameObject。
 用途:检测触发对象身份或操作触发物体。
if (other.gameObject.name == "HealthPack") {
    playerHealth += 20;
    Destroy(other.gameObject); // 拾取血包
}other.bounds
 作用:获取触发器的包围盒(Bounds 类型)。
 用途:计算触发器的尺寸或位置。
Vector3 triggerCenter = other.bounds.center; // 触发器中心坐标other.isTrigger
 作用:检查该碰撞器是否作为触发器使用。
 用途:避免误判非触发器物体。
if (other.isTrigger) {
    Debug.Log("触发了一个触发器对象");
}两个实例脚本:
(1)模拟子弹碰撞到一个物体上面:
private void OnCollisionEnter(Collision other) {
    if (other.gameObject.CompareTag("Enemy")) {
        // 获取敌人脚本并造成伤害
        Enemy enemy = other.gameObject.GetComponent<Enemy>();
        if (enemy != null) {
            enemy.TakeDamage(10);
        }
        
        // 在接触点生成爆炸特效
        ContactPoint contact = other.contacts[0];
        Instantiate(explosionPrefab, contact.point, Quaternion.identity);
        
        // 销毁子弹自身
        Destroy(gameObject);
    }
}(2)进入可以的传送区域
private void OnTriggerEnter(Collider other) {
    if (other.CompareTag("Player")) {
        // 获取玩家坐标并传送
        Vector3 teleportPosition = new Vector3(0, 5, 0);
        other.transform.position = teleportPosition;
        
        // 播放音效
        AudioSource.PlayClipAtPoint(teleportSound, transform.position);
    }
}四、讲讲如何选择
1.只要挂载的对象 能和别的物体产生碰撞或者触发 那么这六个函数就都能够被响应
 2.6个函数不是说我们都要写 我们一般是根据需求来进行选择书写
 3.如果是一个异形物体 刚体在父对象上 如果你想通过子对象上挂脚本检测碰撞是行不通的 必须挂载到这个刚体父对象上才行
 4.要明确 物理碰撞和触发器响应的区别
在下面可以决定哪些对象的碰撞情况,在 Unity 中,Layer Collision Matrix(层碰撞矩阵) 是一个用于控制不同层级(Layer)之间碰撞检测是否生效的核心工具。它的作用是通过选择性启用或禁用特定层之间的碰撞,优化物理计算性能,并实现特定交互逻辑。注意,最好对称的,
五、总结
一、碰撞/触发事件函数对照表
| 函数名 | 类型 | 触发条件 | 参数类型 | 用途 | 
|---|---|---|---|---|
| OnCollisionEnter | 碰撞事件 | 两物体碰撞开始时 | Collision | 处理碰撞开始逻辑(如伤害、音效) | 
| OnCollisionStay | 碰撞事件 | 两物体碰撞持续中每帧 | Collision | 处理持续接触逻辑(如摩擦音效) | 
| OnCollisionExit | 碰撞事件 | 两物体碰撞结束时 | Collision | 处理碰撞结束逻辑(如状态重置) | 
| OnTriggerEnter | 触发器事件 | 物体进入触发器范围时 | Collider | 处理触发开始逻辑(如拾取道具、传送) | 
| OnTriggerStay | 触发器事件 | 物体停留在触发器内每帧 | Collider | 处理持续触发逻辑(如持续治疗、区域伤害) | 
| OnTriggerExit | 触发器事件 | 物体离开触发器范围时 | Collider | 处理触发结束逻辑(如离开区域提示) | 
二、Collider 与 Collision 参数属性对照表
 
1. Collider 类参数(用于触发器事件)
 
| 属性/方法 | 类型 | 作用 | 示例 | 
|---|---|---|---|
| gameObject | GameObject | 获取触发器的所属对象 | if (other.gameObject.CompareTag("Player")) { ... } | 
| bounds | Bounds | 获取触发器的包围盒(包含中心、尺寸等) | Vector3 center = other.bounds.center; | 
| isTrigger | bool | 检查该碰撞器是否作为触发器 | if (other.isTrigger) { Debug.Log("触发的是触发器"); } | 
| contactOffset | float | 控制接触点生成的距离阈值(可全局或单独设置) | GetComponent<Collider>().contactOffset = 0.05f; | 
| attachedRigidbody | Rigidbody | 获取该碰撞器关联的刚体(若有) | Rigidbody rb = other.attachedRigidbody; | 
2. Collision 类参数(用于碰撞事件)
 
| 属性/方法 | 类型 | 作用 | 示例 | 
|---|---|---|---|
| gameObject | GameObject | 获取碰撞到的对方对象 | if (collision.gameObject.name == "Wall")) { ... } | 
| contacts | ContactPoint[] | 碰撞接触点数组(包含坐标、法线等) | Vector3 point = collision.contacts[0].point; | 
| impulse | Vector3 | 碰撞的冲量(力度和方向) | float force = collision.impulse.magnitude; | 
| collider(已过时) | Collider | 对方碰撞器(建议改用 gameObject.GetComponent<Collider>()) | Collider col = collision.gameObject.GetComponent<Collider>(); | 
三、结构体参数展开
1. ContactPoint(碰撞接触点)
 
| 属性 | 类型 | 作用 | 
|---|---|---|
| point | Vector3 | 接触点的世界坐标(用于特效生成) | 
| normal | Vector3 | 接触点法线方向(用于反弹计算) | 
| separation | float | 两碰撞器的分离距离(负数表示穿透深度) | 
| thisCollider | Collider | 当前脚本所在物体的碰撞器 | 
| otherCollider | Collider | 对方物体的碰撞器 | 
2. Bounds(包围盒)
 
| 属性 | 类型 | 作用 | 
|---|---|---|
| center | Vector3 | 包围盒中心坐标 | 
| size | Vector3 | 包围盒尺寸(长宽高) | 
| extents | Vector3 | 包围盒半尺寸( size / 2) | 
| min/max | Vector3 | 包围盒最小/最大角坐标 | 




















