unity碰撞检测代码
软件: unity
在Unity中,碰撞检测的实现依赖于物理引擎和特定的脚本方法。以下是几种常见的碰撞检测代码示例,涵盖2D和3D场景,以及物理碰撞与触发检测的区别:
1. 基础物理碰撞检测(3D)
条件:双方需有Collider组件,至少一方有Rigidbody组件。
代码示例:
using UnityEngine;
public class CollisionDetection3D : MonoBehaviour {
private void OnCollisionEnter(Collision collision) {
Debug.Log($"与 {collision.gameObject.name} 发生碰撞");
// 获取接触点信息
ContactPoint contact = collision.contacts[0];
Debug.DrawRay(contact.point, contact.normal, Color.red, 2f);
}
private void OnCollisionStay(Collision collision) {
Debug.Log($"持续碰撞中: {collision.gameObject.name}");
}
private void OnCollisionExit(Collision collision) {
Debug.Log($"碰撞结束: {collision.gameObject.name}");
}
}
说明:OnCollisionEnter在碰撞开始时调用一次,OnCollisionStay每帧调用,OnCollisionExit在碰撞分离时调用。
2. 触发检测(3D)
条件:至少一方勾选Collider的Is Trigger属性,且至少一方有Rigidbody。
代码示例:
private void OnTriggerEnter(Collider other) {
Debug.Log($"进入触发器: {other.gameObject.name}");
}
private void OnTriggerStay(Collider other) {

Debug.Log($"停留在触发器内: {other.gameObject.name}");
}
private void OnTriggerExit(Collider other) {
Debug.Log($"离开触发器: {other.gameObject.name}");
}
说明:触发器不会产生物理碰撞效果,常用于检测区域进入(如拾取道具)。
3. 2D碰撞检测
条件:使用Collider2D和Rigidbody2D组件。
代码示例:
private void OnCollisionEnter2D(Collision2D collision) {
if (collision.gameObject.CompareTag("Enemy")) {
Debug.Log("碰到敌人!");
}
}
private void OnTriggerEnter2D(Collider2D other) {
if (other.CompareTag("Coin")) {
Destroy(other.gameObject); // 拾取金币
}
}
注意:2D和3D的组件及方法不可混用(如OnCollisionEnter不适用于2D对象)。
4. 手动边界框检测(AABB算法)
适用场景:无需物理引擎的简单检测。
代码示例:
public class AABBCollision : MonoBehaviour {
public Transform obj1, obj2;
private bool CheckAABB() {
Bounds bounds1 = obj1.GetComponent().bounds;
Bounds bounds2 = obj2.GetComponent().bounds;
return bounds1.Intersects(bounds2);
}
void Update() {
if (CheckAABB()) Debug.Log("边界框重叠!");
}
}
说明:通过比较对象的包围盒(AABB)判断重叠,适合非物理交互。
5. 高级检测:射线检测
用途:检测鼠标点击或子弹命中。
代码示例:
void Update() {
if (Input.GetMouseButtonDown(0)) {
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit)) {
Debug.Log($"击中: {hit.transform.name}");
}
}
}
扩展:Physics.RaycastAll可检测所有命中对象。
关键注意事项
组件配置:
确保碰撞体和刚体组件正确附加,且层级在碰撞矩阵中启用交互。
性能优化:
避免使用复杂碰撞体(如MeshCollider),优先选择BoxCollider或SphereCollider。
2D/3D区分:
2D项目必须使用Collider2D和Rigidbody2D,对应方法名包含2D后缀(如OnCollisionEnter2D)。
更多高级技术(如分离轴定理SAT或物理材质设置)可参考Unity官方文档或上述源码示例。
1. 基础物理碰撞检测(3D)
条件:双方需有Collider组件,至少一方有Rigidbody组件。
代码示例:
using UnityEngine;
public class CollisionDetection3D : MonoBehaviour {
private void OnCollisionEnter(Collision collision) {
Debug.Log($"与 {collision.gameObject.name} 发生碰撞");
// 获取接触点信息
ContactPoint contact = collision.contacts[0];
Debug.DrawRay(contact.point, contact.normal, Color.red, 2f);
}
private void OnCollisionStay(Collision collision) {
Debug.Log($"持续碰撞中: {collision.gameObject.name}");
}
private void OnCollisionExit(Collision collision) {
Debug.Log($"碰撞结束: {collision.gameObject.name}");
}
}
说明:OnCollisionEnter在碰撞开始时调用一次,OnCollisionStay每帧调用,OnCollisionExit在碰撞分离时调用。
2. 触发检测(3D)
条件:至少一方勾选Collider的Is Trigger属性,且至少一方有Rigidbody。
代码示例:
private void OnTriggerEnter(Collider other) {
Debug.Log($"进入触发器: {other.gameObject.name}");
}
private void OnTriggerStay(Collider other) {

Debug.Log($"停留在触发器内: {other.gameObject.name}");
}
private void OnTriggerExit(Collider other) {
Debug.Log($"离开触发器: {other.gameObject.name}");
}
说明:触发器不会产生物理碰撞效果,常用于检测区域进入(如拾取道具)。
3. 2D碰撞检测
条件:使用Collider2D和Rigidbody2D组件。
代码示例:
private void OnCollisionEnter2D(Collision2D collision) {
if (collision.gameObject.CompareTag("Enemy")) {
Debug.Log("碰到敌人!");
}
}
private void OnTriggerEnter2D(Collider2D other) {
if (other.CompareTag("Coin")) {
Destroy(other.gameObject); // 拾取金币
}
}
注意:2D和3D的组件及方法不可混用(如OnCollisionEnter不适用于2D对象)。
4. 手动边界框检测(AABB算法)
适用场景:无需物理引擎的简单检测。
代码示例:
public class AABBCollision : MonoBehaviour {
public Transform obj1, obj2;
private bool CheckAABB() {
Bounds bounds1 = obj1.GetComponent
Bounds bounds2 = obj2.GetComponent
return bounds1.Intersects(bounds2);
}
void Update() {
if (CheckAABB()) Debug.Log("边界框重叠!");
}
}
说明:通过比较对象的包围盒(AABB)判断重叠,适合非物理交互。
5. 高级检测:射线检测
用途:检测鼠标点击或子弹命中。
代码示例:
void Update() {
if (Input.GetMouseButtonDown(0)) {
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit)) {
Debug.Log($"击中: {hit.transform.name}");
}
}
}
扩展:Physics.RaycastAll可检测所有命中对象。
关键注意事项
组件配置:
确保碰撞体和刚体组件正确附加,且层级在碰撞矩阵中启用交互。
性能优化:
避免使用复杂碰撞体(如MeshCollider),优先选择BoxCollider或SphereCollider。
2D/3D区分:
2D项目必须使用Collider2D和Rigidbody2D,对应方法名包含2D后缀(如OnCollisionEnter2D)。
更多高级技术(如分离轴定理SAT或物理材质设置)可参考Unity官方文档或上述源码示例。