Unity3D Physics2D.OverlapAreaNonAlloc奇怪的(bug?)行为与图层

时间:2015-10-22 14:05:21

标签: c# unity3d unity3d-2dtools

我遇到了Physics2D.OverlapAreaNonAlloc的一个奇怪的错误,并创建了一个测试项目来确认它。

场景:两个立方体在彼此的顶部,带有rigidbody2d和盒子对撞机,底部有一个运动学。最上面一个是“玩家”。

我想使用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   - 如果“播放器”图层是另一个图层,则不会检测到它。

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

1 个答案:

答案 0 :(得分:0)

在对Physics2D.OverlapAreaNonAlloc()的调用中使用LayerMask.GetMask()。

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