首页 > 解决方案 > OverlapBoxAll 2d 没有检测到任何东西

问题描述

这个脚本应该检测到与 Hurtbox 层的碰撞器的碰撞(使用 OverlapBoxAll)但它不起作用我已经配置好矩阵层并且在检查器中分配了变量,所以我不知道我的错误是什么。pd:碰撞发生在 HitboxUpdate 方法我的碰撞层矩阵 2d:

https://answers.unity.com/storage/temp/173342-sin-titulo.png

场景和层次:

https://answers.unity.com/storage/temp/173344-scene.png

剧本:

public string owner = "-1";
public Vector3 boxSize;
public Vector3 position;
public Quaternion rotation;

public LayerMask mask;
public bool useSphere = false;

public float radius = 0.5f;

public Color inactiveColor;

public Color collisionOpenColor;

public Color collidingColor;
private ColliderState _state;
// ignoreList = ds_List_create()
public float hitStun = 60;
private IHitboxResponder _responder = null;

// Update is called once per frame
void Update()
{
    HitboxUpdate();


}
public void StartCheckingCollision()
{
    _state = ColliderState.Open;

}

public void StopCheckingCollision()
{
    _state = ColliderState.Closed;

}


void OnDrawGizmos()
{
    // Draw a yellow sphere at the transform's position

    Debug.Log("draw hitbox gizmos");
    CheckGizmoColor();

    Gizmos.matrix = Matrix4x4.TRS(transform.position, transform.rotation, transform.localScale);
    if (useSphere)
    {
        Gizmos.DrawSphere(Vector3.zero, radius);         }
    else
    {

        Gizmos.DrawCube(position, new Vector3(boxSize.x * 2, boxSize.y * 2, boxSize.z * 2)); 
    }
}
private void CheckGizmoColor()
{
    switch (_state)
    {

        case ColliderState.Closed:

            Gizmos.color = inactiveColor;
            Debug.Log("Closed");
            break;

        case ColliderState.Open:

            Gizmos.color = collisionOpenColor;
            Debug.Log("Open");
            break;

        case ColliderState.Colliding:

            Gizmos.color = collidingColor;
            Debug.Log("colliding");
            break;

    }

}
public void HitboxUpdate()
{

    StartCheckingCollision();

    if (_state == ColliderState.Closed)
    {
        Debug.Log("Collider cloded");
        return;
    }
    Debug.Log("Collider  open hit");
    Collider2D[] colliders = Physics2D.OverlapBoxAll(position, boxSize, transform.eulerAngles.z ,mask);
    if (colliders.Length > 0)
    {
        _state = ColliderState.Colliding;
        Debug.Log("We hit something hitbox");
    }
    if (colliders.Length > 0)
    {
        for (int i = 0; i < colliders.Length; i++)
        {
            if (colliders[i].gameObject.GetComponent<Hurtbox>() != null)
            {
                if (colliders[i].gameObject.GetComponent<Hurtbox>().owner == owner)
                {
                    Debug.Log("collider skiped");

                    colliders = colliders.Skip(i).ToArray();
                }
            }
            Debug.Log("Hit " + colliders[i].gameObject.name);


        }
    }
    for (int i = 0; i < colliders.Length; i++)
    {
        Collider2D aCollider = colliders[i];
        Debug.Log("Works");
        _responder?.CollisionedWith(aCollider);

    }


    _state = colliders.Length > 0 ? ColliderState.Colliding : ColliderState.Open;


}
public void UseResponder(IHitboxResponder responder)
{
    _responder = responder;

}

} 公共枚举 ColliderState {

Closed,

Open,

Colliding

}

标签: unity3d2dcollision-detectiongame-physics

解决方案


改变

Collider2D[] colliders = Physics2D.OverlapBoxAll(position, boxSize, transform.eulerAngles.z ,mask);

Collider2D[] colliders = Physics2D.OverlapBoxAll(position, boxSize ,mask);


推荐阅读