【问题标题】:OverlapBoxAll 2d dont detect anythingOverlapBoxAll 2d 没有检测到任何东西
【发布时间】:2020-12-31 00:03:30
【问题描述】:

这个脚本应该检测到与 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

}

【问题讨论】:

    标签: unity3d 2d collision-detection game-physics


    【解决方案1】:

    改变

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

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

    【讨论】:

    • 仍然无法正常工作我尝试了该方法的所有变体,除了您回答:仅使用蒙版、蒙版和角度,仅使用角度,将蒙版更改为所有内容,将蒙版更改为无。我不知道还能做什么 ¿ 父母的层在任何形式上都很重要吗?
    • "父母的层在任何形式上都重要吗?";没有。
    • 那么您还有其他问题吗?我尝试更改碰撞矩阵的顺序并更改伤害框的层,但没有任何改变
    • 我不知道,但我建议你看看这个简单的视频youtube.com/watch?v=k4hr7-7ysCY&t=177s也许你会找到一些东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多