Question by
Evil-ProHack · Dec 30, 2020 at 11:45 PM ·
2dscripting problemphysics2dcollider2dhitbox
Problem with hitboxes and hurtboxes
This script should detect the collision with the colliders of the Hurtbox layer (using OverlapBoxAll)but it does not work I have the matrix layer configured well and the variables assigned in the inspector so I do not know what my error is.
My collision layer matrix 2d:
The scene and hierarchy:
The script:
public class Hitbox : MonoBehaviour
{
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;
}
}
public enum ColliderState
{
Closed,
Open,
Colliding
}
sin-titulo.png
(14.0 kB)
scene.png
(302.0 kB)
Comment