How to Develop a Game
Collider & Trigger
PublishDate: 2025-06-01 | CreateDate: 2025-06-01 | LastModify: 2025-06-01 | Creator:ljf12825

Unity中的碰撞体是物理系统的重要组成部分,负责定义游戏对象的形状以进行碰撞检测。简单来说,Collider是一个无形的边界,用于检测物体是否接触或重叠,从而触发碰撞事件和物理响应

什么是Collider

Collider是附加在游戏对象上的组件,用于告诉物理引擎这个对象的碰撞范围。Collider本身不会渲染形状,只是一个隐形的物理边界

常见的Collider类型

Collider和Rigidbody的关系

Collider Panel

Box Collider

BoxColliderPanel

CapsuleCollider

CapsuleColliderPanel

MeshCollider

MeshColliderPanel MeshCollider是Unity提供的一个基于Mesh的碰撞体组件,它允许你使用一个Mesh的集合外形作为碰撞体检测的形状
它可以让你的碰撞体检测看起来和你的物体一样精细

MeshCollider Convex使用注意事项

场景是否适合用 MeshCollider
地形、建筑(静态)非 Convex MeshCollider
可交互物体 + RigidbodyConvex MeshCollider
复杂模型 + TriggerConvex MeshCollider(前提是够简单)
移动物体 + 非 Convex不支持,会报错
高性能要求的游戏尽量少用 MeshCollider,建议用简化碰撞体代替

Terrian Collider

Wheel Collider

WheelColliderPanel

wheelCollider.motorTorque = 200f;
wheelCollider.brakeTorque = 500f;
wheelCollider.steerAngle = 30f;

使用WheelCollider

在车体下放置空 GameObject,添加 WheelCollider

设置合适的 RadiusSuspension

使用一个轮胎模型作为视觉轮子(但它自己不加 Collider)。

每帧用代码同步 WheelCollider.GetWorldPose() 更新轮胎模型位置旋转。

motorTorquebrakeTorquesteerAngle 控制车轮。

示例:同步轮子模型

public WheelCollider wheelCollider;
public Transform wheelModel;

void Update()
{
  Vector3 pos;
  Quaternion rot;
  wheelCollider.GetWorldPose(out pos, out rot);
  wheelModel.position = pos;
  wheelModel.rotation = rot;
}

对齐Collider和GameObject

要保证Collider与GameObject完全重合,要让Collider的Center对准模型的中心,并让他的Size或Radius匹配模型的尺寸

方法一:使用Mesh Renderer的Bounds手动对齐

1.选中GameObject
2.查看Inspector面板中的Mesh Renderer或Mesh Filter:

3.在Collider中手动设置

方法二:使用Unity自动对齐

在Inspector面板中,点击组件右上角的菜单->Reset
或删除后重新添加Box Collider,Unity会自动用Mesh尺寸初始化

注意:自动添加只对Unity支持的标志Mesh效果好,对导入模型FBX有时不准确

方法三:通过脚本自动匹配Mesh Bounds

using UnityEngine;

[RequireComponent(typeof(BoxCollider))]
public class FitColliderToMesh : MonoBehaviour
{
  void Start()
  {
    var mesh = GetComponent<MeshFilter>().sharedMesh;
    var bounds = mesh.bounds;

    var collider = GetComponent<BoxCollider>();
    collider.center = bounds.center;
    collider.size = bounds.size;
  }
}

注意:mesh.bounds是局部坐标系下的范围
如果模型被缩放,需要做缩放修正

检查是否重合的方法

1.Gizmo显示:Scene视图中选中物体,勾选Gizmo,可以看到Collider的框是否保住模型
2.调试代码验证接触:你可以在运行是打印Collider.contacts[0].point看碰撞点位置是否符合预期
3.把Mesh设成透明或关闭渲染,观察Collider是否贴合

Collider基类 API

常用属性

属性名说明
enabled是否启用该碰撞体,禁用后不参与碰撞检测。
isTrigger是否作为触发器(Trigger),开启后不阻挡,只触发事件。
attachedRigidbody关联的 Rigidbody 组件(如果有的话)。
bounds碰撞体的世界轴对齐包围盒(Bounds 类型)。
sharedMaterial物理材质,控制摩擦力和弹力。
material碰撞体当前使用的物理材质实例。
contactOffset碰撞体接触判定的偏移距离,影响物理碰撞的灵敏度。

常用方法

方法名说明
ClosestPoint(Vector3 position)返回碰撞体表面上距离指定点最近的点。
Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance)以射线检测碰撞体是否被击中,返回击中信息。
GetComponent<T>()获取挂载在同一GameObject上的组件(Collider继承自Component,所以可用此方法)。
OnCollisionEnter/OnTriggerEnter物理事件回调,不是Collider自带的方法,但Collider触发时会调用对应脚本方法。

事件相关
Collider本身没有事件接口,但它的物理交互会调用以下MonoBehaviour的回调方法

事件名触发条件
OnCollisionEnter(Collision collision)碰撞开始
OnCollisionStay(Collision collision)碰撞持续
OnCollisionExit(Collision collision)碰撞结束
OnTriggerEnter(Collider other)触发器进入
OnTriggerStay(Collider other)触发器持续
OnTriggerExit(Collider other)触发器离开

什么是Trigger

Trigger是Collider组件的一个特殊状态,用来检测物体的进入、停留和离开事件,但不会产生物理碰撞和响应
Trigger是Collider的感应区域模式

Trigger应用场景

注意事项

本模块仅讲Collider作为组件的使用,详细物理系统请参照:
Physics System