unity3d # 160; Physics2D.OverlapAreaNonAlloc奇怪的(bug?)行为与层

本文关键字:bug Physics2D OverlapAreaNonAlloc unity3d | 更新日期: 2023-09-27 18:18:53

我遇到了一个奇怪的bug与物理2d。OverlapAreaNonAlloc,并创建了一个测试项目来确认它。

场景:两个立方体彼此顶部,具有rigidbody2d和box collider,底部一个是运动学的。最上面的是"Player"

我想使用Physics2D。OverlapAreaNonAlloc做一些敌人检测,所以我使用了一个代码,看起来像这样,我附加到玩家:

using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour {
    Vector2 pointA;
    Vector2 pointB;
    Collider2D[] enemies = new Collider2D[2];
    void Update () {
        //Enemy detection
        pointA = (Vector2)gameObject.transform.position - new Vector2(0.1f, 0f);
        pointB = (Vector2)gameObject.transform.position + new Vector2(0.1f, 0.1f);
        if (Physics2D.OverlapAreaNonAlloc(pointA, pointB, enemies, 9) > 0)
        {
            Debug.Log("first enemy :" + enemies[0].name);
        }
    }
}

9是敌人层的层数。场景中没有敌人,所以之前的代码不应该在我的主机上显示任何内容。可悲的是…

当我运行代码时,下面是发生的事情:-如果"Player"层是默认的,它会被我的Physics2D检测到。OverlapAreaNonAlloc-如果"Player"层是另一层,则不检测。

我不明白这个行为,"默认"应该是一个"超级"层,包含所有的层吗?

unity3d # 160; Physics2D.OverlapAreaNonAlloc奇怪的(bug?)行为与层

在调用Physics2D.OverlapAreaNonAlloc()时使用LayerMask.GetMask()

// "Enemy" represents the layer assigned to your enemies
Physics2D.OverlapAreaNonAlloc(pointA, pointB, enemies, LayerMask.GetMask("Enemy"))