Unity中OnCollisionStay2D调用GetContacts无法获取全部碰撞对象求助
Unity中GetContacts仅返回单个碰撞对象的解决办法
核心问题分析
你遇到的情况通常有两个原因:
- 误用了
Collision2D.GetContacts()而非Collider2D.GetContacts() - 传入
GetContacts()的数组长度不足,导致只填充了部分结果
解决方案1:获取当前所有碰撞对象(用Collider2D.GetContacts)
如果要拿到编辑器面板显示的全部碰撞对象,直接调用当前物体Collider2D的GetContacts方法,而不是OnCollisionStay2D参数里的碰撞信息。步骤如下:
- 先获取当前碰撞的总数量(传入空数组会返回总个数)
- 创建对应长度的数组,再调用GetContacts填充结果
示例代码:
using UnityEngine; public class CollisionChecker : MonoBehaviour { private Collider2D _collider; void Start() { _collider = GetComponent<Collider2D>(); } void Update() { // 获取当前碰撞的总数量 int totalCollisions = _collider.GetContacts(new Collider2D[0]); // 创建对应长度的数组 Collider2D[] collisionColliders = new Collider2D[totalCollisions]; // 填充所有碰撞的Collider2D _collider.GetContacts(collisionColliders); // 遍历输出所有碰撞对象 foreach (var col in collisionColliders) { Debug.Log($"碰撞对象:{col.gameObject.name}"); } } }
解决方案2:用碰撞事件缓存所有当前碰撞对象
如果依赖OnCollision系列事件,也可以通过列表缓存进入/退出碰撞的对象,这样能实时跟踪所有当前碰撞的物体:
示例代码:
using UnityEngine; using System.Collections.Generic; public class CollisionTracker : MonoBehaviour { private List<Collider2D> _currentCollisions = new List<Collider2D>(); void OnCollisionEnter2D(Collision2D collision) { if (!_currentCollisions.Contains(collision.collider)) { _currentCollisions.Add(collision.collider); } } void OnCollisionExit2D(Collision2D collision) { _currentCollisions.Remove(collision.collider); } void Update() { Debug.Log($"当前碰撞数量:{_currentCollisions.Count}"); foreach (var col in _currentCollisions) { Debug.Log($"碰撞对象:{col.gameObject.name}"); } } }
关键注意事项
- 区分
Collision2D.GetContacts()和Collider2D.GetContacts():前者是单个碰撞对象的所有接触点,后者是当前Collider的所有碰撞对象。OnCollisionStay2D每帧会为每个碰撞对象触发一次,所以参数里的collision只对应单个对象的信息。 - 确保Collider2D未勾选
Is Trigger:触发碰撞会使用OnTrigger系列事件,无法通过OnCollisionStay2D或Collider2D.GetContacts获取碰撞信息。 - 检查Layer碰撞矩阵:确认两个对象的Layer在
Edit → Project Settings → Physics 2D的Layer Collision Matrix中是允许碰撞的。
内容的提问来源于stack exchange,提问作者Люда Генриховна
相关产品推荐
相关产品推荐

