You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中OnCollisionStay2D调用GetContacts无法获取全部碰撞对象求助

Unity中GetContacts仅返回单个碰撞对象的解决办法

核心问题分析

你遇到的情况通常有两个原因:

  1. 误用了Collision2D.GetContacts()而非Collider2D.GetContacts()
  2. 传入GetContacts()的数组长度不足,导致只填充了部分结果

解决方案1:获取当前所有碰撞对象(用Collider2D.GetContacts)

如果要拿到编辑器面板显示的全部碰撞对象,直接调用当前物体Collider2D的GetContacts方法,而不是OnCollisionStay2D参数里的碰撞信息。步骤如下:

  1. 先获取当前碰撞的总数量(传入空数组会返回总个数)
  2. 创建对应长度的数组,再调用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,提问作者Люда Генриховна

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:03:24