Esempio n. 1
0
    private bool FoundRaycastCollision(Vector2 direction)
    {
        if (direction == Vector2.zero)
        {
            return(false);
        }

        bool foundCollision = false;

        Vector3 newPosition = transform.position;

        Vector2[] origins  = GetOrigins(direction);
        float     distance = (Mathf.Abs((direction.x != 0f) ? velocity.x : velocity.y) * Time.fixedDeltaTime) + skinWidth;

        boxCol.enabled = false;

        for (int i = 0; i < origins.Length; i++)
        {
            RaycastHit2D hit = Physics2D.Raycast(origins[i], direction, distance, collisionMask);

            GizmoRay gizmoRay = new GizmoRay(origins[i], direction, distance, (direction.x != 0f) ? Color.red : Color.blue);
            gizmoDebugHandler.AddGizmoRay(gizmoRay);

            if (hit)
            {
                if (hit.distance == 0f)
                {
                    continue;
                }

                if (direction.x != 0f)
                {
                    velocity.x = ((hit.distance - skinWidth) * direction.x) / Time.fixedDeltaTime;
                }
                else
                {
                    if (direction.y < 0f)
                    {
                        newPosition.y = hit.point.y;
                    }
                    else
                    {
                        newPosition.y = hit.point.y - boxCol.size.y;
                    }

                    // velocity.y = (hit.distance - skinWidth) / Time.fixedDeltaTime;
                    velocity.y = 0f;
                }

                distance       = hit.distance;
                foundCollision = true;
            }
        }

        boxCol.enabled = true;

        transform.position = newPosition;

        return(foundCollision);
    }
Esempio n. 2
0
    private Vector2[] GetOrigins(Vector2 direction)
    {
        Vector2[] points = new Vector2[(direction.x != 0f) ?    Mathf.CeilToInt(boxCol.size.y / tileSize) + 1 :
                                       Mathf.CeilToInt(boxCol.size.x / tileSize) + 1];

        Bounds bounds = boxCol.bounds;

        bounds.Expand(-skinWidth * 2f);

        float pointOffset = (direction.x != 0f) ? bounds.size.y / (points.Length - 1) : bounds.size.x / (points.Length - 1);

        Vector2 origin = (Vector2)transform.position + boxCol.offset;

        if (direction.x != 0f)
        {
            origin += new Vector2(Mathf.Sign(direction.x) * bounds.extents.x, -bounds.extents.y);

            for (int i = 0; i < points.Length; i++)
            {
                points[i] = origin + Vector2.up * (pointOffset * i);

                float    dst      = skinWidth;
                Color    rayColor = Color.white;
                GizmoRay gizmoRay = new GizmoRay(points[i], Vector2.up, dst, rayColor);
                gizmoDebugHandler.AddGizmoRay(gizmoRay);
                gizmoRay = new GizmoRay(points[i], Vector2.right, dst, rayColor);
                gizmoDebugHandler.AddGizmoRay(gizmoRay);
                gizmoRay = new GizmoRay(points[i], Vector2.down, dst, rayColor);
                gizmoDebugHandler.AddGizmoRay(gizmoRay);
                gizmoRay = new GizmoRay(points[i], Vector2.left, dst, rayColor);
            }
        }
        else
        {
            origin += new Vector2(-bounds.extents.x, (Mathf.Sign(direction.y) < 0f) ?  -bounds.extents.y : bounds.extents.y);

            for (int i = 0; i < points.Length; i++)
            {
                points[i] = origin + Vector2.right * (pointOffset * i);

                float    dst      = skinWidth;
                Color    rayColor = Color.white;
                GizmoRay gizmoRay = new GizmoRay(points[i], Vector2.up, dst, rayColor);
                gizmoDebugHandler.AddGizmoRay(gizmoRay);
                gizmoRay = new GizmoRay(points[i], Vector2.right, dst, rayColor);
                gizmoDebugHandler.AddGizmoRay(gizmoRay);
                gizmoRay = new GizmoRay(points[i], Vector2.down, dst, rayColor);
                gizmoDebugHandler.AddGizmoRay(gizmoRay);
                gizmoRay = new GizmoRay(points[i], Vector2.left, dst, rayColor);
                gizmoDebugHandler.AddGizmoRay(gizmoRay);
            }
        }

        return(points);
    }
 public void AddGizmoRay(GizmoRay ray)
 {
     rays.Add(ray);
 }