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) {

unity碰撞检测代码

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官方文档或上述源码示例。

index-foot-banner-pc index-foot-banner-phone

点击一下 免费体验万千客户信任的许可优化平台

与100+大型企业一起,将本增效

与100+大型企业一起,将本增效

申请免费体验 申请免费体验